Hadoop安全機制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的身份鑒別方式實施起來要簡單多了。

 

1. 背景

在Hadoop1.0.0或者CDH3 版本之前, hadoop並不存在安全認證一說。默認集群內所有的節點都是可靠的,值得信賴的。用戶與HDFS或者M/R進行交互時並不需要進行驗證。導致存在惡意用戶偽裝成真正的用戶或者服務器入侵到hadoop集群上,惡意的提交作業,修改JobTracker狀態,篡改HDFS上的數據,偽裝成NameNode 或者TaskTracker接受任務等。 盡管在版本0.16以后, HDFS增加了文件和目錄的權限,但是並沒有強認證的保障,這些權限只能對偶然的數據丟失起保護作用。惡意的用戶可以輕易的偽裝成其他用戶來篡改權限,致使權限設置形同虛設。不能夠對Hadoop集群起到安全保障。

在Hadoop1.0.0或者CDH3版本后,加入了Kerberos認證機制。使得集群中的節點就是它們所宣稱的,是信賴的。Kerberos可以將認證的密鑰在集群部署時事先放到可靠的節點上。集群運行時,集群內的節點使用密鑰得到認證。只有被認證過節點才能正常使用。企圖冒充的節點由於沒有事先得到的密鑰信息,無法與集群內部的節點通信。防止了惡意的使用或篡改Hadoop集群的問題,確保了Hadoop集群的可靠安全。

2. Hadoop 安全問題

2.1  用戶到服務器的認證問題

  • NameNode,,JobTracker上沒有用戶認證

用戶可以偽裝成其他用戶入侵到一個HDFS 或者MapReduce集群上。

  • DataNode上沒有認證

Datanode對讀入輸出並沒有認證。導致如果一些客戶端如果知道block的ID,就可以任意的訪問DataNode上block的數據

  • JobTracker上沒有認證

可以任意的殺死或更改用戶的jobs,可以更改JobTracker的工作狀態

2.2  服務器到服務器的認證問題

  • 沒有DataNode, TaskTracker的認證

用戶可以偽裝成datanode ,tasktracker,去接受JobTracker, Namenode的任務指派。

3. Kerberos能解決的Hadoop安全認證問題

kerberos實現的是機器級別的安全認證,也就是前面提到的服務到服務的認證問題。事先對集群中確定的機器由管理員手動添加到kerberos數據庫中,在KDC上分別產生主機與各個節點的keytab(包含了host和對應節點的名字,還有他們之間的密鑰),並將這些keytab分發到對應的節點上。通過這些keytab文件,節點可以從KDC上獲得與目標節點通信的密鑰,進而被目標節點所認證,提供相應的服務,防止了被冒充的可能性。

  • 解決服務器到服務器的認證

由於kerberos對集群里的所有機器都分發了keytab,相互之間使用密鑰進行通信,確保不會冒充服務器的情況。集群中的機器就是它們所宣稱的,是可靠的。

防止了用戶偽裝成Datanode,Tasktracker,去接受JobTracker,Namenode的任務指派。

  • 解決client到服務器的認證

Kerberos對可信任的客戶端提供認證,確保他們可以執行作業的相關操作。防止用戶惡意冒充client提交作業的情況。

用戶無法偽裝成其他用戶入侵到一個HDFS 或者MapReduce集群上

用戶即使知道datanode的相關信息,也無法讀取HDFS上的數據

用戶無法發送對於作業的操作到JobTracker上

  • 對用戶級別上的認證並沒有實現

無法控制用戶提交作業的操作。不能夠實現限制用戶提交作業的權限。不能控制哪些用戶可以提交該類型的作業,哪些用戶不能提交該類型的作業。這些由ACL模塊控制(參考)

4. Kerberos工作原理介紹

4.1  基本概念

Princal(安全個體):被認證的個體,有一個名字和口令

KDC(key distribution center ) : 是一個網絡服務,提供ticket 和臨時會話密鑰

Ticket:一個記錄,客戶用它來向服務器證明自己的身份,包括客戶標識、會話密鑰、時間戳。

AS (Authentication Server): 認證服務器

TSG(Ticket Granting Server): 許可證服務器

4.2  kerberos 工作原理

4.2.1  Kerberos協議

Kerberos可以分為兩個部分:

  • Client向KDC發送自己的身份信息,KDC從Ticket Granting Service得到TGT(ticket-granting ticket), 並用協議開始前Client與KDC之間的密鑰將TGT加密回復給Client。此時只有真正的Client才能利用它與KDC之間的密鑰將加密后的TGT解密,從而獲得TGT。(此過程避免了Client直接向KDC發送密碼,以求通過驗證的不安全方式)
  • Client利用之前獲得的TGT向KDC請求其他Service的Ticket,從而通過其他Service的身份鑒別

4.3 Kerberos認證過程

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。

4.4  kerberos在Hadoop上的應用

Hadoop集群內部使用Kerberos進行認證

具體的執行過程可以舉例如下:

4.5  使用kerberos進行驗證的原因

  • 可靠 Hadoop 本身並沒有認證功能和創建用戶組功能,使用依靠外圍的認證系統
  • 高效 Kerberos使用對稱鑰匙操作,比SSL的公共密鑰快
  • 操作簡單 用戶可以方便進行操作,不需要很復雜的指令。比如廢除一個用戶只需要從Kerbores的KDC數據庫中刪除即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM