Liberty 中配置 SPNEGO 鑑別

您可以將「簡易且受保護的 GSS-API 協議機制 (SPNEGO)」Web 鑑別用於 WebSphere® Application Server Liberty,以便對 HTTP 要求使用單一登入。SPNEGO 單一登入可讓 HTTP 使用者只需在其桌面上登入 Microsoft® 網域控制站一次,並利用 Liberty 伺服器來達成單一登入 (SSO)。

開始之前

配置下列軟體並確定可用:
  1. 執行「Active Directory 網域控制站」和相關聯「Kerberos 金鑰配送中心 (KDC)」的 Microsoft Windows® Server。在這個主題中,這類網域控制站的範例主機是 myAdMachine.example.com。網域控制站名稱是 mydomain.example.com,Kerberos 網域範圍名稱是 MYDOMAIN.EXAMPLE.COM,亦即全大寫字母的網域控制站名稱。
  2. 支援 SPNEGO 鑑別機制(定義在 IETF RFC 2478 中)的 Microsoft Windows® 網域成員(用戶端)。例如,適當的用戶端可以是現今的瀏覽器或 Microsoft .NET 用戶端。大部分現今的瀏覽器都支援 SPNEGO 鑑別。在這個主題中,用戶端的範例主機是 myClientMachine.example.com
  3. 具有 Liberty 伺服器的伺服器平台,且這部伺服器中的應用程式內具有一個受保護的資源。Active Directory 中的使用者必須能夠使用 Liberty 伺服器原生鑑別機制,來存取 Liberty 伺服器的受保護資源。在這個主題中,範例 Liberty 伺服器主機是 myLibertyMachine.example.com
註: 軟體配置必須有一部執行中的網域控制站,該網域中至少有一部用戶端機器,以及一個具有 Liberty 伺服器的伺服器平台,且這部伺服器中的應用程式內具有一個受保護的資源,因此總計有三部必要的機器。不支援直接從網域控制站使用 SPNEGO。
註: 請確定依預設,用戶端、Microsoft Active Directory 伺服器和 Liberty 伺服器的時鐘已同步成彼此相差在 5 分鐘內。可容許的同步化差異是可配置的。
註: 目前只支援 IBM® JDK。不支援非 IBM JDK。

關於這項作業

這項作業的目標是容許使用者順利存取 Liberty 伺服器資源,而不必再次鑑別,進而達成 Microsoft Windows® 桌面單一登入功能。

這項作業示範如何將 Liberty 伺服器配置成使用 SPNEGO Web 鑑別,來支援 HTTP 要求的單一登入。

