天天看點

Kerberos使用OpenLDAP作為backend1.前置2.添加schema3.添加kadmin、krb5kdc賬戶4.設定kerberos5.測試

作者:雲魄,阿裡雲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作為backend1.前置2.添加schema3.添加kadmin、krb5kdc賬戶4.設定kerberos5.測試

檔案末尾新添加如下内容

[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作為backend1.前置2.添加schema3.添加kadmin、krb5kdc賬戶4.設定kerberos5.測試

slapcat -b "dc=example,dc=com"

,在OpenLDAP中可以查到該dn

Kerberos使用OpenLDAP作為backend1.前置2.添加schema3.添加kadmin、krb5kdc賬戶4.設定kerberos5.測試

可以使用如下指令檢視非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作為backend1.前置2.添加schema3.添加kadmin、krb5kdc賬戶4.設定kerberos5.測試

對開源大資料和感興趣的同學可以加小編微信(下圖二維碼,備注“進群”)進入技術交流微信群。

Kerberos使用OpenLDAP作為backend1.前置2.添加schema3.添加kadmin、krb5kdc賬戶4.設定kerberos5.測試

Apache Spark技術交流社群公衆号,微信掃一掃關注

Kerberos使用OpenLDAP作為backend1.前置2.添加schema3.添加kadmin、krb5kdc賬戶4.設定kerberos5.測試