使用 LDAP 與 Kerberos

在使用 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_USEROPENLDAP_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 伺服器。

以 LDAP 使用 Kerberos 驗證

現在您應該可使用具 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 伺服器通訊,而不是攻擊者所設定的假服務。

Kerberos 驗證與 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。