Sun Java System Directory Server Enterprise Edition 6.2 管理指南

使用 GSSAPI 與 SASL 配置 Kerberos 認證的範例

為目錄伺服器配置 Kerberos 有時是很複雜的作業。您應以 Kerberos 文件做為首要參考資料。

如需更多說明,請以下列範例程序評估所應執行的步驟。但請注意,此程序僅是範例。您必須根據本身的配置與環境,適當地修改此程序。

如需有關在 Solaris 作業系統中配置及使用 Kerberos 的更多資訊,請參閱「System Administration Guide: Security Services」。此指南是 Solaris 文件集的一部分。您也可以參考線上手冊。

    此範例與前述步驟的相關資訊如下:

  1. 此範例的假設

  2. 所有機器:編輯 Kerberos 用戶端配置檔

  3. 所有機器:編輯管理伺服器 ACL 配置檔

  4. KDC 機器:編輯 KDC 伺服器配置檔

  5. KDC 機器:建立 KDC 資料庫

  6. KDC 機器:建立管理主體與 Keytab

  7. KDC 機器:啟動 Kerberos 常駐程式

  8. KDC 機器:為 KDC 與目錄伺服器機器增加主機主體

  9. KDC 機器:增加目錄伺服器的 LDAP 主體

  10. KDC 機器:為 KDC 增加測試使用者

  11. 目錄伺服器機器:安裝目錄伺服器

  12. 目錄伺服器機器:配置目錄伺服器以啟用 GSSAPI

  13. 目錄伺服器機器:建立目錄伺服器 Keytab

  14. 目錄伺服器機器:將測試使用者增加至目錄伺服器

  15. 目錄伺服器機器:以測試使用者的身份取得 Kerberos 票證

  16. 用戶端機器:透過 GSSAPI 對目錄伺服器進行認證

此範例的假設

此範例中的程序說明如何將一部機器配置成為金鑰分配中心 (KDC),並將另一部機器配置成執行目錄伺服器的機器。完成此程序後,使用者即可透過 GSSAPI 執行 Kerberos 認證。

在同一部機器上可同時執行 KDC 與目錄伺服器。若選擇在同一部機器上同時執行兩者,請使用相同的程序,但可在目錄伺服器機器的步驟中省略已對 KDC 機器執行過的部分。

此程序對於所使用的環境有許多相關假設。使用範例程序時,請根據您的環境適當地修改其值。這些假設包含:

所有機器:編輯 Kerberos 用戶端配置檔

/etc/krb5/krb5.conf 配置檔中含有可讓 Kerberos 用戶端與 KDC 通訊的必要資訊。

在 KDC 機器、目錄伺服器機器,以及任何將使用 Kerberos 對目錄伺服器進行認證的用戶端機器上,編輯 /etc/krb5/krb5.conf 配置檔。

更新的 /etc/krb5/krb5.conf 配置檔應如下列範例的內容所示。


範例 5–1 編輯後的 Kerberos 用戶端配置檔 /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
        }

所有機器:編輯管理伺服器 ACL 配置檔

/etc/krb5/kadm5.acl 配置檔中,將 "___default_realm___" 取代為 "EXAMPLE.COM"。更新的檔案應如下列範例所示。


範例 5–2 編輯後的管理伺服器 ACL 配置檔


#
# Copyright (c) 1998-2000 by Sun Microsystems, Inc.
# All rights reserved.
#
# pragma ident   "@(#)kadm5.acl  1.1     01/03/19 SMI"
*/admin@EXAMPLE.COM *

KDC 機器:編輯 KDC 伺服器配置檔

編輯 /etc/krb5/kdc.conf 檔案,將 "___default_realm___" 取代為 "EXAMPLE.COM"。更新的檔案應如下列範例所示。


範例 5–3 編輯後的 KDC 伺服器配置檔 /etc/krb5/kdc.conf


# 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
        }

KDC 機器:建立 KDC 資料庫


$ /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
$

KDC 機器:建立管理主體與 Keytab

使用下列指令,建立具有 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 機器:啟動 Kerberos 常駐程式

執行下列指令,以啟動 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 機器:為 KDC 與目錄伺服器機器增加主機主體

使用以下一系列的指令,為 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
$

KDC 機器:增加目錄伺服器的 LDAP 主體

目錄伺服器必須具有本身的主體,才能對進行認證的使用者驗證其所持有之 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 
$

KDC 機器:為 KDC 增加測試使用者

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

伺服器連接埠 

389

尾碼 

dc=example,dc=com

目錄伺服器機器:配置目錄伺服器以啟用 GSSAPI

首先建立 /data/ds/shared/bin/gssapi.ldif 檔案以定義目錄伺服器所應使用的對映,再根據主體識別進行認證的 Kerberos 使用者。建立下列範例中所顯示的相同檔案內容。


範例 5–4 gssapi.ldif 檔案內容


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
$

目錄伺服器機器:建立目錄伺服器 Keytab

如前所述,目錄伺服器必須在 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


範例 5–5 新的 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 票證

測試使用者存在於 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 對目錄伺服器進行認證

最後一個步驟是使用 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=confignsslapd-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",說明連結已由適當的使用者身份執行。