程序

  1. 在 Microsoft 網域控制站 (myAdMachine.example.com) 上,為 Liberty 伺服器建立 Kerberos 服務主體名稱 (SPN) 和 keytab 檔:
    1. 建立 Liberty 伺服器的使用者帳戶。 這個帳戶用來對映至 Kerberos 服務主體名稱 (SPN)。對於 Active Directory 機器,如果要建立這個帳戶,通常是移至開始 > 系統管理工具 > Active Directory 使用者與電腦,用滑鼠右鍵按一下畫面中的使用者,選取新建 > 使用者。這個主題假設建立了使用者 myLibertyMachine_http,且密碼是 security
    2. 執行 Microsoft setspn 指令,將使用者帳戶對映至 Kerberos SPN。這個使用者帳戶是向 KDC 表示 Liberty 伺服器是一項 Kerberos 服務。 setspn 指令範例如下:
      C:\> setspn -a HTTP/myLibertyMachine.example.com myLibertyMachine_http
      
      Registering ServicePrincipalNames for CN=myLibertyMachine_http,CN=Users,DC=MYDOMAIN,DC=EXAMPLE,DC=COM
                       HTTP/myLibertyMachine.example.com
      Updated object
      註: 如果您的 Microsoft setspn 指令版本支援 -S 選項,必須改用 -S 選項,而非 -A
    3. 使用 Microsoft ktpass 工具,建立 Kerberos keytab 檔。這個檔案的預設名稱是 krb5.keytab

      ktpass 指令範例如下:

      C:\> ktpass -out krb5.keytab -princ HTTP/myLibertyMachine.example.com@MYDOMAIN.EXAMPLE.COM -mapUser myLibertyMachine_http -mapOp set -pass security -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL
      
      				Targeting domain controller: myAdMachine.MYDOMAIN.EXAMPLE.COM
      				Using legacy password setting method
      				Successfully mapped HTTP/myLibertyMachine.example.com to myLibertyMachine_http.
      				Key created.
      				Output keytab to krb5.keytab:
      				Keytab version: 0x502
      				keysize 93 HTTP/myLibertyMachine.example.com@MYDOMAIN.EXAMPLE.COM ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype 0x17 (RC4-HMAC) keylength 16 (0x148d643db283327d3f3d44547da8cade)

      使用下列其中一個指令,確定 Microsoft 樹系中沒有重複的 SPN:

      • 如果您的 Microsoft setspn 指令版本支援使用 -X 選項來搜尋重複的 SPN,請使用 setspn -X
        C:\>setspn -X HTTP/myLibertyMachine.example.com 
        
        Processing entry 0 
        found 0 group of duplicate SPNs. 
      • 您也可以使用 Microsoft ldif 指令。下列範例顯示傳回一個項目,這表示沒有重複的 SPN。
        C:\>ldifde -f check_SPN.txt -t 3268 -d "" -l servicePrincipalName -r " 
        (servicePrincipalName=HTTP/myLibertyMachine.example.com)" -p subtree 
        
        Connecting to "myAdMachine.MYDOMAIN.EXAMPLE.COM" 
        Logging in as current user using SSPI 
        Exporting directory to file check_SPN.txt 
        Searching for entries... 
        Writing out entries. 
        1 entries exported 

      如需在不同 KDC 系統上建立 SPN 和 keytab 檔的相關資訊,請參閱建立 Kerberos 服務主體名稱和 keytab 檔

  2. Liberty 伺服器機器 (myLibertyMachine.example.com) 上,啟用 Kerberos keytab 檔和配置檔,以及 SPNEGO Web 鑑別。
    1. 將 Kerberos keytab 檔從網域控制站複製到 Liberty 伺服器機器。這個檔案的預設名稱是 krb5.keytab,預設位置會因平台而異,但是會與 Kerberos 配置檔的目錄相同。如需各平台的預設位置,請見下一步。
    2. 建立 Kerberos 配置檔。

      Kerberos 配置檔含有用戶端配置資訊。此資訊包括:屬意領域的 KDC 位置、現行 Kerberos 領域的預設值,以及主機名稱至 Kerberos 領域的對映。對於 Liberty 伺服器,您必須手動建立這個檔案。

      這個檔案的預設位置名稱會因作業系統而異:
      • 適用於 Windows 平台Windows - 預設位置是 c:\winnt\krb5.ini。如果 krb5.ini 檔不在 c:\winnt 目錄中,則可能在 c:\windows
      • 適用於 LINUX 平台Linux - 預設位置是 /etc/krb5.conf
      • 適用於 AIX 平台適用於 z/OS 平台適用於 HP UNIX 平台適用於 Solaris 平台AIX®、z/OS®、HP-UX 和 Solaris - 預設位置是 /etc/krb5/krb5.conf

      以下是 AIX、z/OS、HP-UX 或 Solaris 平台的範例 Kerberos 配置檔(視預設 keytab 位置而定):

      [libdefaults]
                default_realm = MYDOMAIN.EXAMPLE.COM
                default_keytab_name = FILE:/etc/krb5/krb5.keytab
                default_tkt_enctypes = rc4-hmac 
                default_tgs_enctypes = rc4-hmac 
                forwardable  = true
                renewable  = true
                noaddresses = true
                clockskew  = 300
                udp_preference_limit = 1
      [realms]
                MYDOMAIN.EXAMPLE.COM = {
                      kdc = myAdMachine.example.com:88
                      default_domain = example.com
      			}
      [domain_realm]
              .example.com = MYDOMAIN.EXAMPLE.COM
      註: 執行作業的網域範圍。通常以大寫字母指定。如果您使用 Microsoft Active Directory,領域名稱必須是大寫。
      註: 並非所有可用的 KDC 解決方案都支援所有加密類型。在您選擇加密類型之前,請參閱您的「Kerberos 管理者與使用者手冊」,確定 KDC 支援您想使用的加密類型。

      請確定您具有 Kerberos 配置檔、Kerberos keytab 檔、Kerberos SPN 和 Kerberos 用戶端的一般加密類型。比方說,如果 Kerberos 用戶端使用 RC4-HMAC 加密類型,目標伺服器也必須支援 RC4-HMAC 加密類型,Kerberos 配置檔必須在 default_tgt_enctypesdefault_tkt_enctypes 參數中先列出 RC4-HMAC

      如需這個檔案內容的其他資訊與需求,請參閱建立 Kerberos 配置檔

    3. 驗證 Kerberos 配置檔和 keytab 檔。
      • 您可以使用 JDK 指令 klist,來列出 keytab 檔中的 SPN。
        klist -k -t /etc/krb5.keytab
      • 您可以使用 JDK 指令 kinit,來驗證 keytab 檔和 Kerberos 配置檔中的 SPN。
        kinit -k -t /etc/krb5.keytab HTTP/myLibertyMachine.example.com

      kinit 指令之後,您可以使用 klist 指令來列出 Kerberos 通行證。如果您取得 Kerberos 通行證,表示 Kerberos keytab 和配置是有效的。

    4. Liberty 伺服器上配置和啟用 SPNEGO Web 鑑別。

      您可以啟用 Libertyspnego-1.0 特性,來啟用 SPNEGO Web 鑑別。

      1. spnego-1.0 特性新增至 server.xml 檔。
        <featureManager>
                <feature>spnego-1.0</feature>
                <feature>appSecurity-2.0</feature>
                ...
        </featuremanager>

        新增 spnego-1.0 特性時,會自動施行最基本的特定配置。您不必在 server.xml 檔中指定 <spnego> 元素。沒有指定 <spnego> 元素時,以下是隱含的配置。

        <spnego
               canonicalHostName="true"
               disableFailOverToAppAuthType="true"
               trimKerberosRealmNameFromPrincipal="true"
               includeClientGSSCredentialInSubject="true" />
        註: 執行時期會建立下列格式的預設 SPN:
        "HTTP/" + java.net.InetAddress.getLocalHost().getCanonicalHostName();

        如果預設 SPN 不符合您在 krb5.keytab 檔中所指定的,您需要指定 servicePrincipalNames,例如:

        <spnego id="mySpnego" servicePrincipalNames="HTTP/myLibertyMachine.example.com"/>
        註: 當啟用 spnego-1.0 特性,並省略 <spnego> 元素或沒有使用 authFilterRef 屬性來配置它,凡是要求存取受保護的資源,都會使用 SPNEGO 鑑別。

        如需配置鑑別過濾器的相關資訊,請參閱鑑別過濾器

        註: 如果沒有提供 krb5Configkrb5Keytab 屬性的值,會預期每一個檔案各存在於其預設位置。這個範例先前已提供 Kerberos 配置檔和 keytab 檔在不同平台上的預設位置。
      2. 選用:必要的話,您可以指定其他任何配置選項。Liberty 支援許多一般 SPNEGO 實務和配置。比方說,您可以只根據特定的要求、Web 應用程式、主機或使用者代理程式,來過濾需要 SPNEGO 鑑別的 HTTP 要求。此外,您可以將 Kerberos 配置檔和 keytab 檔移出其個別的預設位置。以下範例配置變更了預設 <spnego> 設定:
        <server>
                <featureManager>
                        <feature>spnego-1.0</feature>
                        <feature>appSecurity-2.0</feature>
                        ...
                </featureManager>
                ...
                <authFilter id="myAuthFilter">
                         <host id="myHost" name="example.com" matchType="contains" />
                         <webApp id="myWebApp" name="protectedApp" matchType="equals" />
                </authFilter>
        
                <spnego id="mySpnego"
                        includeClientGSSCredentialInSubject="false"
                        krb5Config="${server.config.dir}/resources/security/kerberos/krb5.conf"
                        krb5Keytab="${server.config.dir}/resources/security/kerberos/krb5.keytab"
                        servicePrincipalNames="HTTP/myLibertyMachine.example.com"
                        authFilterRef="myAuthFilter" />
                </spnego> 
                ...
        </server>

        當使用這項配置時,只要所收到的要求含有主機名稱 example.com,並且要求取得 Web 應用程式 protectedApp 的資源,就會將 SPNEGO 鑑別用於該要求。此外,一旦鑑別成功,不會將用戶端的 GSS 認證新增至使用者主體。最後,會提供伺服器配置目錄內的特定位置(而不是其個別的預設位置),給伺服器所要使用的 Kerberos 配置檔和 keytab 檔。

        如需其他的配置選項,請參閱簡易且受保護的 GSS-API 協議機制 (SPNEGO)

        如需將 Kerberos 主體名稱對映至 WebSphere 使用者登錄 ID 的相關資訊,請參閱將用戶端 Kerberos 主體名稱對映至 WebSphere 使用者登錄 ID

        在極少數的事件中,如果您想將 Kerberos 主體名稱用於授權,請參閱透過 SPNEGO 鑑別使用 Kerberos 主體進行授權。只有在需要時才應遵循這些步驟,並且是由明確選擇不使用預設對映或 JAAS 自訂登入模組對映的使用者來執行。

  3. 在用戶端應用程式機器 (myClientMachine.example.com) 上配置用戶端應用程式。

    下列步驟只能在用戶端機器上完成。在 Active Directory 機器或 Liberty 伺服器機器上啟動瀏覽器,並執行這些步驟,是沒有用的。

    下列步驟適用於從瀏覽器存取 SPNEGO 保護資源的使用者。您必須已安裝支援 SPNEGO 鑑別的瀏覽器。

    Microsoft Internet Explorer:
    1. 在桌面上登入 Windows Active Directory 網域。
    2. Internet Explorer 視窗中,按一下工具 > 網際網路選項。在顯示的視窗中,按一下安全標籤。
    3. 選取區域內部網路圖示,並按一下網站
    4. 如果您使用 Internet Explorer 第 9 版或更新的版本,請跳至下一步。如果您使用 Internet Explorer 10 或更新版本,請按一下「區域內部網路」視窗中的進階
    5. 在「區域內部網路」視窗的將這個網站新增至區域欄位中,填入主機名稱的網址,以便針對網站欄位中顯示的網站清單啟用單一登入 (SSO)。您的網站資訊技術人員會提供這項資訊。關閉第二個「區域內部網路」視窗,並按一下確定,完成這個步驟,並關閉「區域內部網路」視窗。
    6. 在「網際網路選項」視窗中,按一下進階標籤,並捲動到「安全」設定。確定已選取啟用整合式 Windows® 鑑別方框。
    7. 按一下確定。重新啟動 Microsoft Internet Explorer,以啟動這項配置。
    Mozilla Firefox:
    1. 在桌面上登入 Windows Active Directory 網域。
    2. 在 Firefox 的位址欄位中,輸入 about:config
    3. 在「過濾/搜尋」方框中,輸入 network.n
    4. 按兩下 network.negotiate-auth.trusted-uris。這項喜好設定會列出允許瀏覽器進行 SPNEGO 鑑別的網站。請輸入授信網域或 URL 清單,並以逗點區隔。
      註: 您必須設定 network.negotiate-auth.trusted-uris 的值。
    5. 如果所部署的 SPNEGO 解決方案使用「認證委派」這項進階 Kerberos 特性,請按兩下 network.negotiate-auth.delegation-uris。這項喜好設定會列出可讓瀏覽器將其使用者授權委派給伺服器的網站。請輸入授信網域或 URL 清單,並以逗點區隔。
    6. 按一下確定。這項配置會反映更新項目。
    7. 重新啟動 Firefox 瀏覽器,以啟動這項配置。
    註: 使用者必須登入網域控制站,SPNEGO 才會起作用。以上述的範例機器來說,使用者必須登入位於 MYDOMAIN.EXAMPLE.COM\username 的網域控制站,才能經由瀏覽器進行 SPNEGO 鑑別。
    註: 如果多次提示您輸入使用者 ID 與密碼,請遵循先前的指示,確定您已在用戶端瀏覽器上啟用 SPNEGO 支援。您也必須確定 <spnego> 配置中的 disableFailOverToAppAuthType 屬性設為 false

結果

現在,已針對 SPNEGO 鑑別,適當配置您的網際網路瀏覽器。您可以使用應用程式來存取部署於 Liberty 伺服器上的安全資源,而不會提示您輸入使用者 ID 與密碼。

為了驗證 SPNEGO 正在運作,您可以登入網域控制站,然後存取 Liberty 伺服器上的受保護資源,由於您是登入網域控制站,不會提示您提供認證。不過,如果您沒有登入網域控制站,並嘗試存取受保護資源,會提示您提供認證。


指示主題類型的圖示 作業主題

檔名:twlp_spnego_config.html