作者:云魄,阿里云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
,例如
文件末尾新添加如下内容
[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
执行命令slapcat -b "dc=example,dc=com"
,在OpenLDAP中可以查到该dn
可以使用如下命令查看非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氛围,欢迎钉钉扫码加入!
对开源大数据和感兴趣的同学可以加小编微信(下图二维码,备注“进群”)进入技术交流微信群。
Apache Spark技术交流社区公众号,微信扫一扫关注