Windows 驗證操作指南

目錄

概觀

整合式 Windows 驗證最常在 Intranet 環境中使用,因為它需要執行驗證的伺服器和要驗證的使用者是同一個網域的一部分。使用者要能自動驗證,使用者使用的用戶端電腦也必須是網域的一部分。

有幾個選項可以用來實作 Apache Tomcat 的整合式 Windows 驗證。它們是

  • 內建 Tomcat 支援。
  • 使用第三方程式庫,例如 Waffle。
  • 使用支援 Windows 驗證的反向代理伺服器來執行驗證步驟,例如 IIS 或 httpd。

以下各節將說明這些選項的組態。

內建 Tomcat 支援

Kerberos(整合 Windows 驗證的基礎)需要仔細組態。如果確實按照本指南中的步驟執行,將會產生可運作的組態。確實按照下列步驟執行非常重要。組態中幾乎沒有彈性空間。從目前的測試中得知

  • 用來存取 Tomcat 伺服器的主機名稱必須與 SPN 中的主機名稱完全相符,否則驗證將會失敗。在此情況下,偵錯記錄檔中可能會報告檢查總和錯誤。
  • 用戶端必須認為伺服器是本機受信任內網的一部分。
  • SPN 必須為 HTTP/<hostname>,且在所有使用的地方都必須完全相同。
  • SPN 中不得包含埠號。
  • 不得將多個 SPN 對應至一個網域使用者。
  • Tomcat 必須以與 SPN 關聯的網域帳戶或網域管理員身分執行。不建議以網域管理員使用者身分執行 Tomcat。
  • 慣例是網域名稱 (dev.local) 始終使用小寫。網域名稱通常不區分大小寫。
  • 慣例是 Kerberos 領域名稱 (DEV.LOCAL) 始終使用大寫。領域名稱區分大小寫。
  • 使用 ktpass 指令時,必須指定網域。

Tomcat 內建 Windows 驗證支援的組態有四個組成部分。網域控制器、主機 Tomcat、希望使用 Windows 驗證的網頁應用程式和用戶端機器。下列各節說明每個組成部分所需的組態。

以下組態範例中使用的三個機器的名稱為 win-dc01.dev.local(網域控制器)、win-tc01.dev.local(Tomcat 執行個體)和 win-pc01.dev.local(用戶端)。所有這些都是 dev.local 網域的成員。

注意:為了使用下列步驟中的密碼,網域密碼原則必須放寬。不建議對生產環境執行此操作。

網域控制器

這些步驟假設伺服器已組態為網域控制器。將 Windows 伺服器組態為網域控制器不在本教學指南的範圍內。組態網域控制器以讓 Tomcat 支援 Windows 驗證的步驟如下

  • 建立一個網域使用者,將其對應至 Tomcat 伺服器使用的服務名稱。在本教學指南中,此使用者稱為 tc01,其密碼為 tc01pass
  • 將服務主體名稱 (SPN) 對應至使用者帳戶。SPN 採用 <service class>/<host>:<port>/<service name> 格式。本教學指南中使用的 SPN 為 HTTP/win-tc01.dev.local。若要將使用者對應至 SPN,請執行下列動作
    setspn -A HTTP/win-tc01.dev.local tc01
  • 產生 Tomcat 伺服器用來向網域控制器驗證身分的 keytab 檔案。此檔案包含服務提供者帳戶的 Tomcat 私密金鑰,應適當加以保護。若要產生檔案,請執行下列指令(全部在單一行中)
    ktpass /out c:\tomcat.keytab /mapuser tc01@DEV.LOCAL
              /princ HTTP/win-tc01.dev.local@DEV.LOCAL
              /pass tc01pass /kvno 0
  • 建立要在用戶端使用的網域使用者。在此操作說明中,網域使用者為 test,密碼為 testpass

上述步驟已在執行 Windows Server 2019 Standard 的網域控制器上測試過,且對叢林和網域都使用 Windows Server 2016 功能層級。

Tomcat 執行個體(Windows 伺服器)

這些步驟假設 Tomcat 和 Java 11 JDK/JRE 已安裝並設定完成,且 Tomcat 以 tc01@dev.local 使用者身分執行。設定 Tomcat 實例以進行 Windows 驗證的步驟如下

  • 將網域控制器上建立的 tomcat.keytab 檔案複製到 $CATALINA_BASE/conf/tomcat.keytab
  • 建立 Kerberos 設定檔 $CATALINA_BASE/conf/krb5.ini。在此操作說明中使用的檔案包含
    [libdefaults]
    default_realm = DEV.LOCAL
    default_keytab_name = FILE:c:\apache-tomcat-10.1.x\conf\tomcat.keytab
    default_tkt_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
    default_tgs_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
    forwardable=true
    
    [realms]
    DEV.LOCAL = {
            kdc = win-dc01.dev.local:88
    }
    
    [domain_realm]
    dev.local= DEV.LOCAL
    .dev.local= DEV.LOCAL
    此檔案的位置可透過設定 java.security.krb5.conf 系統屬性來變更。
  • 建立 JAAS 登入設定檔 $CATALINA_BASE/conf/jaas.conf。在此操作說明中使用的檔案包含
    com.sun.security.jgss.krb5.initiate {
        com.sun.security.auth.module.Krb5LoginModule required
        doNotPrompt=true
        principal="HTTP/win-tc01.dev.local@DEV.LOCAL"
        useKeyTab=true
        keyTab="c:/apache-tomcat-10.1.x/conf/tomcat.keytab"
        storeKey=true;
    };
    
    com.sun.security.jgss.krb5.accept {
        com.sun.security.auth.module.Krb5LoginModule required
        doNotPrompt=true
        principal="HTTP/win-tc01.dev.local@DEV.LOCAL"
        useKeyTab=true
        keyTab="c:/apache-tomcat-10.1.x/conf/tomcat.keytab"
        storeKey=true;
    };
    此檔案的位置可透過設定 java.security.auth.login.config 系統屬性來變更。所使用的 LoginModule 是 JVM 特定的,因此請確定指定的 LoginModule 與所使用的 JVM 相符。登入設定檔的名稱必須與 驗證閥 所使用的值相符。

