Kerberos是誕生於上個世紀90年代的計算機認證協議,被廣泛應用於各大操作系統和Hadoop生態系統中。了解Kerberos認證的流程將有助於解決Hadoop集群中的安全配置過程中的問題。為此,本文根據最近閱讀的一些材料,詳細介紹Kerberos認證流程。歡迎斧正!
Kerberos解決什么問題?
簡單地說,Kerberos提供了一種單點登錄(SSO)的方法。考慮這樣一個場景,在一個網絡中有不同的服務器,比如,打印服務器、郵件服務器和文件服務器。這些服務器都有認證的需求。很自然的,不可能讓每個服務器自己實現一套認證系統,而是提供一個中心認證服務器(AS-Authentication Server)供這些服務器使用。這樣任何客戶端就只需維護一個密碼就能登錄所有服務器。 因此,在Kerberos系統中至少有三個角色:認證服務器(AS),客戶端(Client)和普通服務器(Server)。客戶端和服務器將在AS的幫助下完成相互認證。 在Kerberos系統中,客戶端和服務器都有一個唯一的名字,叫做Principal。同時,客戶端和服務器都有自己的密碼,並且它們的密碼只有自己和認證服務器AS知道。
簡化的Kerberos認證流程
首先來看現實生活中的類似的一個例子。假如你要去社區事務中心去辦理居住證,但是社區事務中心並不能確定你的身份,因此需要你去派出所開據證明,證明你就是你。那么,通常的流程是這樣的:
1. 你帶好身份證和相應的材料去派出所,向JCSS說明你要辦居住證,需要開據相應的證明。
2. JCSS根據他們的內部系統,核實了你提供的材料並開據了證明,上面蓋有派出所的紅章。
3. 你再拿着這個證明再去社區事務中心,社區事務中心的工作人員看到了JCSS提供的證明,就可以確定你的身份,便開始給你辦理業務。
和上面的例子中的流程非常相似,Kerberos的認證流程分成了以下4個步驟,見下圖。 符號說明:
- client_principal, server_principal: 分別表示客戶端和服務器的名字。
- Tc,s: 表示AS發給客戶端c的票據,該票據包含有用於和服務器s通信認證的相關信息。
- {Kc,s; server_principal,...}Kc: 表示票據的內容,{}里面的為具體內容。Kc為客戶端的密碼,表示該票據由客戶端的密碼加密。其它的類似。
1. 客戶端向服務器端發起請求,請求的內容是:我是誰(客戶端的principal),我要和誰通信(服務器的principal)
2. AS收到請求以后,隨機生成一個密碼Kc,s (Session Key),並且生成了以下兩個票據(Ticket)返回給客戶端:
- Tc,s={Kc,s; server_principal,...}Kc - 該票據是給客戶端的,大括號里面為票據中的內容,后面的Kc為客戶端的密碼,表示該票據用客戶端的密碼加密了。
- Ts,c={Kc,s; client_principal,...}Ks - 大括號里面為票據中的內容,后面的Ks為服務器的密碼,表示該票據用服務器的密碼加密了。該票據是給服務器的,但是AS並不直接給服務器,而是交給了客戶端再由客戶端交給服務器。因為該票據由服務器的密碼加密了,所以客戶端無法偽造和篡改。
注:Tc,s和Ts,c這兩個符號是本文為了描述方便而引入的,在別的文獻中沒有。
3. 客戶端拿到了第二步中的兩個票據后,首先用自己的密碼解開票據Tc,s得到Kc,s,然后生成一個認證因子(Authenticator),其內容如下:
- Authenticator: {time_stamp, Ts,c_checksum,...}Kc,s
其中主要包括當前時間和Ts,c的校驗碼,並且用SessionKey Kc,s加密。
客戶端將Authenticator和Ts,c同時發給服務器。
4.服務器首先用自己的密碼解開Ts,c,拿到SessionKey Kc,s,然后用Kc,s解開Authenticator,並做如下檢查:
- 檢查Authenticator中的時間戳是不是在當前時間上下5分鍾以內,並且檢查該時間戳是否首次出現。如果該時間戳不是第一次出現,那說明有人截獲了之前客戶端發送的內容,進行Replay攻擊。
- 檢查checksum是否正確。
如果都正確,客戶端就通過了認證。 服務器段可選擇性地給客戶端回復一條消息來完成雙向認證,內容如下:
- {time_stamp}Kc,s
其中包括客戶端發送過去的時間戳,並且用SessionKey Kc,s加密。
客戶端通過解開該消息,通過比較服務器返回的時間戳和自己發送過去的時間戳是否一致,來驗證服務器。 通過以上4個步驟,客戶端和服務器就完成了雙向認證。隨后,客戶端和服務器就可以用session key來加密需要傳輸的內容。
完整的Kerberos認證流程

- Authenticator = {time_stamp, checksum, ...}Kc,tgs
- Ttgs,c - 第二步從AS返回的票據
- server_principal, ...
- Tc,s={Kc,s, server_principal,...}Kc,tgs - 這是給客戶端的票據,Kc,s是客戶端與服務器之間的SessionKey,用客戶端和TGS之間的SessionKey(Kc,tgs)加密。區別就在這里了,給客戶端的票據不再用客戶端的密碼加密,而是用客戶端和Tgs之間的SessionKey加密。
- Ts,c={Kc,s, client_principal,...}Ks - 這是給服務器的票據,用服務器的密碼加密。
- Authenticator={time_stamp, Ts,c_checksum,...}Kc,s
- Ts,c={Kc,s, client_principal,...}Ks。
- {time_stamp}Kc,s
小結與參考資料
本文詳細介紹了Kerberos的認證流程,了解Kerberos的認證流程對配置Hadoop的安全性很有必要。以后有機會再分享Kerberos在Hadoop生態系統中的具體應用。本文主要參考了以下資料:- http://gost.isi.edu/publications/kerberos-neuman-tso.html
- http://blog.sina.com.cn/s/blog_5384e78b0100fhdt.html