Kerberos使用OpenLDAP作为backend

作者:云魄,阿里云E-MapReduce 高级开发工程师,专注于流式计算,Spark Contributor,开源爱好者


本文介绍Kerberos对接OpenLDAP, 使用OpenLDAP作为principal数据库。

1.前置

  • 操作系统为Centos
  • 安装OpenLDAP,并设置了管理员账户和相关的组,可参考OpenLDAP官网

例如ldap的host为localhost,port为10389,添加的管理账户的dn为cn=Manager,dc=example,dc=com

  • 安装Kerberos5

2.添加schema

如果已经添加过,忽略该步骤

2.1添加kerberos schema

以krb5-server-ldap-1.15.1版本为例做说明

  • 获取kerberos.schema

通常kerberos.schema和kerberos.ldif位于路径

/usr/share/doc/krb5-server-ldap-1.15.1

如果该路径下没有,执行

yum install krb5-server-ldap
  • 生成kerberos.ldif

OpenLDAP无法识别/usr/share/doc/krb5-server-ldap-1.15.1中的kerberos.ldif,需要重新生成。例如在/root/tmp下生成

cp /usr/share/doc/krb5-server-ldap-1.15.1/kerberos.* /etc/openldap/schema/
echo "include /etc/openldap/schema/kerberos.schema" > /root/tmp/schema_convert.conf
slaptest -f /root/tmp/schema_convert.conf -F /root/tmp

编辑生成的/root/tmp/cn=config/cn=schema/cn={0}kerberos.ldif文件,将其中的

dn: cn={0}kerberos
cn: {0}kerberos

替换为

dn: cn=kerberos,cn=schema,cn=config
cn: kerberos

去掉结尾的

structuralObjectClass: olcSchemaConfig
entryUUID: ...
creatorsName: cn=config
createTimestamp: ...
entryCSN: ...
modifiersName: cn=config
modifyTimestamp: ...

添加kerberos.schema

ldapadd -Y EXTERNAL -H ldapi:/// -f /root/tmp/cn=config/cn=schema/cn={0}kerberos.ldif

2.2添加其他schema

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

3.添加kadmin、krb5kdc账户

3.1创建kadmin、krb5kdc账户

以添加kadmin为例,addkadmin.ldif如下

dn: cn=krbadmin,dc=example,dc=com
cn: krbadmin
sn: krbadmin
objectClass: inetOrgPerson
userPassword: ${password}
uid: krbadmin

其中,${password}为账户密码,根据实际设置
执行命令

ldapadd -H ldap://localhost:10389 -D cn=Manager,dc=example,dc=com -f addkadmin.ldif

3.2设置权限

addaccess.ldif如下

dn: olcDatabase={2}hdb,cn=config
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange,krbPrincipalKey by dn.exact="cn=Manager,dc=example,dc=com" write by dn.exact="cn=krbadmin,dc=example,dc=com" write by dn.exact="cn=krb5kdc,dc=example,dc=com" read  by self =xw by anonymous auth by * none
-
add: olcAccess
olcAccess: {1}to * by dn.exact="cn=Manager,dc=example,dc=com" write by dn.exact="cn=krbadmin,dc=example,dc=com" write by dn.exact="cn=krb5kdc,dc=example,dc=com" read by self read by users read by * none

执行命令

ldapmodify -Y EXTERNAL -H ldapi:/// -f addaccess.ldif

4.设置kerberos

4.1生成stash文件

例如在/root下生成ldap.stash文件

kdb5_ldap_util stashsrvpw -f /root/ldap.stash "cn=krbadmin,dc=example,dc=com"
kdb5_ldap_util stashsrvpw -f /root/ldap.stash "cn=krb5kdc,dc=example,dc=com"

4.2配置kerberos

  • 将其中的EXAMPLE.COM替换为真实的域名。此处以EXAMPLE.COM做说明
  • 添加database_module

在[realms]下添加database_module = LDAP,例如

Kerberos使用OpenLDAP作为backend


文件末尾新添加如下内容

[dbdefaults]
        ldap_kerberos_container_dn = cn=krbContainer,dc=example,dc=com

[dbmodules]
        LDAP = {
                db_library = kldap
                ldap_kdc_dn = "cn=krb5kdc,dc=example,dc=com"
                ldap_kadmind_dn = "cn=krbadmin,dc=example,dc=com"
                ldap_service_password_file = /root/ldap.stash
                ldap_servers = ldapi:/// ldap://localhost:10389
                ldap_conns_per_server = 5
        }

4.3创建realm

执行如下命令

kdb5_ldap_util -D  cn=krbadmin,dc=example,dc=com create -subtrees dc=example,dc=com -r EXAMPLE.COM -s -H ldap://localhost:10389

4.3启动kerberos

systemctl start krb5kdc kadmin

如已启动,需重启krb5kdc和kadmin。

5.测试

在kadmin.local中添加kerberos principal,例如添加test

Kerberos使用OpenLDAP作为backend

执行命令slapcat -b "dc=example,dc=com",在OpenLDAP中可以查到该dn

Kerberos使用OpenLDAP作为backend

可以使用如下命令查看非kerberos uid

ldapsearch -w xxx -D "cn=Manager,dc=example,dc=com" -H ldap://localhost:10389 -b dc=example,dc=com '(&(!(krb5PrincipalName=))(uid=))' | grep 'dn: uid=.,dc=example,dc=com' | sed 's/dn: uid=(.),dc=example,dc=com/1/g'

阿里巴巴开源大数据技术团队成立Apache Spark中国技术社区,定期推送精彩案例,技术专家直播,问答区近万人Spark技术同学在线提问答疑,只为营造纯粹的Spark氛围,欢迎钉钉扫码加入!

Kerberos使用OpenLDAP作为backend

对开源大数据和感兴趣的同学可以加小编微信(下图二维码,备注“进群”)进入技术交流微信群。
Kerberos使用OpenLDAP作为backend

Apache Spark技术交流社区公众号,微信扫一扫关注

Kerberos使用OpenLDAP作为backend

上一篇:《大数据分析原理与实践》——3.3 相关分析


下一篇:马云:想在未来拿高薪 就去做与数据分析相关的工作