Tomcat Windows 認(rèn)證

2022-03-03 14:08 更新

概述

集成 Windows 驗(yàn)證(Integrated Windows authentication)往往用于局域網(wǎng)環(huán)境中,因?yàn)樾枰褂梅?wù)器執(zhí)行驗(yàn)證,被驗(yàn)證的用戶也必須處于同一域內(nèi)。為了能夠自動(dòng)驗(yàn)證用戶,用戶所用的客戶端機(jī)器也必須處于同一域內(nèi)。

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

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

下面將分別詳細(xì)講述這些方案。

內(nèi)建 Tomcat 支持

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

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

在配置 Windows 驗(yàn)證的 Tomcat 內(nèi)建支持時(shí),共涉及到4個(gè)組件:域控制器、托管 Tomcat 的服務(wù)器、需要使用 Windows 驗(yàn)證的 Web 應(yīng)用,以及客戶端機(jī)器。下面將講解每個(gè)組件所需的配置。

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

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

1. 域控制器

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

  • 創(chuàng)建一個(gè)域用戶,它將映射到 Tomcat 服務(wù)器所用的服務(wù)名稱上。在本文檔中,用戶為 tc01,密碼為 tc01pass。
  • 將 SPN 映射到用戶賬戶上。SPN 的形式為:<service class>/<host>:<port>/<service name>。本文檔所用的 SPN 為 HTTP/win-tc01.dev.local。要想將用戶映射到 SPN 上,運(yùn)行以下命令:

    setspn -A HTTP/win-tc01.dev.local tc01

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

    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。

以上步驟測(cè)試環(huán)境為:運(yùn)行 Windows Server 2008 R2 64 位標(biāo)準(zhǔn)版的域控制器。對(duì)于域功能級(jí)別和林(forest)功能級(jí)別,使用 Windows Server 2003 的功能級(jí)別。

2. Tomcat 實(shí)例(Windows 服務(wù)器)

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

  • 將域控制器所創(chuàng)建的 tomcat.keytab 文件復(fù)制到 $CATALINA_BASE/conf/tomcat.keytab。
  • 創(chuàng)建 kerberos 配置文件 $CATALINA_BASE/conf/krb5.ini。本文檔使用的文件包含以下內(nèi)容:
    [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
該文件的位置可以通過(guò) `java.security.krb5.conf` 系統(tǒng)屬性來(lái)修改。
  • 創(chuàng)建 JAAS 邏輯配置文件 $CATALINA_BASE/conf/jaas.conf。本文檔使用的文件包含以下內(nèi)容:
    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;
    };

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

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

上述步驟測(cè)試環(huán)境為:Tomcat 服務(wù)器運(yùn)行于 Windows Server 2008 R2 64 位標(biāo)準(zhǔn)版上,帶有 Oracle 1.6.0_24 64 位 JDK。

3. Tomcat 實(shí)例(Linux 服務(wù)器)

測(cè)試環(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)定版本,但其實(shí)所有 Tomcat 8 的版本都能使用。

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

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

4. Web 應(yīng)用

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

5. 客戶端

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

6. 參考資料

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

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

第三方庫(kù)

1. Waffle

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

  • Drop-in
  • 配置簡(jiǎn)單(無(wú)需 JAAS 或 keytab 配置)
  • 使用原生庫(kù)

2. Spring Security - Kerberos 擴(kuò)展

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

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

3. SourceForge 的 SPNEGO 項(xiàng)目

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

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

4. Jespa

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

  • 純 Java 解決方案
  • 高級(jí) Active 目錄集成

反向代理

1. Microsoft IIS

通過(guò)配置 IIS 提供 Windows 驗(yàn)證的步驟如下:

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

2. Apache httpd

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

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

采用以下步驟配置 httpd,以便提供 Windows 驗(yàn)證:

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)