Spring Security Kerberos/SPNEGO 擴充套件

工程 | Mike Wiesner | 2009 年 9 月 28 日 | ...

我們很高興地宣布 Spring Security Kerberos 擴充套件的第一個里程碑版本現已開放下載。此版本也可透過 Maven 里程碑儲存庫取得,網址為http://maven.springframework.org/milestone。透過 Spring Security Kerberos 擴充套件,您的使用者只需開啟 URL 即可針對您的 Web 應用程式進行身分驗證。無需輸入使用者名稱/密碼,也無需安裝額外的軟體。

在深入探討 Kerberos 之前,我想先介紹 Spring Security Extensions,這是一個新的 Spring Extension 專案,致力於為核心 Spring Security 專案提供擴充模組。目前我們已在此開發了兩個擴充套件:SAML2 整合和 Kerberos/SPNEGO 整合。每個模組都會有自己的發佈週期,以便人們可以在這些擴充套件準備就緒時立即受益,而無需等待下一個 Spring Security 版本。如果您對進一步的擴充有任何想法,甚至有一些程式碼,請告訴我們!

Kerberos/SPNEGO

在此模組的第一個里程碑版本中,我們為您提供了一個開箱即用的 Kerberos/SPNEGO 解決方案,適用於 Web 應用程式。Kerberos 是一種標準化的網路身分驗證協定,旨在為用戶端/伺服器應用程式提供強大的身分驗證,例如瀏覽器作為用戶端的 Web 應用程式。它也是在 Windows 網路中驗證使用者的建議方式,並取代了過時且相對不安全的 NTLM。除此之外,它還廣泛應用於 *NIX 環境,並且每個主要平台都有實作。因此,您很可能已經部署了 Kerberos,現在您也可以在自己的 Web 應用程式中使用它。這表示您的使用者只需輸入 URL,即可使用其網域使用者名稱自動進行身分驗證,例如 [email protected]。然後,您可以透過 Spring Security 甚至使用 request.getRemoteUser() 找出此使用者名稱。這是如何運作的呢?以下是一個簡要概述:SPNEGO

瀏覽器向您的 Web 應用程式傳送 GET 請求 (1),然後 Web 應用程式會傳回需要 "negotiate" 身分驗證 (2)。然後,瀏覽器會要求 Kerberos 伺服器取得所謂的服務票證 (3)。接著,瀏覽器會將此服務票證(證明呼叫者的身分)和一些額外資訊傳送至 Web 應用程式 (5)。在根據您的 Web 應用程式與 Kerberos 伺服器之間的一些共用密碼驗證票證後,您會取回使用者名稱。

為了使此功能運作,每個 Web 應用程式都需要在 Kerberos 伺服器上註冊,並取得服務主體和指派的共用密碼。對於 Web 應用程式,服務主體必須是 "HTTP/<完整合格網域名稱>@網域"。例如 "HTTP/web.[email protected]",如果您的應用程式在 web.springsource.com 上執行。然後,您需要將此主體的憑證匯出到 keytab 檔案(共用密碼),並使其可供您的應用程式使用。每個基於 Kerberos 的系統都會以這種方式運作,但服務主體和 keytab 的建立在不同系統之間有所不同。我將向您展示如何在 Microsoft Windows 和 MIT Kerberos 中執行此操作,但它也應該適用於其他實作。

使用 Microsoft Windows 2008 Server 建立服務主體

雖然這指的是 Microsoft Windows 2008 Server,但在 2003 甚至 2000 Server 中應該非常相似。在 ActiveDirectory 中,您只需建立一個普通的網域使用者,然後為其指派服務主體 (SPN),並使用命令列公用程式建立 keytab。現在逐步說明

建立一個將成為服務主體的普通使用者。使用者名稱和密碼對於 Kerberos 來說沒有意義,但您當然應該選擇一個有用的名稱,例如 http-web.springsource.com。只需確保您停用「使用者必須在下次登入時變更密碼」選項,並啟用「密碼永不過期」。

在那之後,您必須使用命令列工具 "ktpass.exe"。它已包含在 Windows 2008 Server 中,在較早的版本中,您必須自行安裝。只需確保您使用的版本與您的伺服器版本相符,並且地區設定也應相符。此工具會將服務主體名稱 (SPN) 指派給您先前建立的使用者,並將使用者金鑰匯出到 keytab 檔案。如果您的服務主體是 "HTTP/web.[email protected]",而您的使用者是 http-web.springsource.com,則您的 ktpass 命令應如下所示


ktpass /out http-web.keytab /mapuser [email protected] /princ HTTP/[email protected]  /pass *

ktpass 會提示您輸入一些密碼。您應該為其選擇一些安全的隨機密碼。如果您現在在目錄中擁有檔案 http-web.keytab,則一切運作正常。稍後在您的應用程式中需要此檔案,因為它包含驗證服務票證的共用密碼。

使用 MIT Kerberos 建立服務主體

在 *NIX 系統和 Mac OS X 中,廣泛使用 MIT Kerberos 實作。使用 MIT Kerberos 更簡單。只需開啟 kadmin 主控台並執行以下命令

kadmin:  addprinc -randkey HTTP/web.springsource.com
kadmin:  ktadd -k /http-web.keytab HTTP/web.springsource.com

然後您應該在 root 下擁有一個檔案 http-web.keytab。稍後在您的應用程式中需要此檔案,因為它包含驗證服務票證的共用密碼。

設定 Spring Security