SPNEGO 驗證器可與任何 領域 搭配使用,但如果與 JNDI 領域搭配使用,預設情況下 JNDI 領域會使用使用者的委派憑證連線至 Active Directory。如果只需要經過驗證的使用者名稱,則可以使用 AuthenticatedUserRealm,它只會根據經過驗證的使用者名稱傳回一個沒有任何角色的 Principal。

上述步驟已在執行 Windows Server 2019 Standard 的 Tomcat 伺服器上測試過,並搭配使用 AdoptOpenJDK 8u232-b09(64 位元)。

Tomcat 執行個體(Linux 伺服器)

已使用下列環境測試過

  • Java 1.7.0,更新 45,64 位元
  • Ubuntu Server 12.04.3 LTS 64 位元
  • Tomcat 8.0.x (r1546570)

它應該可以搭配任何 Tomcat 版本使用,但建議使用最新的穩定版本。

設定與 Windows 相同,但有下列變更

  • Linux 伺服器不一定要是 Windows 網域的一部分。
  • krb5.ini 和 jaas.conf 中 keytab 檔案的路徑應更新,以反映 Linux 伺服器上 keytab 檔案的路徑,使用 Linux 風格檔案路徑(例如 /usr/local/tomcat/...)。

Web 應用程式

Web 應用程式需要設定為在 web.xml 中使用 Tomcat 特定的 SPNEGO 驗證方法(而不是 BASIC 等)。與其他驗證器一樣,行為可以透過明確設定 驗證閥門 和設定閥門上的屬性來自訂。

用戶端

必須設定用戶端才能使用 Kerberos 驗證。對於 Internet Explorer,這表示要確保 Tomcat 執行個體在「本機網路」安全網域中,並且已設定(工具 > 網際網路選項 > 進階)並啟用整合式 Windows 驗證。請注意,如果您對用戶端和 Tomcat 執行個體使用同一台機器,這無法正常運作,因為 Internet Explorer 會使用不受支援的 NTLM 通訊協定。

第三方程式庫

Waffle

可透過 Waffle 網站 找到此解決方案的完整詳細資料。主要功能為

  • 插入式解決方案
  • 簡單設定(不需要 JAAS 或 Kerberos keytab 設定)
  • 使用原生函式庫

Spring Security - Kerberos 延伸模組

可透過 Kerberos 延伸網站 找到此解決方案的完整詳細資料。主要功能為

  • Spring Security 延伸
  • 需要產生 Kerberos keytab 檔案
  • 純 Java 解決方案

Jespa

可透過 專案網站 找到此解決方案的完整詳細資料。主要功能為

  • 純 Java 解決方案
  • 進階 Active Directory 整合

SourceForge 上的 SPNEGO AD 專案

此解決方案的完整詳細資料可透過 專案網站 取得。主要功能如下

  • 純 Java 解決方案
  • SPNEGO/Kerberos 驗證器
  • Active Directory 領域

反向 Proxy

Microsoft IIS

設定 IIS 以提供 Windows 驗證有三個步驟。步驟如下

  1. 將 IIS 設定為 Tomcat 的反向代理伺服器 (請參閱 IIS 網頁伺服器操作指南)
  2. 設定 IIS 以使用 Windows 驗證
  3. 透過將 AJP 連接器 上的 tomcatAuthentication 屬性設定為 false,設定 Tomcat 以使用 IIS 中的驗證使用者資訊。或者,將 tomcatAuthorization 屬性設定為 true 以允許 IIS 進行驗證,而 Tomcat 執行授權。

Apache httpd

Apache httpd 預設不支援 Windows 驗證,但有許多第三方模組可以使用。這些模組包括

  1. mod_auth_sspi,適用於 Windows 平台。
  2. mod_auth_ntlm_winbind,適用於非 Windows 平台。已知適用於 32 位元平台上的 httpd 2.0.x。有些使用者回報在 httpd 2.2.x 組建和 64 位元 Linux 組建中遇到穩定性問題。

設定 httpd 以提供 Windows 驗證有三個步驟。步驟如下

  1. 將 httpd 設定為 Tomcat 的反向代理伺服器 (請參閱 Apache httpd 網頁伺服器操作指南)
  2. 設定 httpd 以使用 Windows 驗證
  3. 透過將 AJP 連接器 上的 tomcatAuthentication 屬性設定為 false,設定 Tomcat 以使用 httpd 中的驗證使用者資訊。