聊聊Hadoop安全認證體系:Delegation Token和Block Access Token
前言
本文繼續上一篇Hadoop安全認證方面的內容主題,來簡單聊聊Hadoop內部的其它認證體系:Delegation Token(授權令牌認證)和Block Access Token(塊訪問認證)。主要來聊聊這兩者間的差異,順帶也會提及一些Kerberos認證的一點內容。這裡不深挖其中的技術細節,整體闡述會比較簡單,明瞭。
Kerberos認證
Kerberos認證是業界較為成熟的一種認證體系,其中涉及到三方的通訊。大致過程可描述為如下兩大步驟:
- 使用者請求KDC(祕鑰管理中心服務),表明自己身份以及想要訪問的服務,如果身份驗證通過,獲取憑證(TGT)
- 得到TGT後,使用者再憑藉此請求實際服務
那麼這套認證過程會有什麼問題呢?主要有以下幾點:
第一點,過程比較複雜,認證過程還涉及到第三方服務。
第二點,KDC服務可能存在單點瓶頸問題,尤其當有大量的使用者請求需要通過KDC來獲取TGT憑證時。
於是乎,一種簡單化的認證體系衍生而出了。
Delegation Token
這裡我們說的Delegation Token指的是一種“授權”認證,它和Kerberos的授權相比,不同的點在於:使用者被“授權”了一次之後,可以接著使用“授權令牌”在後續的請求過程中,無須再次“授權”過程。當然,這裡會存在令牌過期更新的問題。
Hadoop內部的Delegation Token的產生,初期是由NameNode和使用者之間共享的一個安全祕鑰,經過一系列的運算,得到。而這個安全祕鑰,只允許由使用者和NameNode私自保管,是被保護起來的。
每個使用者經過初期驗證後,會從NN中獲取一個授權Token。同時使用者需要告知NN它的Token更新者(Renewer)是誰。這樣的話,每當令牌失效的時候,NN只允許給定的使用者進行更新令牌期限的操作。這個更新者資訊也是會被加入到Token資訊中。
Delegation Token的具體設計如下:
TokenID = {ownerID, renewerID, issueDate, maxDate, sequenceNumber}
TokenAuthenticator = HMAC-SHA1(masterKey, TokenID)
Delegation Token = {TokenID, TokenAuthenticator}
NN在這裡會選擇隨機的masterKey值來生成Token,並且將這些生成好後的活躍的Token資訊儲存在記憶體中,進行後續的請求驗證。當用戶主動刪除Token或者Token過期時,NN會將相應的Token從記憶體中清除。
當客戶端向NN進行請求認證的時候,首先會發送TokenId到NN,TokenId其實代表的就是對應的唯一的Token資訊。NN通過儲存的masterKey資訊和TokenId重新計算出完整Token資訊,然後再與客戶端的Token資訊做彼此驗證。這裡masterKey的資訊是需要被NN持久化出去的。
Block Access Token
在早期DataNode中,一個未經認證過的客戶端只要提供對應的blockId,是可以隨意讀寫資料到DN上的。因此在這裡,我們是否能夠提供一個塊訪問認證的一種機制呢,以此表明使用者是被允許訪問目標塊資料的。同樣的,這也是一種令牌憑證資訊,不過它會比Delegation Token資訊更加輕量級一些。
Block Access Token和Delegation Token有一些方面是類似,過程如下
- 都是由NN返回給客戶端
- 然後客戶端訪問DN的Block資料時,將從NN獲取到的Token與DN上的Token資訊做驗證。
換句話說,每次客戶端會攜帶著從NN獲取的Token資訊,做塊資料的訪問。
在設計上,Block Access Token是更加輕量級並且時效性較短的。Block Access Token的生成採用的是一種對稱加密的演算法方式。簡單來說,NN和DN會共享一個私密的祕鑰資訊,NN會在DN註冊的時候給予其隨機生成的祕鑰資訊。然後通過以下方式,進行Token的生成
TokenID = {expirationDate, keyID, ownerID, blockID, accessModes}
TokenAuthenticator = HMAC-SHA1(key, TokenID)
Block Access Token = {TokenID, TokenAuthenticator}
這裡的KeyID即為私密祕鑰資訊。DN在驗證的時候,通過正向運算,以此來比較客戶端的Token是否是有效的。
因為Block Access Token沒有renew機制,NN採用定期更新的方式來更新它所持有的祕鑰資訊,並且移除過期的Token資訊。新祕鑰資訊通過心跳的方式傳達到各個DN,DN接收到資訊後,移除自身內部維護的過期祕鑰資訊,並加入新的祕鑰資訊,用於後面的訪問驗證。通過NN/DN這種記憶體滾動更新的方式,NN實際也不需要持久化這些祕鑰資訊了。
引用
[1].https://issues.apache.org/jira/browse/HADOOP-4487
[2].https://issues.apache.org/jira/secure/attachment/12428537/security-design.pdf