本文主要闡述HDFSRPC安全認證相關的實現。主要介紹Token相關的實現。
寫在前面
相關blog
https://blog.csdn.net/hncscwc/article/details/124722784
https://blog.csdn.net/hncscwc/article/details/124958357
Token由來
在探究完Kerberos,我一直在想一個問題,rpcConnection已經完成了驗證,那為何還需要token?首先需要對yarn有一定的瞭解,我們知道mapreduce框架是把目標變成多個map,然後reduce出結果。Yarn在執行多個map、reduce的時候,是透過container來執行的。Container本質上是一個獨立程式,執行了yarn分配的任務。當Container程序要去訪問hdfs的時候,如果使用Kerberos,kdc驗證服務存在的不可靠和效能問題(多機多container併發極高)必然會極大的限制大資料平臺的穩定,尤其是當有大量使用者請求需要透過kdc來獲取tgt票據時。因此Token認證被引入充當kerberos的補充,在兼顧安全認證的同時,效能沒有較大的損耗。在hadoop中,token主要包括DelegationToken,以及其他一些token,例如之前檔案介紹過的BlockToken,以及yarn中一系列的token。
Token中yarn container流程圖
Token的應用
當完成kerberos驗證以後,服務主體的可以透過getDelegationToken介面來獲取token。當服務主體下面的的程序需要去訪問hdfs的時候,可以透過token來訪問。
Token的驗證也在rpc的sasl中,但是步驟跟簡單,如下:
server當收到client negotiate請求以後,會返回多個auth。
auths {
method: "TOKEN"
mechanism: "DIGEST-MD5"
protocol: ""
serverId: "default"
challenge: "realm=\"default\",nonce=\"svFDnzmhsk40oN5z6vnUFgYgawR17w+XvxiX1Z3M\",charset=utf-8,algorithm=md5-sess"
}
auths {
method: "KERBEROS"
mechanism: "GSSAPI"
protocol: "root"
serverId: "node17"
}
client接收完negotiate應答後,可以透過服務主體獲取的token來initSaslClient,然後傳送Initiate請求。Server接收到Initiate請求,會透過token初始化saslServer,不同於Kerberos,saslserver驗證完token會立馬complete。這時候server會直接返回success應答給客戶端。客戶端接收到success應答以後即完成SaslClient的初始化。
可以看出token驗證的整個過程更簡單,而且本質上就是server驗證了一下client的token,消耗更少,效能更高。
token驗證本身與使用者密碼生成沒有任何關係,主要都是java原生類來實現。程式碼如下:
繼續閱讀https://blog.csdn.net/zfpigpig/article/details/136710003