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 擴充套件,這是一個新的 Spring 擴充套件專案,致力於為核心 Spring Security 專案提供擴充套件模組。目前我們開發了兩個擴充套件:一個 SAML2 整合和一個 Kerberos/SPNEGO 整合。每個模組都有自己的釋出週期,因此人們可以儘快從這些擴充套件中受益,而不必等待下一個 Spring Security 版本釋出。如果您有任何想法,甚至有一些用於進一步擴充套件的程式碼,請告訴我們!

Kerberos/SPNEGO

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

瀏覽器向您的 Web 應用程式傳送 GET 請求 (1),然後 Web 應用程式返回需要“協商”身份驗證 (2)。然後瀏覽器會要求 Kerberos 伺服器獲取所謂的服務票據 (3)。然後瀏覽器會將此服務票據(證明呼叫者的身份)和一些額外資訊傳送到 Web 應用程式 (5)。在根據您的 Web 應用程式和 Kerberos 伺服器之間的共享金鑰驗證票據後,您將獲得使用者名稱。

為此,每個 Web 應用程式都需要在 Kerberos 伺服器註冊,並獲得一個服務主體和一個共享金鑰。對於 Web 應用程式,服務主體必須是 "HTTP/<完全限定域名>@DOMAIN"。例如,如果您的應用程式執行在 web.springsource.com 上,則為 "HTTP/web.[email protected]"。然後,您需要將此主體的憑據匯出到金鑰表文件(共享金鑰),並將其提供給您的應用程式。每個基於 Kerberos 的系統都將以這種方式工作,但建立此服務主體和金鑰表在不同系統之間有所不同。我將向您展示如何使用 Microsoft Windows 和 MIT Kerberos 來完成此操作,但它也應該適用於其他實現。

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

儘管這指的是 Microsoft Windows 2008 Server,但它在 2003 和甚至 2000 Server 中應該非常相似。在 ActiveDirectory 中,您只需建立一個普通的域使用者,然後為他分配一個服務主體 (SPN),並使用命令列實用程式建立金鑰表。現在一步一步來

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

之後,您必須使用命令列工具 "ktpass.exe"。它已經包含在 Windows 2008 Server 中,在早期版本中您必須自行安裝。只需確保您使用的版本與您的伺服器版本匹配,並且區域設定也應該匹配。此工具會將服務主體名稱 (SPN) 分配給您之前建立的使用者,並將使用者金鑰匯出到金鑰表文件。如果您的服務主體是 "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 應用程式,您可以將其用作起點。您只需配置您的服務主體名稱並將您生成的金鑰表放在那裡。示例應用程式包含在上面提到的下載中。

如果您開啟示例應用程式的 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 來獲取角色和可能的一些其他使用者屬性。在此示例中,我們只使用一個虛擬實現來簡化測試。

如您所見,我們已經填寫了服務主體名稱和金鑰表位置。根據您的需要更改這些值,並確保之前生成的金鑰表在此位置可用。

現在啟動您的伺服器並嘗試進行 SPNEGO 身份驗證。您應該會在瀏覽器中看到您的完整域使用者名稱。在您的程式碼中,您可以使用普通的 Spring Security 類或甚至標準的 Java servlet 呼叫 request.getRemoteUser() 來檢索使用者名稱。如果它不起作用(您可能會看到一個空白頁面),請檢查這些事項

  • 檢查日誌檔案
  • 確保您在 URL 中使用完全限定域名(而不是 IP 地址和短名稱)。
  • 如果您使用的是 Internet Explorer:開啟“Windows 整合身份驗證”,並確保域(在本例中為 web.springsource.com)列在 IE 的本地 intranet 站點部分。
  • 如果您使用的是 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 問題

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有