2017-04-17 40 views
0

在過去幾天中,我已經使用GSS-APISPNEGO構建了概念驗證演示。其目的是讓用戶通過Http RESTful Web服務單點登錄我們定製應用服務器提供的服務。SPNEGO:成功的談判和身份驗證後的後續調用

持有有效Kerberos票據授予票據(TGT)的用戶可以調用啓用SPNEGO的Web服務,客戶端和服務器將協商, 用戶將通過身份驗證(由Kerberos和應用程序級別),並且將(在成功認證時)在他的票證緩存中爲我的服務負責人提供服務票據。

這可以很好地使用CURL與--negotiate標誌作爲測試客戶端。

第一次通過CURL發出一個正常的HTTP請求,沒有特殊的標題。服務器拒絕此請求, 向響應頭添加「WWW-Authenticate:Negotiate」,表示協商。 CURL然後從KDC獲得一個服務票據,併發出第二個請求,這次是Negotiate +請求頭中包裝好的服務票據(NegTokenInit) 服務器然後解開票據,驗證用戶和(如果驗證是成功)執行所請求的服務(例如登錄)。

問題是,從客戶端到服務器的後續服務調用會發生什麼? 客戶端現在擁有一個有效的Kerberos服務票據,但使用SPNEGO通過CURL進行的其他呼叫也會生成上述相同的兩個通行證。

在我看來,我有很多的選擇:

1)每一個服務調用重複整整2通SPNEGO談判(如CURL一樣)。 雖然這可能是最簡單的選擇,但理論上至少在理論上會有一些開銷:客戶端和服務器都在創建和拆除GSS上下文,並且該請求在網絡上發送兩次,對於GET可能不錯,對於員額,討論以下問題:

Why does the Authorization line change for every firefox request?

Why Firefox keeps negotiating kerberos service tickets?

不過是架空*明顯在現實生活中?我猜測只有性能測試纔會說明。

2)第一次呼叫使用SPNEGO協商。一旦成功認證,後續調用使用應用程序級別認證。 這似乎是Websphere Application Server採用的方法,它使用輕量級第三方認證(LTPA)安全性令牌進行後續調用。

https://www.ibm.com/support/knowledgecenter/SS7JFU_8.5.5/com.ibm.websphere.express.doc/ae/csec_SPNEGO_explain.html

最初,這似乎有點不可思議。在成功地談過Kerberos可以使用之後,爲什麼會回到其他的東西呢?另一方面,如果GSS-API/SPNEGO可能會導致明顯的開銷/性能損失,則此方法可能有效。

3)第一次呼叫使用SPNEGO協商。一旦成功通過認證和信任,後續調用將使用GSS-API Kerberos。 在這種情況下,我不妨做下面的選項4)。

4)轉儲SPNEGO,使用「純」GSS-API Kerberos。 我可以通過自定義的Http頭或cookie來交換Kerberos票據。

是否有最佳做法?

作爲背景:客戶端和服務器應用程序都在我的控制之下,兩者都在java中實現,並且我都知道「說」Kerberos。 我選擇SPNEGO作爲概念驗證的「一個開始的地方」,並且幫助我進入了Kerberos和Single Sign On的世界,但這並不是一個硬性要求。

概念證明運行在帶有FreeIPA的OEL Linux服務器上(因爲這是我在地下城裏的),但可能的應用程序將是Windows/Active Directory。

*或顯著相比其他性能因素,如數據庫,XML的使用VS JSON的消息體等

**如果在未來,我們希望允許基於瀏覽器的訪問網絡服務,那麼SPNEGO將是最好的選擇。

+0

FYI這是爲Hadoop生態系統的一個現實的問題,因爲Kerberos是爲了再次驗證服務1月1主機,在主機5800不是5個SVCS ......他們實現了什麼(一)RPC調用,委託令牌_ (種MD5散列的同伴SVC主機之間共享)_和(b)爲REST調用和用戶界面,一個簽名餅乾_(除WebHDFS使用了STD令牌)_ –

+0

這是所有開源的,所以你可以檢查他們的代碼 - 而JIRA則詳細解釋了「簽名cookie」的基本原理,並提出異議/論證等。 (我認爲這是有關保護與SPNEGO YARN UI ...) –

+0

