介紹
Hadoop中的安全機制包括認證和授權。而Hadoop RPC中采用SASL(Simple Authentication and Security Layer,簡單認證和安全層)進行安全認證,具體認證方法涉及Kerberos和DIGEST-MD5兩種。
在這種機制中,Kerberos用於在客戶端和服務器端之間建立一條安全的網絡連接,之后客戶端可通過該連接從服務器端獲取一個密鑰。由於該密鑰僅有客戶端和服務器端知道,因此,接下來客戶端可使用該共享密鑰獲取服務的認證。使用共享密鑰進行安全認證(使用DIGEST-MD5協議)有多方面的好處:由於它只涉及認證雙方而不必涉及第三方應用(比如Kerberos中的KDC),因此安全且高效;客戶端也可以很方便地將該密鑰授權給其他客戶端,以讓其他客戶端安全訪問該服務。我們將基於共享密鑰生成的安全認證憑證稱為令牌(Token)。在Hadoop中,所有令牌主要由identifier和password兩部分組成,其中,identifier包含了該令牌中的基本信息,而password則是通過HMAC-SHA1作用在identifier和一個密鑰上生成的,該密鑰長度為20個字節並由Java的SecureRamdom類生成。Hadoop中共有三種令牌:委托令牌、塊訪問令牌和作業令牌。
委托令牌(Delegation Token)
授權令牌主要用於NameNode為客戶端進行認證。當客戶端初始訪問NameNode時,如果通過Kerberos認證,則NameNode會為它返回一個密鑰,之后客戶端只需借助該密鑰便可進行NameNode認證。為了防止重啟后密鑰丟失,NameNode將各個客戶端對應的密鑰持久化保存到鏡像文件中。默認情況下,所有密鑰每隔24小時更新一次,且NameNode總會保存前7小時的密鑰以保證之前的密鑰可用。
委托令牌是客戶端和NameNode之間的共享密鑰,可以使用DIGEST-MD5機制進行RPC驗證。委托令牌的格式如下:
令牌同時具有到期日期和最大發行日期。 令牌將在到期日期后到期,但即使過期到最大發布日期也可以更新。在對NameNode進行任何初始Kerberos身份驗證后,客戶端可以請求委托令牌。令牌還具有指定的令牌更新器。令牌更新程序在代表用戶更新令牌時使用其Kerberos憑據進行身份驗證。委托令牌最常見的用途是MapReduce作業,在這種情況下,客戶端將JobTracker指定為更新程序。委托令牌由NameNode的URL鍵入,並存儲在JobTracker的系統目錄中,以便將它們傳遞給任務。下圖是客戶首次與Namenode之間的交互。
數據塊訪問令牌(Block Access Token)
數據塊訪問令牌主要用於DataNode、SecondaryNameNode和Balancer為客戶端存取數據塊進行認證。當客戶端向NameNode發送文件訪問請求時,如果通過NameNode認證以及文件訪問權限檢查,則NameNode會將該文件對應的數據塊位置信息和數據塊訪問密鑰發送給客戶端,客戶端需憑借數據塊訪問密鑰才可以讀取一個DataNode上的數據塊。NameNode會通過心跳將各個數據塊訪問密鑰分發給DataNode、SecondaryNameNode和Balancer。需注意的是,數據塊訪問密鑰並不會持久化保存到磁盤上,默認情況下,它們每隔10小時更新一次並通過心跳通知各個相關組件。
塊訪問令牌的格式如下,其中keyID標識用於生成令牌的私鑰,accessMode可以是READ,WRITE,COPY,REPLACE的任意組合。
用戶向Namenode申請訪問文件的過程如下:
作業令牌(Job Token)
作業令牌主要用於TaskTracker對任務進行認證。用戶提交作業到JobTracker后,JobTracker會為該作業生成一個作業令牌,並寫到該作業對應的HDFS系統目錄下。當該作業的任務調度到各個TaskTracker上后,將從HDFS上獲取作業令牌。該令牌可用於任務與TaskTracker之間進行相互認證(比如Shuffle階段的安全認證)。與數據塊訪問令牌一樣,作業令牌也不會持久化保存到內存中,一旦JobTracker重新啟動,就會生成新的令牌。由於每個作業對應的令牌已經寫入HDFS,所以之前的仍然可用。
基於令牌的認證機制的優勢
相比於單純使用Kerberos,基於令牌的安全認證機制有很多優勢,具體如下。
❑性能:在Hadoop集群中,同一時刻可能有成千上萬的任務正在運行。如果我們使用Kerberos進行服務認證,則所有任務均需要KDC中AS提供的TGT,這可能使得KDC成為一個性能瓶頸,而采用令牌機制則可避免該問題。
❑憑證更新:在Kerberos中,為了保證TGT或者服務票據的安全,通常為它們設置一個有效期,一旦它們到期,會對其進行更新。如果直接采用Kerberos驗證,則需要將更新之后的TGT或者服務票據快速推送給各個Task,這必將帶來實現上的煩瑣。如果采用令牌,當令牌到期時,只需延長它的有效期而不必重新生成令牌。此外,Hadoop允許令牌在過期一段時間后仍可用,從而為過期令牌更新留下足夠時間。
❑安全性:用戶從Kerberos端獲取TGT后,可憑借該TGT訪問多個Hadoop服務,因此,泄露TGT造成的危害遠比泄露令牌大。
❑靈活性:在Hadoop中,令牌與Kerberos之間沒有任何依賴關系,Kerberos僅僅是進行用戶身份驗證的第一道防線,用戶完全可以采用其他安全認證機制替換Kerberos。因此,基於令牌的安全機制具有更好的靈活性和擴展性。