文章來源:[http://www.cnblogs.com/luxianghao/p/5269739.html]
一盟广,引言
Kerberos簡單來說就是一個用于安全認證第三方協(xié)議廷粒,它采用了傳統(tǒng)的共享密鑰的方式鸳址,實現(xiàn)了在網(wǎng)絡(luò)環(huán)境不一定保證安全的環(huán)境下戳葵,client和server之間的通信就乓,適用于client/server模型,由MIT開發(fā)和實現(xiàn)拱烁。
Kerberos的神秘之處在于生蚁,它并不要求通信雙方所在的網(wǎng)絡(luò)環(huán)境是安全的,即使通信過程中數(shù)據(jù)被截取或者篡改依然不會影響它的正常工作戏自,它提供的認證是雙向的邦投,不僅能保證Server不被錯誤的Client使用,同時也能保證Client不使用錯誤的Server擅笔。同時Kerberos又嚴重依賴于時間志衣,時間戳也是Kerberos用來保證通信安全的重要手段屯援,這個一般通過通信雙方同時訪問同一個時間服務(wù)器來實現(xiàn)。Kerberos也能達到單點登錄的效果念脯,即當Client通過了Kerberos server的認證后狞洋,便可以訪問多個Real Server。
二和二,Kerberos原理淺析
在實際的應(yīng)有場景中通常有三個角色徘铝,即需要訪問服務(wù)的Client耳胎,提供服務(wù)的Application Server惯吕,以及提供安全認證的第三方Kerberos服務(wù)器KDC(Key Distribution Center)。它們彼此之間的認證怕午、通信的數(shù)據(jù)流如下圖所示废登。
仔細研究過上圖之后,你可能會發(fā)現(xiàn)你能看明白的東西實在有限郁惜,而想要把Kerberos原理弄明白實在不是一件容易的事堡距,不過可以慶幸的是Kerberos是用傳統(tǒng)的共享密鑰的方式實現(xiàn)的,這個概念對大家來說并不陌生兆蕉,同時Kerberos認證還加了時間戳羽戒,有效時間,信息對比等伎倆虎韵,所以花時間細細讀下來你依然能看明白易稠,如果此時你就迫不及待的想研究的話你可以戳這里,這里包蓝,或者這里∈簧纾現(xiàn)在,我們來討論下Kerberos的認證的一個部分测萎,我認為只要這個部分理解了亡电,其他的都可以遞推出來。如下圖:
Client master key: KDC中存儲的Client的密鑰
Server master key: KDC中存儲的Server的密鑰
Sclient-Server:Client與Server之間的會話密鑰
Client Info:記錄了Client本身的Ip等基本信息
首先 Client詢問KDC硅瞧,我想訪問某個Server份乒,然后KDC會將會話密鑰Sclient-Server用Client master key加密后傳送給Client;與此同時腕唧,KDC也會將會話密鑰Sclient-Server連同Client的基本信息打包用Server master key加密也發(fā)給Client或辖,并經(jīng)Client轉(zhuǎn)發(fā)給Server,至此Client與KDC的交互完成四苇。
然后孝凌,Client用自己的master key解密KDC傳過來的第一個包,解密后獲得會話密鑰Sclient-Server月腋,并用這個密鑰加密自己的的信息和時間戳打包后傳送給Server蟀架,此時Client開始和Server交互瓣赂,如下圖:Server會收到兩個數(shù)據(jù)包,一個用會話密鑰加密片拍,一個用自己的master key加密煌集,Server先用自己的master key解密獲取會話密鑰和一份關(guān)于Client的信息,然后Server拿到解密后獲取到的會話密鑰再解開另外一個數(shù)據(jù)包捌省,獲得另一份關(guān)于Client的信息和時間戳苫纤,至此Client和Server的交互完成。
下面我們解釋下這樣傳輸數(shù)據(jù)的原因纲缓,為什么傳遞這些數(shù)據(jù)
1卷拘,上面有個數(shù)據(jù)包是KDC經(jīng)Client轉(zhuǎn)發(fā)給Server的,為什么不直接發(fā)給Server祝高?
因為Server可能給多個Client提供服務(wù)栗弟,這樣Server需要維護一個Client和會話密鑰的對應(yīng)表,這對Server是一個負擔工闺。
此外乍赫,因為網(wǎng)絡(luò)傳輸?shù)牟淮_定性可能Client和Server并不能都及時獲取到會話密鑰,假如有一方獲取失敗陆蟆,那么Client就不能訪問Server
2雷厂,為什么要發(fā)兩份關(guān)于Client的信息給Server?
通過這兩份數(shù)據(jù)的對比叠殷,Server就能判斷出是不是對的Client在訪問服務(wù)改鲫。
3,Client是如何判斷自己在訪問對的Server呢溪猿?
因為Client給Server的一個數(shù)據(jù)包是用Server的master key來加密的所以只有對的Server才能解密钩杰。
4,為什么要用會話密鑰
通信方的master key是長期有效的诊县,如果在網(wǎng)絡(luò)上傳輸讲弄,一旦被截取,理論上來說只要有足夠的時間是可以破解的依痊,所以我們才用臨時的會話密鑰來通信避除,一段時間后會話密鑰會過期,同時時間戳也防止了胸嘁,惡意用戶重復使用同一個數(shù)據(jù)包瓶摆。
5,為什么要用時間戳性宏?
如果Client向Server傳送的數(shù)據(jù)包被其他的Client截取群井,然后自己拿來向Server請求服務(wù)這,這樣就會出問題毫胜,那么引入時間戳后书斜,Server收到請求后將從解密后的數(shù)據(jù)包中獲得的時間戳和當前時間對比诬辈,一旦超過一定范圍將直接拒絕請求;所以荐吉,正如前面所說焙糟,Kerberos高度依賴時間同步服務(wù)。
事實上這個并不是Kerberos認證的整個過程样屠,KDC實際上由AS和TGS兩部分組成穿撮,你可以將TGS視作一個Server,然后還沿用上面所說的步驟來分析痪欲,這樣就可以基本上梳理出Client訪問Server的一個完整的過程了悦穿。
這些東西可能依然難于理解,你可以借助Kerberos經(jīng)典會話中的場景來理解勤揩,請戳這里或者這里咧党。
三秘蛔,Kerberos應(yīng)用
1陨亡,安裝Kerberos,搭建Kerberos環(huán)境深员,用yum安裝下列包即可
krb5-devel.x86_64
krb5-libs.x86_64
krb5-workstation.x86_64
**** **krb5-server.x86_64 (僅server端需安裝)******
如果你想了解詳細的安裝步驟以及配置负蠕,請戳這里
這里我們僅貼出配置krb5.conf&kdc.conf中的主要部分
/etc/krb5.conf 中包含了realm的信息,里邊設(shè)置了server的地址倦畅,從而讓Client能夠找到Server遮糖,示例如下
<pre style="margin: 0px 0px 0px 22px; font-size: 1rem;">[libdefaults]
default_realm = ATHENA.MIT.EDU
[realms]
ATHENA.MIT.EDU = {
kdc = kerberos.mit.edu
admin_server = kerberos.mit.edu
}</pre>
/var/kerberos/krb5kdc/kdc.conf中主要保存了server端的配置,包括server端口叠赐,數(shù)據(jù)庫存放地址欲账,票據(jù)有效期等,示例如下:
<pre style="margin: 0px 0px 0px 22px; font-size: 1rem;">[kdcdefaults]
kdc_ports = 88,750
[realms]
ATHENA.MIT.EDU = {
kadmind_port = 749
max_life = 12h 0m 0s
max_renewable_life = 7d 0h 0m 0s
database_name = /var/krb5kdc/principal
acl_file = /var/krb5kdc/kadm5.acl
}</pre>
2芭概, 名詞解釋
KDC:即Key Distribution Center, 密鑰分發(fā)中心赛不,負責頒發(fā)憑證
Kinit:Kerberos認證命令,可以使用密碼或者Keytab罢洲。
Realm:Kerberos的一個管理域踢故,同一個域中的所有實體共享同一個數(shù)據(jù)庫
Principal:Kerberos主體,即我們通常所說的Kerberos賬號(name@realm) 惹苗,可以為某個服務(wù)或者某個用戶所使用
Keytab:以文件的形式呈現(xiàn)殿较,存儲了一個或多個Principal的長期的key,用途和密碼類似桩蓉,用于kerberos認證登錄淋纲;其存在的意義在于讓用戶不需要明文的存儲密碼,和程序交互時不需要人為交互來輸入密碼院究。
3洽瞬,簡單使用
在安裝好Kerberos和對Kerberos有一個簡單的認識之后玷或,你就可以試用一下了,最基本的命令就是kinit片任,是Client用來從KDC獲取票據(jù)的偏友,示例如下:
a,使用密碼: kinit name@realm 然后根據(jù)提示輸入密碼即可
b对供,使用keytab: kinit -kt /path/to/keytab name@realm
kinit成功之后你獲取的票據(jù)就會緩存到本地位他,可以用klist查看,實例如下:
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: h_test@XIAOMI.HADOOP
Valid starting Expires Service principal
03/13/16 17:08:42 03/14/16 17:08:42 krbtgt/ATHENA.MIT.EDU@ATHENA.MIT.EDU
renew until 03/11/26 17:08:42
從中也可以看到過期時間产场。
如果你要銷毀當前獲取的票據(jù)鹅髓,用kdestroy即可。
當然在kinit之前京景,server端首先要有你的賬號窿冯,這就需要管理員使用addprinc命令在Kerberos數(shù)據(jù)庫中添加,更多詳情請戳這里确徙。
4醒串,Kerbeos在Hadoop上應(yīng)用
在Hadoop的早期版本(1.0.0)之前是沒有安全認證機制的,集群默認自己的節(jié)點都是安全的鄙皇,這樣就導致了惡意用戶的輕易入侵芜赌,修改集群數(shù)據(jù),修改任務(wù)狀態(tài)伴逸,提交任務(wù)等問題缠沈。
1.0.0后的版本加入Kerberos認證后,部署集群時需要事先將密鑰放在要部署的節(jié)點上错蝴,這樣集群內(nèi)的節(jié)點都是通過認證的節(jié)點洲愤,只有通過認證的節(jié)點才能被正常使用,同樣顷锰,通過認證的Client才能使用服務(wù)柬赐。
如果要結(jié)合上面所說的原理,那么將上面說的Server換成Hadoop集群中的Namenode馍惹,Datanode即可躺率。
四,Kerberos賬號管理
Kerberos本身的數(shù)據(jù)庫中不能查看密碼的万矾,也沒有保存賬號使用人等信息悼吱,所有的信息都需要以命令行的形式獲取,管理起來極不方便良狈,因此我們就開發(fā)了一套基于Django web框架的Kerberos賬號管理系統(tǒng)(Kerberos Account Management System后添,簡稱KAS),以此來提高管理員的工作效率薪丁,讓管理員更有效遇西、更有條理的管理Kerberos賬號馅精,KAS的基本組件如下:
權(quán)限管理模塊:設(shè)定了用戶,用戶組等角色粱檀;admin洲敢,read等權(quán)限類型;并將Kerberos賬號視作一種資源類型茄蚯;這樣就有了某個角色压彭,擁有某種資源的某種權(quán)限的一種通用架構(gòu),所以渗常,這個模塊適用于各種資源管理系統(tǒng)壮不。
工具管理模塊:里邊包含了KAS需要的各種工具,例如KAS和Kerberos server交互的工具皱碘,郵件發(fā)送工具等询一。
賬號申請模塊:為了減少溝通成本,我們設(shè)計了用戶提交申請癌椿,管理員審批的賬戶申請流程健蕊,在審批階段用戶和管理員可以對申請賬號做出評論,并可以視情況對申請賬號做出重新編輯如失,撤銷申請等操作绊诲,一旦有人提交了申請,做出了評論褪贵,或者其他操作系統(tǒng)會發(fā)郵件通知管理員和用戶,以便減少賬號申請時間抗俄。
賬號管理模塊:對于通過審批的賬號脆丁,用戶可以查看密碼,導出賬號keytab动雹,查看賬號owner等槽卫,對賬號有admin權(quán)限的賬戶還可以將賬號授權(quán)給他人使用,以此來減小管理員的工作量胰蝠。
API模塊:由于有一些特殊人員因為工作的需要歼培,希望查看或者使用owner為其他人的賬號,所以我們設(shè)計了API模塊茸塞;當有人需要使用API接口時躲庄,需要向管理員申請將自己設(shè)為超級用戶,同時超級用戶需要維護一個自己的機器列表钾虐,只有在此機器列表包含的Host上才能使用API接口噪窘,此外超級用戶還需要到系統(tǒng)中查看自己的auth_token,用于在使用API接口時做校驗效扫。
Replicate模塊:Web端的增刪改查等操作只是修改了MySQL數(shù)據(jù)庫倔监,此時我們需要Replicate模塊將MySQL中的修改實時同步到Kerberos自己的數(shù)據(jù)庫中直砂。
機房間同步模塊:當多個機房都需要使用Kerberos認證的時候,我們就需要機房間同步模塊將主Server上的修改同步到其他機房中來保證數(shù)據(jù)的一致性浩习。
備份模塊:用于備份MySQL中和Kerberos Server中的數(shù)據(jù)以防數(shù)據(jù)丟失或者其他意外發(fā)生静暂。
KAS的整體架構(gòu)圖如下:
服務(wù)的安全以及高可用:
對于Web Server我們采用了Keepalived vip漂移的方式來保證服務(wù)的高可用性,同一時刻只有一臺Server工作谱秽,寫MySQL數(shù)據(jù)庫籍嘹。
主Server上的Replicate模塊會將MySQL中的修改實時同步到Kerberos Server中,又通過Rsync加密弯院、增量傳輸?shù)姆绞桨阎鱏erver中的Kerberos數(shù)據(jù)庫的更改同步到其他的Kerberos Server的數(shù)據(jù)庫中(包括同機房的和不同機房的)辱士。
通常一個機房中的Kerberos Server有兩個,我們采用LVS或者Keepalived的方式保證服務(wù)的高可用听绳。
Web Server颂碘,Replicate模塊等的進程我們用God的守護,以確保服務(wù)在異常停止后能自動拉起椅挣。
此外头岔,由于Kerbeos是比較基礎(chǔ)的服務(wù),又比較敏感鼠证,所以我們還做了端口監(jiān)控峡竣,機器級別的安全加固等。
下面簡單列一下KAS開發(fā)前后狀態(tài)的對比量九,如下: