Tomcat Windows 認證

2022-03-03 14:08 更新

概述

集成 Windows 驗證(Integrated Windows authentication)往往用于局域網(wǎng)環(huán)境中,因為需要使用服務器執(zhí)行驗證,被驗證的用戶也必須處于同一域內。為了能夠自動驗證用戶,用戶所用的客戶端機器也必須處于同一域內。

可以利用以下幾種方案來實現(xiàn) Tomcat 下的集成 Windows 驗證:

  • 內建 Tomcat 支持。
  • 使用第三方庫,比如 Waffle。
  • 使用支持 Windows 驗證的反向代理來執(zhí)行驗證步驟(IIS 或 httpd)。

下面將分別詳細講述這些方案。

內建 Tomcat 支持

需要仔細配置 Kerberos 身份驗證服務(集成 Windows 驗證的基礎)。如果嚴格按照下列步驟去做,配置就會生效。這些配置的靈活度很小,所以必須嚴格按照下列方式去做。從測試到現(xiàn)在,已知的規(guī)則是:

  • 用于訪問 Tomcat 服務器的主機名必須匹配 服務主體名稱(Service Principal Name,SPN)中的主機名,否則驗證就會失敗。驗證失敗時,校驗和錯誤會報告給調試日志。
  • 客戶端必須明確服務器位于本地可信局域網(wǎng)。
  • SPN 必須是 HTTP/<主機名> 的形式,而且必須在所有用到它的位置處保持統(tǒng)一。
  • 端口號不能放在 SPN 中。
  • 不能將多個 SPN 映射給一個域用戶。
  • Tomcat 必須以 SPN 關聯(lián)的域賬戶或域管理員的身份運行,但建議采用域管理員的身份運行 Tomcat。
  • 在 ktpass 命令中,域名(DEV.LOCAL)不區(qū)分大小寫,在jaas.conf 中也是這樣。
  • 使用 ktpass 命令時,不能指定域。

在配置 Windows 驗證的 Tomcat 內建支持時,共涉及到4個組件:域控制器、托管 Tomcat 的服務器、需要使用 Windows 驗證的 Web 應用,以及客戶端機器。下面將講解每個組件所需的配置。

下面配置范例中用到的 3 個機器名稱為:win-dc01.dev.local (域控制器)、win-tc01.dev.local(Tomcat 實例)、win-pc01.dev.local (客戶端)。它們都是DEV.LOCAL 域成員。

注意:為了在下面的步驟中使用密碼,不得不放寬了域密碼規(guī)則,對于生產(chǎn)環(huán)境,可不建議這么做。

1. 域控制器

下列步驟假設前提是:經(jīng)過配置,服務器可以做為域控制器來使用。關于如何配置 Windows 服務器配置成域控制器,不在本章討論范圍之內。
配置域控制器,使 Tomcat 支持 Windows 驗證的步驟為:

  • 創(chuàng)建一個域用戶,它將映射到 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

  • 生成 keytab 文件,Tomcat 服務器會用該文件將自身注冊到域控制器上。該文件包含用于服務提供者賬戶的 Tomcat 私鑰,所以也應該受到保護。運行以下命令生成該文件(全部命令都應寫在同一行中):

    ktpass /out c:\tomcat.keytab /mapuser tc01@DEV.LOCAL /princ HTTP/win-tc01.dev.local@DEV.LOCAL /pass tc01pass /kvno 0

  • 創(chuàng)建客戶端所用的域用戶。本文檔中,域用戶為 test,密碼為 testpass

以上步驟測試環(huán)境為:運行 Windows Server 2008 R2 64 位標準版的域控制器。對于域功能級別和林(forest)功能級別,使用 Windows Server 2003 的功能級別。

2. Tomcat 實例(Windows 服務器)

下列步驟假定前提為:已經(jīng)安裝并配置好了 Tomcat 和 Java 6 JDK/JRE,并以 tc01@DEV.LOCAL 用戶來運行 Tomcat。配置用于 Windows 驗證的 Tomcat 實例的步驟如下:

  • 將域控制器所創(chuàng)建的 tomcat.keytab 文件復制到 $CATALINA_BASE/conf/tomcat.keytab
  • 創(chuàng)建 kerberos 配置文件 $CATALINA_BASE/conf/krb5.ini。本文檔使用的文件包含以下內容:
    [libdefaults]
    default_realm = DEV.LOCAL
    default_keytab_name = FILE:c:\apache-tomcat-8.0.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` 系統(tǒng)屬性來修改。
  • 創(chuàng)建 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-8.0.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-8.0.x/conf/tomcat.keytab"
     storeKey=true;
    };

本文件位置可以通過 java.security.auth.login.config 系統(tǒng)屬性來修改。所用的 LoginModule 是 JVM 所專有的,從而能保證所指定的 LoginModule 匹配所用的 JVM。登錄配置名稱必須與驗證 valve 所用值相匹配。

SPNEGO 驗證器適用于任何 Realm,但如果和 JNDI Realm 一起使用的話,JNDI Realm 默認將使用用戶的委托憑證(delegated credentials)連接 Active 目錄。

上述步驟測試環(huán)境為:Tomcat 服務器運行于 Windows Server 2008 R2 64 位標準版上,帶有 Oracle 1.6.0_24 64 位 JDK。

3. Tomcat 實例(Linux 服務器)

測試環(huán)境如下:

  • Java 1.7.0, update 45, 64-bit
  • Ubuntu Server 12.04.3 LTS 64-bit
  • Tomcat 8.0.x (r1546570)

雖然建議使用最新的穩(wěn)定版本,但其實所有 Tomcat 8 的版本都能使用。

配置與 Windows 基本相同,但存在以下一些差別:

  • Linux 服務器不必位于 Windows 域。
  • 應該更新 krb5.ini 和 jass.conf 中的 keytab 文件路徑,以便適應使用 Linux 文件路徑風格(比如:/usr/local/tomcat/...)的 Linux 服務器。

4. Web 應用

配置 Web 應用,以便使用 web.xml 中的 Tomcat 專有驗證方法 SPNEGO(而不是 BASIC 等)。和其他的驗證器一樣,通過顯式地配置驗證 valve并且在 Valve 中設置屬性來自定義行為。

5. 客戶端

配置客戶端,以便使用 Kerberos 認證。對于 IE 瀏覽器來說,這就需要 Tomcat 實例位于“本地局域網(wǎng)”安全域中,并且需要在“工具 > Internet 選項 > 高級”中啟用集成 Windows 認證。注意:客戶端和 Tomcat 實例不能使用同一臺機器,因為 IE 會使用未經(jīng)證實的 NTLM 協(xié)議。

6. 參考資料

正確配置 Kerberos 驗證是有一定技巧性的。下列參考資料有一定幫助。一般來說,Tomcat 用戶郵件列表中的建議也是可取的。

  1. IIS 與 Kerberos
  2. SourceForge 的 SPNEGO 項目
  3. Oracle Java GSS-API 教程(Java 7)
  4. Oracle Java GSS-API 教程 - 疑難解答(Java 7)
  5. 用于 Windows 驗證的Geronimo 配置
  6. Kerberos 交換中的加密選擇
  7. 受支持的 Kerberos Cipher 套件

第三方庫

1. Waffle

關于該解決方案的完整詳情,可瀏覽 Waffle 網(wǎng)站。其關鍵特性為:

  • Drop-in
  • 配置簡單(無需 JAAS 或 keytab 配置)
  • 使用原生庫

2. Spring Security - Kerberos 擴展

關于該解決方案的完整詳情,可瀏覽 Kerberos 擴展網(wǎng)站。其關鍵特性為:

  • xx
  • 需要生成 Kerberos keytab 文件
  • 純粹 Java 解決方案

3. SourceForge 的 SPNEGO 項目

關于該解決方案的完整詳情,可瀏覽 該項目網(wǎng)站。其關鍵特性為:

  • 使用 Kerberos。
  • 純 Java 解決方案。

4. Jespa

關于該解決方案的完整詳情,可瀏覽 該項目網(wǎng)站。其關鍵特性為:

  • 純 Java 解決方案
  • 高級 Active 目錄集成

反向代理

1. Microsoft IIS

通過配置 IIS 提供 Windows 驗證的步驟如下:

  1. 將 IIS 配置成 Tomcat 的反向代理(參看 IIS Web 服務器文檔)。
  2. 配置 IIS 使用 Windows 驗證。
  3. AJP 連接器上的 tomcatAuthentication 屬性設為 false,從而配置 Tomcat 使用來自 IIS 的驗證用戶信息。另一種方法是,將 tomcatAuthorization 設為 true,從而在Tomcat 執(zhí)行授權時,允許 IIS 進行驗證。

2. Apache httpd

Apache httpd 默認并不支持 Windows 驗證,但可以使用很多第三方模塊來實現(xiàn):

  1. 針對 Windows 平臺的 mod_auth_sspi
  2. 針對非 Windows 平臺的 mod_auth_ntlm_winbind。目前已知適用于 32 位平臺上的 httpd 2.0.x。有些用戶已經(jīng)報告了 httpd 2.2.x 構建與 64 位Linux 構建所存在的穩(wěn)定性問題。

采用以下步驟配置 httpd,以便提供 Windows 驗證:

  1. 將 httpd 配置成 Tomcat 的反向代理(參看 Apache httpd Web 服務器文檔)。
  2. 配置 httpd 使用 Windows 驗證。
  3. AJP 連接器上的 tomcatAuthentication 屬性設為 false,從而配置 Tomcat 使用來自 httpd 的驗證用戶信息。
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號