為目錄伺服器配置 Kerberos 有時是很複雜的作業。您應以 Kerberos 文件做為首要參考資料。
如需更多說明,請以下列範例程序評估所應執行的步驟。但請注意,此程序僅是範例。您必須根據本身的配置與環境,適當地修改此程序。
如需有關在 Solaris 作業系統中配置及使用 Kerberos 的更多資訊,請參閱「System Administration Guide: Security Services」。此指南是 Solaris 文件集的一部分。您也可以參考線上手冊。
此範例與前述步驟的相關資訊如下:
此範例中的程序說明如何將一部機器配置成為金鑰分配中心 (KDC),並將另一部機器配置成執行目錄伺服器的機器。完成此程序後,使用者即可透過 GSSAPI 執行 Kerberos 認證。
在同一部機器上可同時執行 KDC 與目錄伺服器。若選擇在同一部機器上同時執行兩者,請使用相同的程序,但可在目錄伺服器機器的步驟中省略已對 KDC 機器執行過的部分。
此程序對於所使用的環境有許多相關假設。使用範例程序時,請根據您的環境適當地修改其值。這些假設包含:
此系統安裝了全新的 Solaris 9 軟體,以及最新的建議修補程式叢集。若未安裝適當的 Solaris 修補程式,目錄伺服器的 Kerberos 認證即可能失敗。
請注意,此處所列之程序雖然大致與 Solaris 10 的程序相同,但仍有某些不同之處。配置檔的格式略有不同,某些指令的輸出也可能不同。
執行 Kerberos 常駐程式的機器具有 kdc.example.com 完全合格的網域名稱。此機器必須配置成以 DNS 做為命名服務。Kerberos 必須進行此配置。若改用其他如 file 的命名服務,特定作業將因此失敗。
執行目錄伺服器的機器具有 directory.example.com 完全合格的網域名稱。此機器也必須配置成以 DNS 做為命名服務。
目錄伺服器機器會做為透過 Kerberos 對目錄伺服器進行認證時的用戶端系統。此認證可從任何能夠同時與目錄伺服器和 Kerberos 常駐程式進行通訊的系統執行。然而,此範例的所有必要元件皆隨附於目錄伺服器,而認證會從該系統執行。
目錄伺服器中的使用者具有格式為 uid= username,ou=People,dc=example,dc=com 的 DN。對應的 Kerberos 主體為 username@EXAMPLE.COM。若使用不同的命名機制,則必須使用不同的 GSSAPI 身份識別對映。
/etc/krb5/krb5.conf 配置檔中含有可讓 Kerberos 用戶端與 KDC 通訊的必要資訊。
在 KDC 機器、目錄伺服器機器,以及任何將使用 Kerberos 對目錄伺服器進行認證的用戶端機器上,編輯 /etc/krb5/krb5.conf 配置檔。
將您所看到的每個 "___default_realm___" 取代為 "EXAMPLE.COM"。
將您所看到的每個 "___master_kdc___" 取代為 "kdc.example.com"。
由於只會有一部 Kerberos 伺服器,因此請移除含有 "___slave_kdcs___" 的文字行。
將 "___domain_mapping___" 取代為 ".example.com = EXAMPLE.COM" (請注意 .example.com 開頭處的句點)。
更新的 /etc/krb5/krb5.conf 配置檔應如下列範例的內容所示。
#pragma ident "@(#)krb5.conf 1.2 99/07/20 SMI" # Copyright (c) 1999, by Sun Microsystems, Inc. # All rights reserved. # # krb5.conf template # In order to complete this configuration file # you will need to replace the __<name\>__ placeholders # with appropriate values for your network. # [libdefaults] default_realm = EXAMPLE.COM [realms] EXAMPLE.COM = { kdc = kdc.example.com admin_server = kdc.example.com } [domain_realm] .example.com = EXAMPLE.COM [logging] default = FILE:/var/krb5/kdc.log kdc = FILE:/var/krb5/kdc.log kdc_rotate = { # How often to rotate kdc.log. Logs will get rotated no more # often than the period, and less often if the KDC is not used # frequently. period = 1d # how many versions of kdc.log to keep around (kdc.log.0, kdc.log.1, ...) versions = 10 } [appdefaults] kinit = { renewable = true forwardable= true } gkadmin = { help_url = http://docs.sun.com:80/ab2/coll.384.1/SEAM/@AB2PageView/1195 } |
在 /etc/krb5/kadm5.acl 配置檔中,將 "___default_realm___" 取代為 "EXAMPLE.COM"。更新的檔案應如下列範例所示。
# # Copyright (c) 1998-2000 by Sun Microsystems, Inc. # All rights reserved. # # pragma ident "@(#)kadm5.acl 1.1 01/03/19 SMI" */admin@EXAMPLE.COM * |
編輯 /etc/krb5/kdc.conf 檔案,將 "___default_realm___" 取代為 "EXAMPLE.COM"。更新的檔案應如下列範例所示。
# Copyright 1998-2002 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # #ident "@(#)kdc.conf 1.2 02/02/14 SMI" [kdcdefaults] kdc_ports = 88,750 [realms] EXAMPLE.COM = { profile = /etc/krb5/krb5.conf database_name = /var/krb5/principal admin_keytab = /etc/krb5/kadm5.keytab acl_file = /etc/krb5/kadm5.acl kadmind_port = 749 max_life = 8h 0m 0s max_renewable_life = 7d 0h 0m 0s default_principal_flags = +preauth } |
$ /usr/sbin/kdb5_util create -r EXAMPLE.COM -s Initializing database ’/var/krb5/principal’ for realm ’EXAMPLE.COM’, master key name ’K/M@EXAMPLE.COM’ You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter KDC database master key: password Re-enter KDC database master key to verify: password $ |
使用下列指令,建立具有 kws/admin@EXAMPLE.COM 主體與管理常駐程式所將使用之服務金鑰的管理使用者。
$ /usr/sbin/kadmin.local kadmin.local: add_principal kws/admin Enter password for principal "kws/admin@EXAMPLE.COM": secret Re-enter password for principal "kws/admin@EXAMPLE.COM": secret Principal "kws/admin@EXAMPLE.COM" created. kadmin.local: ktadd -k /etc/krb5/kadm5.keytab kadmin/kdc.example.com Entry for principal kadmin/kdc.example.com with kvno 3, encryption type DES-CBC-CRC added to keytab WRFILE:/etc/krb5/kadm5.keytab. kadmin.local: ktadd -k /etc/krb5/kadm5.keytab changepw/kdc.example.com Entry for principal changepw/kdc.example.com with kvno 3, encryption type DES-CBC-CRC added to keytab WRFILE:/etc/krb5/kadm5.keytab. kadmin.local: ktadd -k /etc/krb5/kadm5.keytab kadmin/changepw Entry for principal kadmin/changepw with kvno 3, encryption type DES-CBC-CRC added to keytab WRFILE:/etc/krb5/kadm5.keytab. kadmin.local: quit$ |
執行下列指令,以啟動 KDC 與管理常駐程式:
$ /etc/init.d/kdc start $ /etc/init.d/kdc.master start $ |
KDC 程序會以 /usr/lib/krb5/krb5kdc 的形式顯示在程序清單中。管理常駐程式會顯示為 /usr/lib/krb5/kadmind。
請注意,Solaris 10 作業系統中的常駐程式係由「服務管理功能 (SMF)」架構所管理。在 Solaris 10 作業系統上啟動常駐程式:
$ svcadm disable network/security/krb5kdc $ svcadm enable network/security/krb5kdc $ svcadm disable network/security/kadmin $ svcadm enable network/security/kadmin $ |
使用以下一系列的指令,為 KDC 與目錄伺服器機器的 Kerberos 資料庫增加主機主體。klist 等特定 Kerberos 公用程式會使用主機主體。
$ /usr/sbin/kadmin -p kws/admin Enter Password: secret kadmin: add_principal -randkey host/kdc.example.com Principal "host/kdc.example.com@EXAMPLE.COM" created. kadmin: ktadd host/kdc.example.com Entry for principal host/kdc.example.com with kvno 3, encryption type DES-CBC-CRC added to keytab WRFILE:/etc/krb5/krb5.keytab. kadmin: add_principal -randkey host/directory.example.com Principal "host/directory.example.com@EXAMPLE.COM" created. kadmin: ktadd host/directory.example.com Entry for principal host/directory.example.com with kvno 3, encryption type DES-CBC-CRC added to keytab WRFILE:/etc/krb5/krb5.keytab. kadmin: quit $ |
目錄伺服器必須具有本身的主體,才能對進行認證的使用者驗證其所持有之 Kerberos 票證。目錄伺服器目前採用硬式編碼要求 ldap/fqdn@realm 形式的主體,其中 fqdn 是目錄伺服器完全合格的網域名稱,而 realm 是 Kerberos 範圍。fqdn 必須符合安裝目錄伺服器時所提供之完全合格的名稱。在此情況下,目錄伺服器的主體將是 ldap/directory.example.com@EXAMPLE.COM。
使用以下一系列的指令,建立目錄伺服器的 LDAP 主體:
$ /usr/sbin/kadmin -p kws/admin Enter Password: secret kadmin: add_principal -randkey ldap/directory.example.com Principal "ldap/directory.example.com@EXAMPLE.COM" created. kadmin: quit $ |
Kerberos 資料庫中必須有進行認證的使用者,才能執行 Kerberos 認證。在此範例中,使用者的使用者名稱為 kerberos-test,這表示 Kerberos 主體為 kerberos-test@EXAMPLE.COM。
使用此範例中的指令序列建立使用者:
$ /usr/sbin/kadmin -p kws/admin Enter Password: secret kadmin: add_principal kerberos-test Enter password for principal "kerberos-test@EXAMPLE.COM": secret Re-enter password for principal "kerberos-test@EXAMPLE.COM": secret Principal "kerberos-test@EXAMPLE.COM" created. kadmin: quit $ |
安裝 Directory Server 6.0 與最新的修補程式。以下是範例設定。
變數類型 |
範例值 |
---|---|
完全合格的電腦名稱 |
directory.example.com |
安裝目錄 |
/opt/SUNWdsee |
實例路徑 |
/local/ds |
伺服器使用者 |
unixuser |
伺服器群組 |
unixgroup |
伺服器識別碼 |
directory |
伺服器連接埠 |
389 |
尾碼 |
dc=example,dc=com |
管理員 ID |
admin |
管理網域 |
example.com |
目錄伺服器管理員 DN |
cn=admin,cn=Administrators,cn=config |
管理連接埠 |
390 |
首先建立 /data/ds/shared/bin/gssapi.ldif 檔案以定義目錄伺服器所應使用的對映,再根據主體識別進行認證的 Kerberos 使用者。建立下列範例中所顯示的相同檔案內容。
dn: cn=GSSAPI,cn=identity mapping,cn=config changetype: add objectClass: top objectClass: nsContainer cn: GSSAPI dn: cn=default,cn=GSSAPI,cn=identity mapping,cn=config changetype: add objectClass: top objectClass: nsContainer objectClass: dsIdentityMapping objectClass: dsPatternMatching cn: default dsMatching-pattern: \${Principal} dsMatching-regexp: (.*)@EXAMPLE.COM dsMappedDN: uid=\$1,ou=People,dc=example,dc=com dn: cn=SASL,cn=security,cn=config changetype: modify replace: dsSaslPluginsPath dsSaslPluginsPath: /usr/lib/mps/sasl2/libsasl.so |
接著使用 ldapmodify 指令更新目錄伺服器,以啟用具有適當對映的 GSSAPI,如下列範例所示:
$ ldapmodify -D cn=admin,cn=Administrators,cn=config -w - -a -f /data/ds/shared/bin/gssapi.ldif adding new entry cn=GSSAPI,cn=identity mapping,cn=config adding new entry cn=default,cn=GSSAPI,cn=identity mapping,cn=config modifying entry cn=SASL,cn=security,cn=config $ |
如前所述,目錄伺服器必須在 KDC 中具有本身的主體,才能透過 GSSAPI 認證 Kerberos 使用者。為使認證正確運作,主體資訊必須位於目錄伺服器機器的 Kerberos keytab 中。此項資訊必須位於執行目錄伺服器的使用者帳號可讀取的檔案中。
使用下列指令序列,建立具有正確特性的 keytab 檔案:
$ /usr/sbin/kadmin -p kws/admin Enter Password: secret kadmin: ktadd -k //local/ds/config/ldap.keytab ldap/directory.example.com Entry for principal ldap/directory.example.com with kvno 3, encryption type DES-CBC-CRC added to keytab WRFILE:/local/ds/config/ldap.keytab. kadmin: quit $ |
變更此自訂 keytab 中的權限與所有權。讓用以執行目錄伺服器的使用者帳號擁有此 keytab,且只有該名使用者可加以讀取:
$ chown unixuser:unixgroup /local/ds/config /ldap.keytab $ chmod 600 /local/ds/config/ldap.keytab $ |
目錄伺服器預設會嘗試使用 /etc/kerb5/krb5.keytab 檔案中的標準 Kerberos keytab。但若讓目錄伺服器使用者可讀取此檔案,將會構成安全性風險,為目錄伺服器建立自訂 keytab 的用意即在於此。
配置目錄伺服器以使用新的自訂 keytab。請設定 KRB5_KTNAME 環境變數,以執行此作業。
最後,請重新啟動目錄伺服器,變更方可生效:
$ KRB5_KTNAME=/etc/krb5/ldap.keytab dsadm restart /local/ds |
若要對目錄伺服器認證 Kerberos 使用者,使用者必須有目錄項目可對應於其 Kerberos 主體。
在上一個步驟中,測試使用者以 kerberos-test@EXAMPLE.COM 的主體增加到 Kerberos 資料庫中。由於身份識別對映配置已增加到目錄中,因此該名使用者的對應目錄項目必須具有 DN uid=kerberos-test,ou=People,dc=example,dc=com。
在目錄中增加使用者之前,必須以下列內容建立檔案 testuser.ldif。
dn: uid=kerberos-test,ou=People,dc=example,dc=com changetype: add objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson uid: kerberos-test givenName: Kerberos sn: Test cn: Kerberos Test description: An account for testing Kerberos authentication through GSSAPI |
接著,請使用 ldapmodify 將此項目增加到伺服器中:
$ ldapmodify -D cn=admin,cn=Administrators,cn=config -w - -f testuser.ldif adding new entry uid=kerberos-test,ou=People,dc=example,dc=com $ |
測試使用者存在於 Kerberos 資料庫、目錄伺服器與 KDC 中。因此,現在可以透過 GSSAPI 使用 Kerberos,利用測試使用者的身份,對目錄伺服器進行認證。
首先,請使用 kinit 指令取得使用者的 Kerberos 票證,如下列範例所示:
$ kinit kerberos-test Password for kerberos-test@EXAMPLE.COM: secret $ |
接著,請使用 klist 指令檢視此票證的相關資訊:
$ klist Ticket cache: /tmp/krb5cc_0 Default principal: kerberos-test@EXAMPLE.COM Valid starting Expires Service principal Sat Jul 24 00:24:15 2004 Sat Jul 24 08:24:15 2004 krbtgt/EXAMPLE.COM@EXAMPLE.COM renew until Sat Jul 31 00:24:15 2004 $ |
最後一個步驟是使用 GSSAPI,對目錄伺服器進行認證。目錄伺服器隨附的 ldapsearch 公用程式可支援 SASL 認證,包含 GSSAPI、DIGEST-MD5 與 EXTERNAL 等機制。但若要使用 GSSAPI 進行連結,則必須為用戶端提供 SASL 程式庫的路徑。將 SASL_PATH 環境變數設為 lib/sasl 目錄,以提供路徑:
$ SASL_PATH=SASL-library $ export SASL_PATH $ |
若要實際使用 ldapsearch 對目錄伺服器執行 Kerberos 型認證,則必須納入 -o mech=GSSAPI 與 -o authzid=principal 引數。
此外,還必須指定完全合格的主機名稱,在此案例中為 -h directory.example.com,此名稱必須與伺服器之 cn=config 的 nsslapd-localhost 屬性值相符。在此必須使用 -h 選項,因為 GSSAPI 認證程序中必須要有用戶端所提供的主機名稱,用以比對伺服器所提供的主機名稱。
下列範例將在 dc=example,dc=com 項目認證為先前所建立的 Kerberos 測試使用者帳號時,擷取此項目:
$ ldapsearch -h directory.example.com -p 389 -o mech=GSSAPI \ -o authzid="kerberos-test@EXAMPLE.COM" -b "dc=example,dc=com" -s base "(objectClass=*)" version: 1 dn: dc=example,dc=com dc: example objectClass: top objectClass: domain $ |
查看目錄伺服器存取記錄,以確定認證是否已如預期般進行處理:
$ tail -12 /local/ds/logs/access [24/Jul/2004:00:30:47 -0500] conn=0 op=-1 msgId=-1 - fd=23 slot=23 LDAP connection from 1.1.1.8 to 1.1.1.8 [24/Jul/2004:00:30:47 -0500] conn=0 op=0 msgId=1 - BIND dn="" method=sasl version=3 mech=GSSAPI [24/Jul/2004:00:30:47 -0500] conn=0 op=0 msgId=1 - RESULT err=14 tag=97 nentries=0 etime=0, SASL bind in progress [24/Jul/2004:00:30:47 -0500] conn=0 op=1 msgId=2 - BIND dn="" method=sasl version=3 mech=GSSAPI [24/Jul/2004:00:30:47 -0500] conn=0 op=1 msgId=2 - RESULT err=14 tag=97 nentries=0 etime=0, SASL bind in progress [24/Jul/2004:00:30:47 -0500] conn=0 op=2 msgId=3 - BIND dn="" method=sasl version=3 mech=GSSAPI [24/Jul/2004:00:30:47 -0500] conn=0 op=2 msgId=3 - RESULT err=0 tag=97 nentries=0 etime=0 dn="uid=kerberos-test,ou=people,dc=example,dc=com" [24/Jul/2004:00:30:47 -0500] conn=0 op=3 msgId=4 - SRCH base="dc=example,dc=com" scope=0 filter="(objectClass=*)" attrs=ALL [24/Jul/2004:00:30:47 -0500] conn=0 op=3 msgId=4 - RESULT err=0 tag=101 nentries=1 etime=0 [24/Jul/2004:00:30:47 -0500] conn=0 op=4 msgId=5 - UNBIND [24/Jul/2004:00:30:47 -0500] conn=0 op=4 msgId=-1 - closing - U1 [24/Jul/2004:00:30:48 -0500] conn=0 op=-1 msgId=-1 - closed. $ |
此範例說明連結為三步驟的程序。前兩個步驟會傳回 LDAP 結果 14 (SASL 連結進行中),而第三個步驟說明連結已順利完成。method=sasl 與 mech=GSSAPI 標記說明連結採用 GSSAPI SASL 機制。成功連結回應結尾處的 dn="uid=kerberos-test,ou=people,dc=example,dc=com",說明連結已由適當的使用者身份執行。