首先,是需求
  • Spring Security 3.0.0 M2
  • SUN JRE/JDK 1.6.x
  • Kerberos 環境
  • 支援 SPNEGO 的瀏覽器 (Firefox、IE、Safari)

為了在 Spring Security 中使用 Kerberos 模組,您只需宣告一個篩選器、一個身分驗證進入點和一個身分驗證提供者。我們包含了一個範例 Web 應用程式,您可以將其用作起點。您只需設定您的服務主體名稱,並將您產生的 keytab 放在那裡。範例應用程式包含在上面提到的下載中。

如果您開啟範例應用程式的 security.xml 檔案,該檔案位於 /src/main/webapp/WEB-INF 下,您會看到一個使用新 Kerberos 模組的基本 Spring Security 設定。


<sec:http entry-point-ref="spnegoEntryPoint">
	<sec:intercept-url pattern="/secure/**" access="IS_AUTHENTICATED_FULLY" />
	<sec:custom-filter ref="spnegoAuthenticationProcessingFilter" position="BASIC_PROCESSING_FILTER" />
</sec:http>

<bean id="spnegoEntryPoint" class="org.springframework.security.extensions.kerberos.web.SpnegoEntryPoint" />

<bean id="spnegoAuthenticationProcessingFilter" class="org.springframework.security.extensions.kerberos.web.SpnegoAuthenticationProcessingFilter">
	<property name="authenticationManager" ref="authenticationManager" />
</bean>

<sec:authentication-manager alias="authenticationManager">
	<sec:authentication-provider ref="kerberosServiceAuthenticationProvider" />
</sec:authentication-manager>

<bean id="kerberosServiceAuthenticationProvider" class="org.springframework.security.extensions.kerberos.KerberosServiceAuthenticationProvider">
	<property name="ticketValidator">
		<bean class="org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator">
			<property name="servicePrincipal" value="HTTP/web.springsource.com" />
			<property name="keyTabLocation" value="classpath:http-web.keytab" />
		</bean>
	</property>
	<property name="userDetailsService" ref="dummyUserDetailsService" />
</bean>

<!-- Just returns the User authenticated by Kerberos and gives him the ROLE_USER -->
<bean id="dummyUserDetailsService" class="org.springframework.security.extensions.kerberos.sample.DummyUserDetailsService"/>

前兩個 bean(SpnegoEntryPoint 和 SpnegoAuthenticationProcessingFilter)負責交握,而 KerberosServiceAuthenticationProvider 則最終驗證服務票證。目前我們僅支援 SUN 的 JRE/JDK 中包含的 Kerberos/SPNEGO 實作。由於您僅從 Kerberos 取回使用者名稱,因此您還需要 UserDetailsService 來擷取角色,以及可能其他使用者屬性。在此範例中,我們僅使用虛擬實作來簡化測試。

如您所見,我們已經填寫了服務主體名稱和 keytab 位置。根據您的需要變更這些值,並確保先前產生的 keytab 可在此位置取得。

現在啟動您的伺服器,並嘗試 SPNEGO 身分驗證。您應該會在瀏覽器中看到您的完整網域使用者名稱。在您的程式碼中,您可以使用正常的 Spring Security 類別,甚至使用標準 Java servlet 呼叫 request.getRemoteUser() 擷取使用者名稱。如果它不起作用(也許您看到一個空白頁面),請檢查以下事項

  • 檢查記錄檔
  • 確保您在 URL 中使用完整合格網域名稱(而不是 IP 位址,也不是簡短名稱)。
  • 如果您使用的是 Internet Explorer:開啟「Windows 整合式驗證」,並確保網域(在我們的案例中為 web.springsource.com)列在 IE 的本機內部網路網站區段中。
  • 如果您使用的是 Firefox:請按一下這裡查看。
  • 如果您使用的是 Windows 用戶端:用戶端和伺服器必須位於不同的機器上,因為否則 Windows 將使用 NTLM 而不是 Kerberos。
  • 檢查所有相關機器上的時間是否已同步。
  • 如果您使用的是 Microsoft AD,您可以在這裡找到更多協助:http://msdn.microsoft.com/en-us/library/ms995329.aspx
    • 除此之外,設定正確的 Kerberos 環境可能很複雜,並且在您開始使用 Spring Security Kerberos 擴充套件之前,正確設定它非常重要。我們在諮詢期間遇到的大多數問題都是 Kerberos 環境的問題,而不是應用程式本身的問題。

      如果您想在自己的 Maven 專案中使用 Spring Security Kerberos 擴充套件,則必須將 Spring Milestone Repository 新增至您的 pom.xml。它應該看起來像這樣

      
      <repositories>
      	<repository>
      		<id>spring-milestone</id>
      		<name>Spring Portfolio Milestone Repository</name>
      		<url>http://maven.springframework.org/milestone </url>
      	</repository>
      </repositories>
      

      當然還有依賴項

      
      <dependency>
      	<groupId>org.springframework.security.extensions</groupId>
      	<artifactId>spring-security-kerberos-core</artifactId>
      	<version>1.0.0.M1</version>
      </dependency>
      

      還有一些工作要做,例如也為 Java 用戶端提供 Kerberos,而不僅僅是伺服器,但我們希望您會嘗試這個里程碑版本並提供一些回饋。社群論壇是提出問題或開始討論新功能的最佳場所。或者,如果您發現任何錯誤,您可以提出 Jira Issue

取得 Spring 電子報

隨時掌握 Spring 電子報的最新資訊

訂閱

領先一步

VMware 提供訓練和認證,以加速您的進展。

瞭解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

瞭解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部