Hadoop平台安全机制Kerberos认证
日前筆者在使用flume采集數據直接入到Hadoop平臺HDFS上時,由于Hadoop平臺采用了Kerberos認證機制。flume配置上是致辭kerberos認證的,但由于flume要采集的節點并不在集群內,所以需要學習Kerberos在Hadoop上的應用。
1、Kerberos協議
Kerberos協議:
Kerberos協議主要用于計算機網絡的身份鑒別(Authentication),?其特點是用戶只需輸入一次身份驗證信息就可以憑借此驗證獲得的票據(ticket-granting ticket)訪問多個服務,即SSO(Single Sign On)。由于在每個Client和Service之間建立了共享密鑰,使得該協議具有相當的安全性。
條件
先來看看Kerberos協議的前提條件:
如下圖所示,Client與KDC,?KDC與Service?在協議工作前已經有了各自的共享密鑰,并且由于協議中的消息無法穿透防火墻,這些條件就限制了Kerberos協議往往用于一個組織的內部,?使其應用場景不同于X.509 PKI。
?
過程
Kerberos協議分為兩個部分:
1 . Client向KDC發送自己的身份信息,KDC從Ticket Granting Service得到TGT(ticket-granting ticket),?并用協議開始前Client與KDC之間的密鑰將TGT加密回復給Client。
此時只有真正的Client才能利用它與KDC之間的密鑰將加密后的TGT解密,從而獲得TGT。
(此過程避免了Client直接向KDC發送密碼,以求通過驗證的不安全方式)
2. Client利用之前獲得的TGT向KDC請求其他Service的Ticket,從而通過其他Service的身份鑒別。
?Kerberos協議的重點在于第二部分,簡介如下:
?
1.????Client將之前獲得TGT和要請求的服務信息(服務名等)發送給KDC,KDC中的Ticket Granting Service將為Client和Service之間生成一個Session Key用于Service對Client的身份鑒別。然后KDC將這個Session Key和用戶名,用戶地址(IP),服務名,有效期,?時間戳一起包裝成一個Ticket(這些信息最終用于Service對Client的身份鑒別)發送給Service,?不過Kerberos協議并沒有直接將Ticket發送給Service,而是通過Client轉發給Service.所以有了第二步。
2.????此時KDC將剛才的Ticket轉發給Client。由于這個Ticket是要給Service的,不能讓Client看到,所以KDC用協議開始前KDC與Service之間的密鑰將Ticket加密后再發送給Client。同時為了讓Client和Service之間共享那個秘密(KDC在第一步為它們創建的Session Key),?KDC用Client與它之間的密鑰將Session Key加密隨加密的Ticket一起返回給Client。
3.????為了完成Ticket的傳遞,Client將剛才收到的Ticket轉發到Service.?由于Client不知道KDC與Service之間的密鑰,所以它無法算改Ticket中的信息。同時Client將收到的Session Key解密出來,然后將自己的用戶名,用戶地址(IP)打包成Authenticator用Session Key加密也發送給Service。
4.????Service?收到Ticket后利用它與KDC之間的密鑰將Ticket中的信息解密出來,從而獲得Session Key和用戶名,用戶地址(IP),服務名,有效期。然后再用Session Key將Authenticator解密從而獲得用戶名,用戶地址(IP)將其與之前Ticket中解密出來的用戶名,用戶地址(IP)做比較從而驗證Client的身份。
5.????如果Service有返回結果,將其返回給Client。
總結
概括起來說Kerberos協議主要做了兩件事
1.????Ticket的安全傳遞。
2.????Session Key的安全發布。
再加上時間戳的使用就很大程度上的保證了用戶鑒別的安全性。并且利用Session Key,在通過鑒別之后Client和Service之間傳遞的消息也可以獲得Confidentiality(機密性), Integrity(完整性)的保證。不過由于沒有使用非對稱密鑰自然也就無法具有抗否認性,這也限制了它的應用。不過相對而言它比X.509 PKI的身份鑒別方式實施起來要簡單多了。
從kerberos協議的基礎原理,在Hadoop上的應用,主要也就是兩個過程,KDC為客戶端上生成TGT,客戶端和服務端通過TGT認證后通信。
2、Hadoop集群內應用kerberos認證
Hadoop集群內部使用Kerberos進行認證
具體的執行過程可以舉例如下:
使用kerberos進行驗證的原因
- 可靠?Hadoop 本身并沒有認證功能和創建用戶組功能,使用依靠外圍的認證系統
- 高效?Kerberos使用對稱鑰匙操作,比SSL的公共密鑰快
- 操作簡單?用戶可以方便進行操作,不需要很復雜的指令。比如廢除一個用戶只需要從Kerbores的KDC數據庫中刪除即可。
3、Hadoop平臺上添加Kerberos認證,首要兩步:
1)第一步自然是部署KDC,并配置KDC服務器上的相關文件,其中/etc/krb5.conf要復制到集群內所有機子,并創建principal數據庫。2)創建認證規則principals和keytab,這個很重要,就是生成每個客戶端相應的秘鑰,Keytab是融合主機和Linux上賬號而生成的,復制keytab到相應節點。
可參考:http://blog.chinaunix.net/uid-1838361-id-3243243.html
4、Hadoop通過kerberos安全認證的分析
Hadoop加入Kerberos認證機制,使得集群中的節點是信賴的。Kerberos首先通過KDC生成指定節點包含主機和賬號信息的密鑰,然后將認證的密鑰在集群部署時事先放到可靠的節點上。集群運行時,集群內的節點使用密鑰得到認證,只有被認證過節點才能正常使用。企圖冒充的節點由于沒有事先得到的密鑰信息,無法與集群內部的節點通信。防止了惡意的使用或篡改Hadoop集群的問題,確保了Hadoop集群的可靠安全。
1)Hadoop的安全問題
——用戶到服務器的認證問題
NameNode,,JobTracker上沒有用戶認證
用戶可以偽裝成其他用戶入侵到一個HDFS 或者MapReduce集群上。
DataNode上沒有認證
Datanode對讀入輸出并沒有認證。導致如果一些客戶端如果知道block的ID,就可以任意的訪問DataNode上block的數據
JobTracker上沒有認證
可以任意的殺死或更改用戶的jobs,可以更改JobTracker的工作狀態
——服務器到服務器的認證問題
沒有DataNode, TaskTracker的認證
用戶可以偽裝成datanode ,tasktracker,去接受JobTracker, Namenode的任務指派。
2)Kerberos解決方案
kerberos實現的是機器級別的安全認證,也就是前面提到的服務到服務的認證問題。事先對集群中確定的機器由管理員手動添加到kerberos數據庫中,在KDC上分別產生主機與各個節點的keytab(包含了host和對應節點的名字,還有他們之間的密鑰),并將這些keytab分發到對應的節點上。通過這些keytab文件,節點可以從KDC上獲得與目標節點通信的密鑰,進而被目標節點所認證,提供相應的服務,防止了被冒充的可能性。
——解決服務器到服務器的認證
由于kerberos對集群里的所有機器都分發了keytab,相互之間使用密鑰進行通信,確保不會冒充服務器的情況。集群中的機器就是它們所宣稱的,是可靠的。
防止了用戶偽裝成Datanode,Tasktracker,去接受JobTracker,Namenode的任務指派。
——解決client到服務器的認證
Kerberos對可信任的客戶端提供認證,確保他們可以執行作業的相關操作。防止用戶惡意冒充client提交作業的情況。
用戶無法偽裝成其他用戶入侵到一個HDFS 或者MapReduce集群上
用戶即使知道datanode的相關信息,也無法讀取HDFS上的數據
用戶無法發送對于作業的操作到JobTracker上
——對用戶級別上的認證并沒有實現
無法控制用戶提交作業的操作。不能夠實現限制用戶提交作業的權限。不能控制哪些用戶可以提交該類型的作業,哪些用戶不能提交該類型的作業。這個可以通過ACL來控制,對具體文件的讀寫訪問進行有效管理。此前筆者對ACL有一個初步的了解,見博客http://blog.csdn.net/fjssharpsword/article/details/51280335
實際上,Hadoop平臺自身也在不斷完善,而對其集成的組件和整體機制了解,筆者也在不斷加深,此前的一些錯誤認識也在不斷調整。
總結
以上是生活随笔為你收集整理的Hadoop平台安全机制Kerberos认证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (转载)机器学习知识点(十五)从最大似然
- 下一篇: HtmlUnit设置代理并解析IFram