或者,你甚至可以安裝霍頓或Cloudera的Hadoop的沙箱,啓用Kerberos內部SVCS,也爲用戶界面,並看到捲曲和朋友發生了什麼_(除了針對WebHDFS - 請參閱上文)_ –

回答

0

在重新閱讀我的問題,我要問的問題是:

一)是SPNEGO足夠顯著,這是有道理的使用開銷,如果一個僅授權,而且「別的東西「應該用於隨後的服務呼叫?

B)是SPNEGO在事物的更大的計劃不顯著的開銷,並且可以用於所有的服務電話?

答案是:這取決於案件;而找出問題的關鍵是衡量有無SPNEGO服務呼叫的性能。

今天我用跑了4個基本的測試案例:

  1. 一個簡單的 「ping」 類型的Web服務,而無需SPNEGO
  2. 一個簡單的 「平」 型網絡服務隊,利用SPNEGO
  3. 一調用應用程序的登錄服務,而SPNEGO
  4. 到應用程序的登錄服務的調用,使用SPNEGO

每個測試卡萊d從一個ksh腳本循環60秒,並在那段時間內儘可能多地通過CURL調用。

在第一測試運行餘測量:

沒有SPNEGO

  • 15坪
  • 11登錄

隨着SPENGO

  • 8坪
  • 8登錄

這初步表明,使用SPNEGO我只能做一半的電話。但是,經過反思,即使考慮到使用的虛擬機規格不佳,測量的總體呼叫量也似乎很低。

經過一些Google搜索和調優後,我重新調用了所有使用IPV4的-4標誌調用CURL的測試。這給了以下內容:

沒有SPNEGO

  • 300多坪
  • 100+登錄

隨着SPNEGO

  • 19坪
  • 14登錄

這表明有和沒有SPNEGO有顯着差異!

雖然我需要做一些後端處理的真實世界的服務做進一步的測試,但這表明在通過SPNEGO進行身份驗證之後,「使用其他服務」用於後續服務調用存在強大的情況。

在他的評論參孫記錄了Hadoop的世界的先河,並增加了高度分散/可用服務主體

+0

附加考慮:您是否有專用的KDC *(例如Active Directory副本)*,還是必須與其他關鍵應用程序共享*(例如,Windows身份驗證,網絡驅動器身份驗證,Exchange身份驗證...) *這意味着您不得「意外」地將共享的KDC與DDoS類事件癱瘓(例如,在您自己的服務器中超時引發「重新連接雪崩」......這些事情發生) –

+0

您可能「接受」您的答案自己的問題作爲解決方案。請這樣做。它將複選框從灰色變成綠色,當我沒有足夠的時間瀏覽本網站時,這些是我喜歡挖掘的問題類型。 –

+0

@JohnRSmith,tx,我意識到這一點,並計劃在接下來的幾天內這樣做,但首先我會根據最新的測試結果對我的答案進行編輯,以及對另一個SO間接影響很大的SO問題這個問題 – FlyingSheep

0
  1. 的額外的架構考慮要回答你的第一個問題,GSS-SPNEGO可以包括多次往返。它不僅限於兩個。您應該實施會話處理,並在成功認證時發出客戶端應該在每個請求上呈現的會話cookie。當此cookie無效時,服務器將強制您重新進行身份驗證。這種方式只會在真正需要時引起談判成本。

  2. 根據您的應用程序設計,您可以選擇不同的身份驗證方法。在FreeIPA中,我們一直建議進行前端身份驗證,並允許應用程序重新使用前端對用戶進行身份驗證的事實。有關不同方法的詳細說明,請參閱http://www.freeipa.org/page/Web_App_Authentication

我建議你閱讀上面提到的鏈接,並檢查材料由我的同事做:https://www.adelton.com/他是一個數字Apache(以及Nginx的)模塊,可以幫助解耦從實際的Web應用程序時的身份驗證的作者與FreeIPA一起使用。

+0

考慮到那裏有大量的Kerberos知識,我幾乎在FreeIPA用戶郵件列表上發佈了這個問題...... – FlyingSheep

+0

是的,可以使用SPENGO進行多次往返旅行,因爲這是一次單程旅行:客戶可以預先獲得服務票據,將其附加到Authenticate標頭。我打算用不久的Python演示更新我的答案。 – FlyingSheep

+0

對不起,我的意思是Authorization header,而不是Authenticate。 – FlyingSheep

相關問題