在使用 Kerberos 時,在本地網路配送使用者資訊 (如使用者 ID、群組、主目錄等) 的方式之一為使用 LDAP。必須要有強力的驗證機制以避免封包欺騙和其他攻擊。解決方案之一是也使用 Kerberos 進行 LDAP 通訊。
OpenLDAP 透過 SASL (簡單驗證工作階段層) 執行大部分驗證類別。SASL 基本上是為了驗證所設計的網路通訊協定。在 中使用的 SASL 執行方式是 cyrus-sasl,支援許多不同的驗證類別。Kerberos 驗證透過 GSSAPI (一般安全性 API,General Security Services API) 執行。根據預設,未安裝 GSSAPI 的 SASL 外掛程式。可使用 rpm -ivh cyrus-sasl-gssapi-*.rpm 手動安裝。
若要啟用 Kerberos 以繫結到 OpenLDAP 伺服器,請建立 ldap/earth.sample.com
主體,並將它新增到 keytab。
根據預設,LDAP 伺服器 slapd 以 ldap
使用者和群組身份執行,而只有 root
使用者可讀取 keytab 檔案。因此,可變更 LDAP 組態使伺服器以 root
使用者執行,或讓群組 ldap
可讀取 keytab 檔案。若將 /etc/sysconfig/openldap
中的 OPENLDAP_KRB5_KEYTAB
變數中指定 keytab 檔案,並將 OPENLDAP_CHOWN_DIRS
變數設為預設值 yes
,則會由 OpenLDAP 的啟動程序檔 (/etc/init.d/ldap
) 完成後者。若 OPENLDAP_KRB5_KEYTAB
留空,則會使用 /etc/krb5.keytab
中的 keytab,且您必須如下調整自己的權限。
若要以 root
使用者身份執行 slapd,請編輯 /etc/sysconfig/openldap
。將註解字元放在 OPENLDAP_USER
和 OPENLDAP_GROUP
變數的前面可將變數停用。
若要讓群組 LDAP 可讀取 keytab 檔案,請執行
chgrp ldap /etc/krb5.keytab chmod 640 /etc/krb5.keytab
第三或許也是最好的解決方案,就是讓 OpenLDAP 使用特殊的 keytab 檔案。若要這麼做,請啟動 kadmin,新增主體後輸入下列指令 ldap/earth.example.com:
ktadd -k /etc/openldap/ldap.keytab ldap/earth.example.com@EXAMPLE.COM
接著在外圍程序中執行:
chown ldap.ldap /etc/openldap/ldap.keytab chmod 600 /etc/openldap/ldap.keytab
若要告知 OpenLDAP 使用不同的 keytab 檔案,要在 /etc/sysconfig/openldap
中變更下列變數:
OPENLDAP_KRB5_KEYTAB="/etc/openldap/ldap.keytab"
最後,使用 rcldap restart
重新啟動 LDAP 伺服器。
現在您應該可使用具 Kerberos 自動驗證的工具,如 ldapsearch。
ldapsearch -b ou=people,dc=example,dc=com '(uid=newbie)' SASL/GSSAPI authentication started SASL SSF: 56 SASL installing layers [...] # newbie, people, example.com dn: uid=newbie,ou=people,dc=example,dc=com uid: newbie cn: Olaf Kirch [...]
如您所見,ldapsearch 會列印訊息表示它啟動了 GSSAPI 驗證。下一個訊息相當難以理解,但是它顯示了安全性強度因數 (簡稱 SSF) 是 56。(56 是個任意值。選擇它最可能的原因是它是 DES 加密金鑰的位元數。)它告訴您的是 GSSAPI 驗證成功,已使用加密來提供 LDAP 連線的完整性保護和機密保護。
在 Kerberos 中,驗證永遠為互相的。這表示您不僅要對 LDAP 伺服器驗證您自己,LDAP 伺服器也需要對您驗證。特別地,這代表與想要的 LDAP 伺服器通訊,而不是攻擊者所設定的假服務。
現在,可允許每一個使用者修改其 LDAP 使用者記錄的登入外圍程式屬性。假設您有一個配置,在其中使用者 joe
的 LDAP 項目位於 uid=joe,ou=people,dc=example,dc=com
,請在 /etc/openldap/slapd.conf
中設定下列存取控制:
# This is required for things to work _at all_ access to dn.base="" by * read # Let each user change their login shell access to dn="*,ou=people,dc=example,dc=com" attrs=loginShell by self write # Every user can read everything access to * by users read
第二個敘述句給授權的使用者對於所擁有的 LDAP 項目之 loginShell
屬性的寫入存取權。第三個敘述句給所有授權的使用者對整個 LDAP 目錄的讀取存取權。
整個機制還少一個步驟 — LDAP 伺服器如何確定 Kerberos 使用者 joe@EXAMPLE.COM
對應到 LDAP 可辨識名稱 uid=joe,ou=people,dc=example,dc=com
。這種對應必須使用 saslExpr
指示詞手動設定。在此範例中,新增下列到 slapd.conf
:
authz-regexp uid=(.*),cn=GSSAPI,cn=auth uid=$1,ou=people,dc=example,dc=com
若要了解其運作方式,您必須知道當 SASL 驗證使用者時,OpenLDAP 從 SASL 給它的名稱 (如 joe
) 和 SASL 類別的名稱 (GSSAPI
) 形成可辨識名稱。結果會是 uid=joe,cn=GSSAPI,cn=auth
。
如果已經設定 authz-regexp
,它會使用第一個引數做為一般表示式來檢查從 SASL 資訊形成的 DN。如果符合此一般表示式,名稱會以 authz-regexp
敘述句的第二個引數取代。$1
保留字元以符合 (.*)
表示式的子字串取代。
可能有更複雜的符合表示式。如果您的目錄結構更複雜,或者配置中的使用者名稱不是 DN 的一部分,甚至可以使用搜尋表示式來將 SASL DN 對應到使用者 DN。