2016-03-07 45 views
2

我有一個受Kerberos保護的羣集,並且有一個REST API需要代表用戶與羣集進行交互。我使用Spring Security和SPNEGO來驗證用戶,但是當我嘗試使用Hadoop SDK時,基於我嘗試的各種原因,它失敗了。轉發SPNEGO憑證以保護羣集

當我嘗試在用戶登錄後直接使用SDK時,它會給我SIMPLE authentication is not enabled

我注意到會話的AuthenticatorUserNamePasswordAuthenticationToken這是沒有意義的,因爲我使用用戶憑證對Kerberos領域進行身份驗證。

我想用這個項目的開箱即用我自己的服務帳戶和密鑰表:https://github.com/spring-projects/spring-security-kerberos/tree/master/spring-security-kerberos-samples/sec-server-spnego-form-auth

+0

當使用「Hadoop SDK」時,我想你會創建一個Hadoop的'Configuration'和一個Hadoop'UserGroupInformation'。如何將配置屬性以隱式的方式提供給'Configuration'(即,將''core-site.xml'等放在本地目錄中,並將該目錄添加到CLASSPATH中)*或顯式地提供給配置屬性?如果是隱式的,你是否檢查文件是否被實際讀取*(否則Hadoop默默恢復爲硬編碼的默認值,例如SIMPLE認證,並且你的程序將在隨後發生意外的異常消息時崩潰並燒錄)*? –

+0

如果還不是這種情況,可以按照https://steveloughran.gitbooks.io/kerberos_and_hadoop/content/sections/secrets.html中的說明提升一些調試標誌,例如'-Dsun.security.krb5。debug = true'和'export HADOOP_JAAS_DEBUG = true' –

+0

我正在顯式地添加配置文件,但我試圖避免使用UGI,因爲它全部使用靜態成員,而且我需要支持線程安全操作。我可能對於在用戶的主體下工作的所有東西都有一個基本的誤解,但我希望它能像獲得對一個'Subject「的引用並在'Subject內部運行我的HDFS列表等一樣簡單.doAs' – Benny

回答

0

首先,春季節Kerberos擴展是一個可怕的一段代碼。我曾評估一次,並棄用它。您需要客戶端向您的集羣進行身份驗證的憑據。你已經基本上兩個選項:

  1. 如果你是在Tomcat上,你可以嘗試使用Spring Security的JEE AUTH預包裝跟我一起Tomcat SPNEGO AD Authenticator from trunk。如果將從客戶端接收委派的憑據,這將使您能夠執行您的任務,並假設您的服務器帳戶受信任進行委派。
  2. 如果上述不是選項,請使用Java 8的S4U2Proxy/S4U2Self並代表用戶主體獲取Kerberos票證,然後執行您的REST API調用。

只要你有GSSCredential流量是相同的。

聲明:我不知道Hadoop,但GSS-API過程總是相同的。

+0

*「我不知道Hadoop,但是GSS-API過程總是一樣的「* - 你是一個樂觀主義者......有關」Kerberos和Hadoop「的GitBook的副標題**」超越大門的瘋狂「**以及HP摘錄Lovecraft遍佈各處*(並且匹配的ApacheCon演示文稿也有一些相關的插圖)* –

+0

@SamsonScharfrichter也許這些東西沒有做好。它是開源的,改進它,因爲你比我更瞭解Hadoop。如果我會使用Hadoop,我會這樣做。 –

+0

HortonWorks的工作人員正在努力......而且他們比任何人都更合格(併爲此付出代價)。在此期間,我們可以哭泣,哭泣。 –

0

值得一提的是,您可以利用Apache Knox(http://knox.apache.org)在安全集羣中使用Hadoop REST API。諾克斯將爲您處理SPNEGO與各種組件的談判。您可以使用基於HTTP標頭的pre-auth SSO提供程序將您的最終用戶身份傳播給Knox。

詳情:http://knox.apache.org/books/knox-0-8-0/user-guide.html#Preauthenticated+SSO+Provider

您需要確保只有受信任的客戶端可以但是,如果將此使用提供商的呼叫服務。

或者,您可以使用默認的Shiro提供程序對帶有用戶名/密碼的LDAP進行身份驗證。

以這種方式使用Knox的好處之一是您的服務永遠不需要知道羣集是否被kerberized。諾克斯從你那裏抽象出來。