web server apache tomcat11-29-Windows Authentication

前言

整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本爲 v11 最新的版本。

開源項目

從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。

系列文章

web server apache tomcat11-01-官方文檔入門介紹

web server apache tomcat11-02-setup 啓動

web server apache tomcat11-03-deploy 如何部署

web server apache tomcat11-04-manager 如何管理?

web server apache tomcat11-06-Host Manager App -- Text Interface

web server apache tomcat11-07-Realm Configuration

web server apache tomcat11-08-JNDI Resources

web server apache tomcat11-09-JNDI Datasource

web server apache tomcat11-10-Class Loader

web server apache tomcat11-11-Jasper 2 JSP Engine

web server apache tomcat11-12-SSL/TLS Configuration

web server apache tomcat11-13-SSI

web server apache tomcat11-14-CGI

web server apache tomcat11-15-proxy

web server apache tomcat11-16-mbean

web server apache tomcat11-17-default-servlet

web server apache tomcat11-18-clusting 集羣

web server apache tomcat11-19-load balance 負載均衡

web server apache tomcat11-20-connectors 連接器

web server apache tomcat11-21-monitor and management 監控與管理

web server apache tomcat11-22-logging 日誌

web server apache tomcat11-23-APR

web server apache tomcat11-24-Virtual Hosting and Tomcat

web server apache tomcat11-25-Advanced IO and Tomcat

web server apache tomcat11-26-maven jars

web server apache tomcat11-27-Security Considerations

web server apache tomcat11-28-Windows Service

web server apache tomcat11-29-Windows Authentication

web server apache tomcat11-30-The Tomcat JDBC Connection Pool

web server apache tomcat11-31-websocket

web server apache tomcat11-32-rewrite

web server apache tomcat11-33-CDI

web server apache tomcat11-34-Ahead of Time compilation support

概述

集成的Windows身份驗證通常在內部網絡環境中使用,因爲它要求執行身份驗證的服務器和被驗證的用戶屬於同一個域。爲了讓用戶自動認證,用戶使用的客戶端機器也必須屬於該域。

有幾種選項可以在Apache Tomcat中實現集成的Windows身份驗證。它們是:

  • 內置的Tomcat支持。
  • 使用第三方庫,如Waffle。
  • 使用支持Windows身份驗證的反向代理執行身份驗證步驟,如IIS或httpd。

以下部分討論了每個選項的配置。

內置的Tomcat支持

Kerberos(集成的Windows身份驗證的基礎)需要仔細的配置。如果按照本指南中的步驟執行,將會得到一個可工作的配置。重要的是要嚴格遵循下面的步驟。在配置中幾乎沒有靈活性。到目前爲止的測試已經知道:

  • 用於訪問Tomcat服務器的主機名必須與SPN中的主機名完全匹配,否則認證將失敗。在這種情況下,調試日誌中可能會報告校驗和錯誤。
  • 客戶端必須認爲服務器是本地受信任的內部網絡的一部分。
  • SPN必須是HTTP/,並且在使用的所有地方必須完全相同。
  • 端口號不得包含在SPN中。
  • 不得將多個SPN映射到一個域用戶。
  • Tomcat必須以與SPN關聯的域帳戶或域管理員身份運行。不建議以域管理員用戶身份運行Tomcat。
  • 慣例是始終使用域名(dev.local)的小寫。域名通常不區分大小寫。
  • 慣例是始終使用Kerberos領域名稱(DEV.LOCAL)的大寫。領域名稱區分大小寫。
  • 使用ktpass命令時必須指定域。

配置內置Tomcat支持Windows身份驗證需要四個組件:域控制器、託管Tomcat的服務器、希望使用Windows身份驗證的Web應用程序和客戶端機器。以下各節描述了每個組件所需的配置。

在下面的配置示例中使用的三臺機器的名稱分別是win-dc01.dev.local(域控制器)、win-tc01.dev.local(Tomcat實例)和win-pc01.dev.local(客戶端)。它們都是dev.local域的成員。

注意:爲了使用下面的步驟中的密碼,必須放寬域密碼策略。這在生產環境中不建議。

域控制器

