最近老在項(xiàng)目的shell腳本中看到kinit這個(gè)東西,完整的命令是
kinit -k -t ./conf/kerberos.keytab sherlocky/admin@EXAMPLE.COM
查閱一番資料后了解到罢洲,之所以有這個(gè)命令养篓,是由于該shell腳本接下來會(huì)訪問Hadoop集群仙粱,從上面拉取文件做一些處理任務(wù)脏里,并將結(jié)果存到Hadoop集群上踩麦,那么該命令的作用就是進(jìn)行身份驗(yàn)證(Authentication),確保Hadoop集群資源的安全勾徽。這里就牽扯到kerberos協(xié)議,本文接下來將對(duì)此一一闡述统扳。
一喘帚、kinit命令
Kinit命令用于獲取和緩存principal(當(dāng)前主體)初始的票據(jù)授予票據(jù)(TGT),此票據(jù)用于Kerberos系統(tǒng)進(jìn)行身份安全驗(yàn)證咒钟,實(shí)際上它是MIT在版權(quán)許可的條件下為kerberos協(xié)議所研發(fā)的免費(fèi)實(shí)現(xiàn)工具MIT Kerberos(當(dāng)前最新版本為krb5-1.15.1)的一部分吹由,相關(guān)的配套命令還有klist、kdestory朱嘴、kpasswd倾鲫、krb5-config等等粗合,基本用法如下:
kinit [-V][-l lifetime] [-s start_time][-r renewable_life][-p | -P][-f | -F][-a][-A][-C][-E][-v][-R][-k [-t keytab_file]][-c cache_name][-n][-S service_name][-I input_ccache][-T armor_ccache][-X attribute[=value]][principal]
各選項(xiàng)具體含義都不做介紹了,可參考官網(wǎng)乌昔,較常用的方式就如前言所示隙疚,根據(jù)指定的事先生成的kerberos.keytab文件為指定個(gè)體進(jìn)行驗(yàn)證。驗(yàn)證通過后磕道,就可以像平常一樣進(jìn)行Hadoop系列操作供屉。那么它是如何進(jìn)行驗(yàn)證的呢?其中的過程和原理又是怎樣的溺蕉?下面要介紹的kerberos協(xié)議細(xì)節(jié)將會(huì)回答你的疑惑伶丐。
二、Kerberos協(xié)議
Kerberos(具體可參考RFC1510)是一種網(wǎng)絡(luò)身份驗(yàn)證的協(xié)議(注意它只包括驗(yàn)證環(huán)節(jié)疯特,不負(fù)責(zé)授權(quán)哗魂,關(guān)于這兩者后面會(huì)有介紹區(qū)分),用戶只需輸入一次身份驗(yàn)證信息漓雅,就可憑借此驗(yàn)證獲得的票據(jù)授予票據(jù)(ticket-granting ticket)訪問多個(gè)接入Kerberos的服務(wù)录别,即SSO(Single Sign On,單點(diǎn)登錄)故硅。
1.基本概念
- Principal:安全個(gè)體庶灿,具有唯一命名的客戶端或服務(wù)器。命名規(guī)則:主名稱+實(shí)例+領(lǐng)域吃衅,如本文開頭中的
sherlocky/admin@EXAMPLE.COM
- Ticket:票據(jù)往踢,一條包含客戶端標(biāo)識(shí)信息、會(huì)話密鑰和時(shí)間戳的記錄徘层,客戶端用它來向目標(biāo)服務(wù)器認(rèn)證自己
- Session key:會(huì)話密鑰峻呕,指兩個(gè)安全個(gè)體之間使用的臨時(shí)加密秘鑰,其時(shí)效性取決于單點(diǎn)登錄的會(huì)話時(shí)間長(zhǎng)短
- AS:認(rèn)證服務(wù)器(Authentication Server)趣效,KDC的一部分瘦癌。通常會(huì)維護(hù)一個(gè)包含安全個(gè)體及其秘鑰的數(shù)據(jù)庫(kù),用于身份認(rèn)證
- SS:特定服務(wù)的提供端(Service Server)
- TGS:許可證服務(wù)器(Ticket Granting Server)跷敬,KDC的一部分讯私,根據(jù)客戶端傳來的TGT發(fā)放訪問對(duì)應(yīng)服務(wù)的票據(jù)
- TGT:票據(jù)授予票據(jù)(Ticket Granting Ticket),包含客戶端ID西傀、客戶端網(wǎng)絡(luò)地址斤寇、票據(jù)有效期以及client/TGS會(huì)話密鑰
- KDC:Key分發(fā)中心(key distribution center),是一個(gè)提供票據(jù)(tickets)和臨時(shí)會(huì)話密鑰(session keys)的網(wǎng)絡(luò)服務(wù)拥褂。KDC服務(wù)作為客戶端和服務(wù)器端信賴的第三方娘锁,為其提供初始票據(jù)(initial ticket)服務(wù)和票據(jù)授予票據(jù)(ticket-granting ticket)服務(wù),前半部分有時(shí)被稱為AS饺鹃,后半部分有時(shí)則被稱為TGS莫秆。
關(guān)于概念的一點(diǎn)補(bǔ)充间雀,博文Kerberos 服務(wù)的工作原理中對(duì)于TGT和Ticket給出了巧妙的比喻:TGT類似于護(hù)照,Ticket則是簽證镊屎,而訪問特定的服務(wù)則好比出游某個(gè)國(guó)家惹挟。與護(hù)照一樣,TGT可標(biāo)識(shí)你的身份并允許你獲得多個(gè)Ticket(簽證)杯道,每個(gè)Ticket對(duì)應(yīng)一個(gè)特定的服務(wù)匪煌,TGT和Ticket同樣具有有效期,過期后就需要重新認(rèn)證党巾。
2.認(rèn)證過程
Kerberos的認(rèn)證過程可細(xì)分為三個(gè)階段:初始驗(yàn)證萎庭、獲取服務(wù)票據(jù)和服務(wù)驗(yàn)證。第一階段主要是客戶端向KDC中的AS發(fā)送用戶信息齿拂,以請(qǐng)求TGT驳规,然后到第二階段,客戶端拿著之前獲得的TGT向KDC中的TGS請(qǐng)求訪問某個(gè)服務(wù)的票據(jù)署海,最后階段拿到票據(jù)(Ticket)后再到該服務(wù)的提供端驗(yàn)證身份吗购,然后使用建立的加密通道與服務(wù)通信。
2.1 初始驗(yàn)證
此過程是客戶端向AS請(qǐng)求獲取TGT:
- 客戶端向AS發(fā)送自身用戶信息(如用戶ID)砸狞,該動(dòng)作通常發(fā)生在用戶初次登陸或使用kinit命令時(shí)
- AS檢查本地?cái)?shù)據(jù)庫(kù)是否存在該用戶捻勉,若存在則返回如下兩條信息:
- 消息A:使用用戶密鑰加密的Client/TGS會(huì)話密鑰,我們稱之為SK1刀森。其中用戶密鑰是通過對(duì)該用戶在數(shù)據(jù)庫(kù)中對(duì)應(yīng)的密碼hash生成的
- 消息B:使用TGS的密鑰加密的TGT(包含客戶端ID踱启、客戶端網(wǎng)絡(luò)地址、票據(jù)有效期和SK1)
- 當(dāng)客戶端收到消息A和B時(shí)研底,它會(huì)嘗試用本地的用戶密鑰(由用戶輸入的密碼或kerberos.keytab文件中的密碼hash生成)對(duì)A進(jìn)行解密埠偿,只有當(dāng)本地用戶密鑰與AS中對(duì)應(yīng)該用戶的密鑰匹配時(shí)才能解密成功。對(duì)A解密成功后榜晦,客戶端就能拿到SK1冠蒋,才能與TGS進(jìn)行后續(xù)的會(huì)話,這里就相當(dāng)于AS對(duì)客戶端的一次驗(yàn)證乾胶,只有真正擁有正確用戶密鑰的客戶端才能有機(jī)會(huì)與AS進(jìn)行后續(xù)會(huì)話抖剿。而對(duì)于消息B,由于它是由TGS的密鑰加密的识窿,故無(wú)法對(duì)其解密斩郎,也看不到其中的內(nèi)容。
2.2 獲取服務(wù)票據(jù)
此過程則是客戶端向TGS請(qǐng)求獲取訪問對(duì)應(yīng)服務(wù)的票據(jù):
當(dāng)客戶端要訪問某個(gè)服務(wù)時(shí)腕扶,會(huì)向TGS發(fā)送如下兩條消息:
- 消息C:消息B的內(nèi)容(即加密后的TGT)和服務(wù)ID
- 消息D:通過SK1加密的驗(yàn)證器(Authenticator,包括用戶ID和時(shí)間戳)
TGS收到消息C和D后吨掌,首先檢查KDC數(shù)據(jù)庫(kù)中是否存在所需服務(wù)半抱,若存在則用自己的TGS密鑰嘗試對(duì)C中的消息B進(jìn)行解密脓恕,這里也是客戶端對(duì)TGS的反向認(rèn)證,只有真正擁有正確密鑰的TGS才能對(duì)B解密窿侈,解密成功后就能拿到其中的SK1炼幔,然后再用SK1解密消息D拿到包含用戶ID和時(shí)間戳的Authenticator,通過比較分別來自C和D的用戶ID史简,如果二者匹配乃秀,則向客戶端返回如下兩條消息:
- 消息E:通過SK1加密的Client/SS會(huì)話密鑰,該會(huì)話密鑰是KDC新生成的隨機(jī)密鑰圆兵,用于將來客戶端(Client)與服務(wù)端(SS)的通信加密跺讯,我們稱之為SK2
- 消息F:使用服務(wù)的密鑰加密的client-server票據(jù)(Ticket,包含用戶ID殉农、用戶網(wǎng)絡(luò)地址刀脏、票據(jù)有效期和SK2),之所以要用服務(wù)的密鑰加密超凳,是因?yàn)檫@個(gè)Ticket是給服務(wù)端看的愈污,但又需要經(jīng)過客戶端傳給服務(wù)端,且不能讓客戶端看到轮傍。那么就會(huì)有人問暂雹,為什么KDC不直接把消息E發(fā)送給服務(wù)端呢,這樣豈不省事创夜?問題就在于網(wǎng)絡(luò)時(shí)延杭跪,若分開發(fā)送,消息E和F就不能確保同時(shí)到達(dá)服務(wù)端挥下,考慮一個(gè)極端情況揍魂,KDC與服務(wù)之前的網(wǎng)絡(luò)臨時(shí)不通了,那么這段時(shí)間服務(wù)端就無(wú)法收到消息E棚瘟,導(dǎo)致驗(yàn)證失敗现斋,而實(shí)際上該客戶端是有訪問權(quán)限的。通過公鑰加密這種方式巧妙地回避了該問題
客戶端收到消息后偎蘸,嘗試用SK1解密消息E庄蹋,得到Client/SS會(huì)話密鑰SK2
2.3 服務(wù)驗(yàn)證
此過程是客戶端與服務(wù)端相互驗(yàn)證,并通信
客戶端向服務(wù)端發(fā)送如下兩條消息:
消息G:即上一步中的消息F——client-server票據(jù)
消息H:通過SK2加密的新的驗(yàn)證器(Authenticator迷雪,包含用戶ID和時(shí)間戳)
服務(wù)端收到消息后限书,嘗試用自己的密鑰解密消息G,這里實(shí)際上也是客戶端對(duì)服務(wù)端的一次驗(yàn)證章咧,只有真正擁有正確密鑰的服務(wù)端才能正確解密倦西,從而有機(jī)會(huì)拿到Ticket中的SK2,然后再用該SK2解密消息H赁严,同TGS一樣扰柠,對(duì)分別來自Ticket和Authenticator中的用戶ID進(jìn)行驗(yàn)證粉铐,如果匹配成功則返回一條確認(rèn)消息:
- 消息I:通過SK2加密的新時(shí)間戳
客戶端嘗試用SK2解密消息I,得到新時(shí)間戳并驗(yàn)證其正確性卤档,驗(yàn)證通過后蝙泼,客戶端與服務(wù)端就達(dá)到了相互信任,后續(xù)的通信都采用SK2加密劝枣,就好比建立了一條加密通道汤踏,二者即可享受服務(wù)與被服務(wù)的樂趣了
3.前提(環(huán)境假設(shè))
- 共享密鑰:在協(xié)議工作前,客戶端與KDC舔腾,KDC與服務(wù)端都確保有了各自的共享密鑰溪胶。
- 防Dos攻擊:Kerberos協(xié)議本身并沒有解決Dos攻擊(Denial of service,拒絕服務(wù))防范問題琢唾,通常是由系統(tǒng)管理員和用戶自己去定期探測(cè)并解決這樣的攻擊载荔。
- 保障安全個(gè)體自身安全:參與到Kerberos協(xié)議中的安全個(gè)體必須確保其秘鑰的安全性,一旦秘鑰泄露或被攻擊者暴力破解采桃,那么攻擊者就能隨意地偽裝安全個(gè)體懒熙,做一些不和諧的事情。
- 不循環(huán)利用Principal的唯一標(biāo)識(shí):訪問控制的常用方式是通過訪問控制列表(access control lists普办,ACLs)來對(duì)特定的安全個(gè)體進(jìn)行授權(quán)工扎。如果列表中有條記錄對(duì)應(yīng)的安全個(gè)體A早已被刪除,而A的唯一標(biāo)識(shí)卻被后來新加的某個(gè)個(gè)體B再次利用衔蹲,那么B就會(huì)繼承之前A對(duì)應(yīng)的權(quán)限肢娘,這是不安全的。避免這種風(fēng)險(xiǎn)的做法就是不復(fù)用Principal的唯一標(biāo)識(shí)舆驶。
- 時(shí)鐘同步:參與到協(xié)議中的主機(jī)必須有個(gè)時(shí)鐘相互之間進(jìn)行“松散同步”橱健,松散度是可配置的。為什么需要同步各主機(jī)的時(shí)間呢沙廉?實(shí)際上從Kerberos的認(rèn)證過程可以看到拘荡,任何人都可以向KDC請(qǐng)求任何服務(wù)的TGT,那攻擊者就有可能中途截獲正常用戶的請(qǐng)求包撬陵,然后離線解密珊皿,就能合法地拿到TGT。為了防止這種重放攻擊巨税,票據(jù)(Ticket)會(huì)包含時(shí)間戳信息蟋定,即具有一定的有效期,因此如果主機(jī)的時(shí)鐘與Kerberos服務(wù)器的時(shí)鐘不同步草添,則認(rèn)證會(huì)失敗驶兜。在實(shí)踐中,通常用網(wǎng)絡(luò)時(shí)間協(xié)議(Network Time Protocol, NTP)軟件來同步時(shí)鐘。
4.局限性
- 單點(diǎn)風(fēng)險(xiǎn):過度依賴于KDC服務(wù)抄淑,Kerberos協(xié)議運(yùn)轉(zhuǎn)時(shí)需要KDC的持續(xù)響應(yīng)犀盟,一旦KDC服務(wù)掛了,或者KDC數(shù)據(jù)庫(kù)被攻破蝇狼,那么Kerberos協(xié)議將無(wú)法運(yùn)轉(zhuǎn)
- 安全個(gè)體自身的安全:Kerberos協(xié)議之所以能運(yùn)行在非安全網(wǎng)絡(luò)之上,關(guān)鍵假設(shè)就是主機(jī)自身是安全的倡怎,一旦主機(jī)上的私鑰泄露迅耘,攻擊者將能輕易的偽裝該個(gè)體實(shí)施攻擊
三、Kerberos應(yīng)用
1.Hadoop安全機(jī)制
Apache Hadoop 最初設(shè)計(jì)時(shí)并沒有考慮安全問題监署,它不對(duì)用戶或服務(wù)進(jìn)行驗(yàn)證颤专,任何人都可以向集群提交代碼并得到執(zhí)行,使用Hadoop的組織只能把集群隔離到專有網(wǎng)絡(luò)钠乏,確保只有經(jīng)過授權(quán)的用戶才能訪問栖秕,但這也并不能解決Hadoop集群內(nèi)部的安全問題。為了增強(qiáng)Hadoop的安全機(jī)制晓避,從1.0.0版本以后簇捍,引入Kerberos認(rèn)證機(jī)制,即用戶跟服務(wù)通信以及各個(gè)服務(wù)之間通信均用Kerberos認(rèn)證俏拱,在用戶認(rèn)證后任務(wù)執(zhí)行暑塑、訪問服務(wù)、讀寫數(shù)據(jù)等均采用特定服務(wù)發(fā)起訪問token锅必,讓需求方憑借token訪問相應(yīng)服務(wù)和數(shù)據(jù)事格。下面以Yarn中提交MR任務(wù)為例:
A、用戶先向KDC請(qǐng)求TGT搞隐,做初始驗(yàn)證
B驹愚、用戶通過TGT向KDC請(qǐng)求訪問服務(wù)的Ticket
C、客戶端通過ticket向服務(wù)認(rèn)證自己劣纲,完成身份認(rèn)證
D逢捺、完成身份認(rèn)證后,客戶端向服務(wù)請(qǐng)求若干token供后續(xù)任務(wù)執(zhí)行時(shí)認(rèn)證使用
F味廊、客戶端連同獲取的token一并提交任務(wù)蒸甜,后續(xù)任務(wù)執(zhí)行使用token與服務(wù)進(jìn)行認(rèn)證
四、其他安全機(jī)制
1.OAuth認(rèn)證
OAuth(Open Authorization余佛,開放授權(quán))用于第三方授權(quán)服務(wù)柠新,現(xiàn)常用的第三方賬號(hào)登陸都是采用該機(jī)制。比如我用github賬號(hào)登陸LeetCode官網(wǎng)辉巡,LeetCode并不需要知道我的github賬號(hào)恨憎、密碼,它只需要將登陸請(qǐng)求轉(zhuǎn)給授權(quán)方(github),由它進(jìn)行認(rèn)證授權(quán)憔恳,然后把授權(quán)信息傳回LeetCode實(shí)現(xiàn)登陸瓤荔。
2.LDAP
LDAP(Lightweight Directory Access Protocol,輕量級(jí)目錄訪問協(xié)議)是一種用于訪問目錄服務(wù)的業(yè)界標(biāo)準(zhǔn)方法钥组,LDAP目錄以樹狀結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù)输硝,針對(duì)讀取操作做了特定優(yōu)化,比從專門為OLTP優(yōu)化的關(guān)系數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)快一個(gè)量級(jí)程梦。LDAP中的安全模型主要通過身份認(rèn)證点把、安全通道和訪問控制來實(shí)現(xiàn),它可以把整個(gè)目錄屿附、目錄的子樹郎逃、特定條目、條目屬性集火符合某過濾條件的條目作為控制對(duì)象進(jìn)行授權(quán)挺份,也可以把特定用戶褒翰、特定組或所有目錄用戶作為授權(quán)主體進(jìn)行授權(quán),也可以對(duì)特定位置(如IP或DNS名稱)進(jìn)行授權(quán)匀泊。
3.SSL
SSL(Secure Sockets Layer优训,安全套接層)是目前廣泛應(yīng)用的加密通信協(xié)議,其基本思路是采用公鑰加密法各聘,即客戶端先向服務(wù)器端索要公鑰型宙,然后用公鑰加密信息,服務(wù)端收到密文后用自己的私鑰解密伦吠。它的安全機(jī)制包含如下三點(diǎn):
- 連接的私密性:利用會(huì)話密鑰通過對(duì)稱加密算法(DES)對(duì)傳輸數(shù)據(jù)進(jìn)行加密妆兑,并利用RSA對(duì)會(huì)話密鑰本身加密
- 身份驗(yàn)證:基于數(shù)字證書利用數(shù)字簽名方法進(jìn)行身份驗(yàn)證,SSL服務(wù)器和客戶端通過PKI(Public Key Infrastructure)提供的機(jī)制從CA獲取證書
- 內(nèi)容可靠:使用基于密鑰的MAC(Message Authentication Code毛仪,消息驗(yàn)證碼)驗(yàn)證消息的完整性搁嗓,防竄改
本文同步更新到此處