作者:雲魄,阿裡雲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技術交流社群公衆号,微信掃一掃關注