這些步驟假定服務器已經配置爲充當域控制器。將Windows服務器配置爲域控制器的步驟不在本說明範圍內。配置域控制器以使Tomcat支持Windows身份驗證的步驟如下:

  1. 創建一個域用戶,該用戶將映射到Tomcat服務器使用的服務名稱。在本說明中,此用戶稱爲tc01,密碼爲tc01pass。
  2. 將服務主體名稱(SPN)映射到用戶帳戶。SPN的形式爲/:/。本說明中使用的SPN是HTTP/win-tc01.dev.local。要將用戶映射到SPN,請運行以下命令:
    setspn -A HTTP/win-tc01.dev.local tc01
    
  3. 生成密鑰表文件,Tomcat服務器將使用該文件向域控制器進行身份驗證。該文件包含了服務提供程序帳戶的Tomcat私鑰,應當受到保護。要生成文件,請運行以下命令(所有命令放在一行上):
    ktpass /out c:\tomcat.keytab /mapuser [email protected]
              /princ HTTP/[email protected]
              /pass tc01pass /kvno 0
    
  4. 創建一個用於客戶端的域用戶。在本說明中,域用戶爲test,密碼爲testpass。

上述步驟已在運行Windows Server 2019 Standard的域控制器上進行了測試,該服務器使用了Windows Server 2016的功能級別,用於森林和域。

Tomcat實例(Windows服務器)

這些步驟假定Tomcat和Java 11 JDK/JRE已經安裝和配置,並且Tomcat正在以[email protected]用戶身份運行。配置Tomcat實例以進行Windows身份驗證的步驟如下:

  1. 將在域控制器上創建的tomcat.keytab文件複製到$CATALINA_BASE/conf/tomcat.keytab。

  2. 創建Kerberos配置文件$CATALINA_BASE/conf/krb5.ini。本說明中使用的文件包含以下內容:

[libdefaults]
default_realm = DEV.LOCAL
default_keytab_name = FILE:c:\apache-tomcat-11.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系統屬性來改變。

創建JAAS登錄配置文件$CATALINA_BASE/conf/jaas.conf。本說明中使用的文件內容如下:

com.sun.security.jgss.krb5.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    principal="HTTP/[email protected]"
    useKeyTab=true
    keyTab="c:/apache-tomcat-11.0.x/conf/tomcat.keytab"
    storeKey=true;
};

com.sun.security.jgss.krb5.accept {
    com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    principal="HTTP/[email protected]"
    useKeyTab=true
    keyTab="c:/apache-tomcat-11.0.x/conf/tomcat.keytab"
    storeKey=true;
};

這個文件的位置可以通過設置java.security.auth.login.config系統屬性來改變。使用的LoginModule是特定於JVM的,因此確保指定的LoginModule與使用的JVM匹配。登錄配置的名稱必須與身份驗證閥值使用的值相匹配。

SPNEGO驗證器將與任何Realm一起工作,但如果與JNDI Realm一起使用,默認情況下,JNDI Realm將使用用戶的委派憑據連接到Active Directory。如果只需要認證的用戶名,則可以使用AuthenticatedUserRealm,它將簡單地返回基於認證用戶名的Principal,而不具有任何角色。

以上步驟已在運行Windows Server 2019 Standard和AdoptOpenJDK 8u232-b09(64位)的Tomcat服務器上進行了測試。

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中,密鑰表文件的路徑應更新爲反映Linux服務器上密鑰表文件的路徑,使用Linux風格的文件路徑(例如,/usr/local/tomcat/...)。

Web應用程序

Web應用程序需要在web.xml中配置使用Tomcat特定的SPNEGO身份驗證方法(而不是BASIC等)。與其他身份驗證器一樣,可以通過明確配置身份驗證閥和在閥上設置屬性來自定義行爲。

客戶端

客戶端必須配置爲使用Kerberos身份驗證。對於Internet Explorer,這意味着確保Tomcat實例位於“本地內部網絡”安全域中,並且已配置(工具 > Internet選項 > 高級)啓用集成的Windows身份驗證。請注意,如果您將客戶端和Tomcat實例使用相同的計算機,那麼這將無法正常工作,因爲Internet Explorer將使用不受支持的NTLM協議。

參考資料

正確配置Kerberos身份驗證可能會有些棘手。以下參考資料可能會有所幫助。

Tomcat用戶郵件列表上也始終提供建議。

  • IIS和Kerberos
  • SourceForge上的SPNEGO項目
  • Oracle Java GSS-API教程(Java 7)
  • Oracle Java GSS-API教程 - 故障排除(Java 7)
  • Geronimo用於Windows身份驗證的配置
  • 在Kerberos交換中選擇加密
  • 支持的Kerberos密碼套件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章