一、前言
- 概述
Kerberos是一種計(jì)算機(jī)網(wǎng)絡(luò)認(rèn)證協(xié)議羡亩,它允許某實(shí)體在非安全網(wǎng)絡(luò)環(huán)境下通信顾腊,向另一個(gè)實(shí)體以一種安全的方式證明自己的身份。它也指由麻省理工實(shí)現(xiàn)此協(xié)議吴侦,并發(fā)布的一套免費(fèi)軟件屋休。它的設(shè)計(jì)主要針對(duì)客戶-服務(wù)器模型,并提供了一系列交互認(rèn)證——用戶和服務(wù)器都能驗(yàn)證對(duì)方的身份备韧。Kerberos協(xié)議可以保護(hù)網(wǎng)絡(luò)實(shí)體免受竊聽和重復(fù)攻擊劫樟。
Kerberos協(xié)議基于對(duì)稱密碼學(xué),并需要一個(gè)值得信賴的第三方织堂。Kerberos協(xié)議的擴(kuò)展可以為認(rèn)證的某些階段提供公鑰密碼學(xué)支持叠艳。 - 協(xié)議內(nèi)容
協(xié)議的安全主要依賴于參加者對(duì)時(shí)間的松散同步和短周期的叫做Kerberos票據(jù)的認(rèn)證聲明。 下面是對(duì)這個(gè)協(xié)議的一個(gè)簡化描述易阳,將使用以下縮寫:
AS(Authentication Server)= 認(rèn)證服務(wù)器
KDC(Key Distribution Center)= 密鑰分發(fā)中心
TGT(Ticket Granting Ticket)= 票據(jù)授權(quán)票據(jù)附较,票據(jù)的票據(jù)
TGS(Ticket Granting Server)= 票據(jù)授權(quán)服務(wù)器
SS(Service Server)= 特定服務(wù)提供端
客戶端用戶發(fā)送自己的用戶名到KDC服務(wù)器以向AS服務(wù)進(jìn)行認(rèn)證。KDC服務(wù)器會(huì)生成相應(yīng)的TGT票據(jù)潦俺,打上時(shí)間戳拒课,在本地?cái)?shù)據(jù)庫中查找該用戶的密碼徐勃,并用該密碼對(duì)TGT進(jìn)行加密,將結(jié)果發(fā)還給客戶端用戶早像。該操作僅在用戶登錄或者kinit申請(qǐng)的時(shí)候進(jìn)行僻肖。 客戶端收到該信息,并使用自己的密碼進(jìn)行解密之后卢鹦,就能得到TGT票據(jù)了臀脏。這個(gè)TGT會(huì)在一段時(shí)間之后失效,也有一些程序(session manager)能在用戶登陸期間進(jìn)行自動(dòng)更新冀自。 當(dāng)客戶端用戶需要使用一些特定服務(wù)(Kerberos術(shù)語中用"principal"表示)的時(shí)候揉稚,該客戶端就發(fā)送TGT到KDC服務(wù)器中的TGS服務(wù)。當(dāng)該用戶的TGT驗(yàn)證通過并且其有權(quán)訪問所申請(qǐng)的服務(wù)時(shí)凡纳,TGS服務(wù)會(huì)生成一個(gè)該服務(wù)所對(duì)應(yīng)的ticket和session key窃植,并發(fā)還給客戶端〖雒樱客戶端將服務(wù)請(qǐng)求與該ticket一并發(fā)送給相應(yīng)的服務(wù)端即可巷怜。具體的流程請(qǐng)看下面的描述。
其在網(wǎng)絡(luò)通訊協(xié)定中屬于顯示層暴氏。
簡單地說延塑,用戶先用共享密鑰從某認(rèn)證服務(wù)器得到一個(gè)身份證明。隨后答渔,用戶使用這個(gè)身份證明與SS通信关带,而不使用共享密鑰。
- 具體流程
(注意:此流程使用了對(duì)稱加密沼撕;此流程發(fā)生在某一個(gè)Kerberos領(lǐng)域中宋雏;小寫字母c,d,e,g是客戶端發(fā)出的消息,大寫字母A,B,E,F,H是各個(gè)服務(wù)器發(fā)回的消息务豺。)
首先磨总,用戶使用客戶端(用戶自己的機(jī)器)上的程序進(jìn)行登錄:
1.用戶輸入用戶ID和密碼到客戶端。
2.客戶端程序運(yùn)行一個(gè)單向函數(shù)(大多數(shù)為雜湊)把密碼轉(zhuǎn)換成密鑰笼沥,這個(gè)就是客戶端(用戶)的“用戶密鑰”(user's secret key)蚪燕。隨后,客戶端認(rèn)證(客戶端(Client)從認(rèn)證服務(wù)器(AS)獲取票據(jù)的票據(jù)(TGT)):
(1)Client向AS發(fā)送1條明文消息奔浅,申請(qǐng)基于該用戶所應(yīng)享有的服務(wù)馆纳,例如“用戶Sunny想請(qǐng)求服務(wù)”(Sunny是用戶ID)。(注意:用戶不向AS發(fā)送“用戶密鑰”(user's secret key)汹桦,也不發(fā)送密碼)該AS能夠從本地?cái)?shù)據(jù)庫中查詢到該申請(qǐng)用戶的密碼鲁驶,并通過相同途徑轉(zhuǎn)換成相同的“用戶密鑰”(user's secret key)。
(2)AS檢查該用戶ID是否在于本地?cái)?shù)據(jù)庫中舞骆,如果用戶存在則返回2條消息:
?????????① 消息A:Client/TGS會(huì)話密鑰(Client/TGS Session Key)(該Session Key用在將來Client與TGS的通信(會(huì)話)上)钥弯,通過用戶密鑰(user's secret key)進(jìn)行加密
?????????②消息B:票據(jù)授權(quán)票據(jù)(TGT)(TGT包括:消息A中的“Client/TGS會(huì)話密鑰”(Client/TGS Session Key)壹罚,用戶ID,用戶網(wǎng)址寿羞,TGT有效期),通過TGS密鑰(TGS's secret key)進(jìn)行加密
3. 一旦Client收到消息A和消息B赂蠢,Client首先嘗試用自己的“用戶密鑰”(user's secret key)解密消息A绪穆,如果用戶輸入的密碼與AS數(shù)據(jù)庫中的密碼不符,則不能成功解密消息A虱岂。輸入正確的密碼并通過隨之生成的"user's secret key"才能解密消息A玖院,從而(得到“Client/TGS會(huì)話密鑰”(Client/TGS Session Key)。(注意:Client不能解密消息B第岖,因?yàn)锽是用TGS密鑰(TGS's secret key)加密的)难菌。擁有了“Client/TGS會(huì)話密鑰”(Client/TGS Session Key),Client就足以通過TGS進(jìn)行認(rèn)證了蔑滓。
然后郊酒,服務(wù)授權(quán)(client從TGS獲取票據(jù)(client-to-server ticket)):
(1)當(dāng)client需要申請(qǐng)?zhí)囟ǚ?wù)時(shí),其向TGS發(fā)送以下2條消息:
?????????①消息c:即消息B的內(nèi)容(TGS's secret key加密后的TGT)键袱,和想獲取的服務(wù)的服務(wù)ID(注意:不是用戶ID)
????????? ②消息d:認(rèn)證符(Authenticator)(Authenticator包括:用戶ID燎窘,時(shí)間戳),通過Client/TGS會(huì)話密鑰(Client/TGS Session Key)進(jìn)行加密
(2)收到消息c和消息d后蹄咖,TGS首先檢查KDC數(shù)據(jù)庫中是否存在所需的服務(wù)褐健,查找到之后,TGS用自己的“TGS密鑰”(TGS's secret key)解密消息c中的消息B(也就是TGT)澜汤,從而得到之前生成的“Client/TGS會(huì)話密鑰”(Client/TGS Session Key)蚜迅。TGS再用這個(gè)Session Key解密消息d得到包含用戶ID和時(shí)間戳的Authenticator,并對(duì)TGT和Authenticator進(jìn)行驗(yàn)證俊抵,驗(yàn)證通過之后返回2條消息:
?????????①消息E:client-server票據(jù)(client-to-server ticket)(該ticket包括:Client/SS會(huì)話密鑰 (Client/Server Session Key)谁不,用戶ID,用戶網(wǎng)址务蝠,有效期)拍谐,通過提供該服務(wù)的服務(wù)器密鑰(service's secret key)進(jìn)行加密
?????????②消息F:Client/SS會(huì)話密鑰( Client/Server Session Key)(該Session Key用在將來Client與Server Service的通信(會(huì)話)上),通過Client/TGS會(huì)話密鑰(Client/TGS Session Key)進(jìn)行加密
(3)Client收到這些消息后馏段,用“Client/TGS會(huì)話密鑰”(Client/TGS Session Key)解密消息F轩拨,得到“Client/SS會(huì)話密鑰”(Client/Server Session Key)。(注意:Client不能解密消息E院喜,因?yàn)镋是用“服務(wù)器密鑰”(service's secret key)加密的)亡蓉。
:
1.當(dāng)獲得“Client/SS會(huì)話密鑰”(Client/Server Session Key)之后喷舀,Client就能夠使用服務(wù)器提供的服務(wù)了砍濒。Client向指定服務(wù)器SS發(fā)出2條消息:
?????????①消息e:即上一步中的消息E“client-server票據(jù)”(client-to-server ticket)淋肾,通過服務(wù)器密鑰(service's secret key)
進(jìn)行加密
?????????②消息g:新的Authenticator
(包括:用戶ID,時(shí)間戳)爸邢,通過Client/SS會(huì)話密鑰(Client/Server Session Key)
進(jìn)行加密
2.SS用自己的密鑰(service's secret key)解密消息e從而得到TGS提供的Client/SS會(huì)話密鑰(Client/Server Session Key)樊卓。再用這個(gè)會(huì)話密鑰解密消息g得到Authenticator,(同TGS一樣)對(duì)Ticket和Authenticator進(jìn)行驗(yàn)證杠河,驗(yàn)證通過則返回1條消息(確認(rèn)函:確證身份真實(shí)碌尔,樂于提供服務(wù)):
?????????消息H:新時(shí)間戳
(新時(shí)間戳是:Client發(fā)送的時(shí)間戳加1,v5已經(jīng)取消這一做法)券敌,通過Client/SS會(huì)話密鑰(Client/Server Session Key)
進(jìn)行加密
3.Client通過Client/SS會(huì)話密鑰(Client/Server Session Key)解密消息H唾戚,得到新時(shí)間戳并驗(yàn)證其是否正確。驗(yàn)證通過的話則客戶端可以信賴服務(wù)器待诅,并向服務(wù)器(SS)發(fā)送服務(wù)請(qǐng)求叹坦。
4.服務(wù)器(SS)向客戶端提供相應(yīng)的服務(wù)。
這里有一位大神寫的關(guān)于Kerberos的認(rèn)證原理卑雁,講的非常細(xì)致募书,易懂-->kerberos認(rèn)證原理
二、安裝配置
2.1 環(huán)境配置
安裝kerberos前,首先要確保主機(jī)名可以被解析:
主機(jī)名 內(nèi)網(wǎng)IP 角色
hadoop102 192.168.1.102 master KDC
hadoop103 192.168.1.103 kerberos client
hadoop104 192.168.1.104 kerberos client
2.2 Configuring a Kerberos Server
2.2.1 確保環(huán)境可用
確保所有的clients與servers之間的時(shí)間同步以及DNS正確解析
2.2.2 選擇一個(gè)主機(jī)來運(yùn)行KDC,并在該主機(jī)上安裝krb-5libs,krb5-server,以及krb5-workstation:
yum install krb5-server krb5-libs krb5-auth-dialog
KDC的主機(jī)必須非常自身安全茧痕,一般該主機(jī)只運(yùn)行KDC程序瘤载。
在安裝完上述的軟件之后,會(huì)在KDC主機(jī)上生成配置文件/etc/krb5.conf和/var/kerberos/krb5kdc/kdc.conf,它們分別反映了realm name 以及 domain-to-realm mappings。
2.2.3 配置kdc.conf
默認(rèn)放在 /var/kerberos/krb5kdc/kdc.conf『沙眩或者通過覆蓋KRB5_KDC_PROFILE環(huán)境變量修改配置文件位置。
配置示例:
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
HADOOP.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
max_renewable_life = 7d
supported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
說明:
HADOOP.COM:是設(shè)定的realms粹排。名字隨意种远。Kerberos可以支持多個(gè)realms,會(huì)增加復(fù)雜度顽耳。本文不探討坠敷。大小寫敏感,一般為了識(shí)別使用全部大寫射富。這個(gè)realms跟機(jī)器的host沒有大關(guān)系膝迎。
max_renewable_life = 7d 涉及到是否能進(jìn)行ticket的renwe必須配置。
master_key_type:和supported_enctypes默認(rèn)使用aes256-cts胰耗。由于限次,JAVA使用aes256-cts驗(yàn)證方式需要安裝額外的jar包,更多參考2.2.9關(guān)于AES-256加密:。推薦不使用卖漫。
acl_file:標(biāo)注了admin的用戶權(quán)限费尽。文件格式是
Kerberos_principal permissions [target_principal] [restrictions]支持通配符等。
admin_keytab:KDC進(jìn)行校驗(yàn)的keytab羊始。后文會(huì)提及如何創(chuàng)建旱幼。
supported_enctypes:支持的校驗(yàn)方式。注意把a(bǔ)es256-cts去掉突委。
2.2.4 配置krb5.conf
/etc/krb5.conf: 包含Kerberos的配置信息速警。例如,KDC的位置鸯两,Kerberos的admin的realms 等。需要所有使用的Kerberos的機(jī)器上的配置文件都同步长豁。這里僅列舉需要的基本配置钧唐。
配置示例:
[logging]
default=FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = HADOOP.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
# udp_preference_limit = 1
[realms]
HADOOP.COM = {
kdc = vmw201
admin_server = vmw201
}
[domain_realm]
.hadoop.com = HADOOP.COM
hadoop.com = HADOOP.COM
說明:
[logging]:表示server端的日志的打印位置
[libdefaults]:每種連接的默認(rèn)配置,需要注意以下幾個(gè)關(guān)鍵的小配置
default_realm = HADOOP.COM 默認(rèn)的realm匠襟,必須跟要配置的realm的名稱一致钝侠。
udp_preference_limit = 1 禁止使用udp可以防止一個(gè)Hadoop中的錯(cuò)誤
oticket_lifetime表明憑證生效的時(shí)限,一般為24小時(shí)酸舍。
orenew_lifetime表明憑證最長可以被延期的時(shí)限帅韧,一般為一個(gè)禮拜。當(dāng)憑證過期之后啃勉,
對(duì)安全認(rèn)證的服務(wù)的后續(xù)訪問則會(huì)失敗忽舟。
kdc:代表要kdc的位置。格式是 機(jī)器:端口
admin_server:代表admin的位置淮阐。格式是機(jī)器:端口
default_domain:代表默認(rèn)的域名
2.2.5 創(chuàng)建/初始化Kerberos database
初始化并啟動(dòng):完成上面兩個(gè)配置文件后叮阅,就可以進(jìn)行初始化并啟動(dòng)了。
[root@vmw201 ~]# /usr/sbin/kdb5_util create -s -r HADOOP.COM
其中泣特,[-s]表示生成stash file浩姥,并在其中存儲(chǔ)master server key(krb5kdc);還可以用[-r]來指定一個(gè)realm name —— 當(dāng)krb5.conf中定義了多個(gè)realm時(shí)才是必要的状您。
保存路徑為/var/kerberos/krb5kdc 如果需要重建數(shù)據(jù)庫勒叠,將該目錄下的principal相關(guān)的文件刪除即可
在此過程中,我們會(huì)輸入database的管理密碼膏孟。這里設(shè)置的密碼一定要記住眯分,如果忘記了,就無法管理Kerberos server骆莹。
當(dāng)Kerberos database創(chuàng)建好后颗搂,可以看到目錄 /var/kerberos/krb5kdc 下生成了幾個(gè)文件:
kadm5.acl
kdc.conf
principal
principal.kadm5
principal.kadm5.lock
principal.ok
2.2.6 添加database administrator
我們需要為Kerberos database添加administrative principals (即能夠管理database的principals) —— 至少要添加1個(gè)principal來使得Kerberos的管理進(jìn)程kadmind能夠在網(wǎng)絡(luò)上與程序kadmin進(jìn)行通訊。
在maste KDC上執(zhí)行:
[root@vmw201 /]# /usr/sbin/kadmin.local -q "addprinc admin/admin"
并為其設(shè)置密碼
kadmin.local
可以直接運(yùn)行在master KDC上幕垦,而不需要首先通過Kerberos的認(rèn)證丢氢,實(shí)際上它只需要對(duì)本
地文件的讀寫權(quán)限傅联。
2.2.7 為database administrator設(shè)置ACL權(quán)限
在KDC上我們需要編輯acl文件來設(shè)置權(quán)限,該acl文件的默認(rèn)路徑是 /var/kerberos/krb5kdc/kadm5.acl(也可以在文件kdc.conf中修改)疚察。Kerberos的kadmind daemon會(huì)使用該文件來管理對(duì)Kerberos database的訪問權(quán)限蒸走。對(duì)于那些可能會(huì)對(duì)pincipal產(chǎn)生影響的操作,acl文件也能控制哪些principal能操作哪些其他pricipals貌嫡。
我們現(xiàn)在為administrator設(shè)置權(quán)限:將文件/var/kerberos/krb5kdc/kadm5.acl的內(nèi)容編輯為
*/admin@HADOOP.COM
代表名稱匹配/admin@HADOOP.COM 都認(rèn)為是admin比驻,權(quán)限是 。代表全部權(quán)限岛抄。
2.2.8 在master KDC啟動(dòng)Kerberos daemons
手動(dòng)啟動(dòng):
[root@vmw201 /]# service krb5kdc start
[root@vmw201 /]# service kadmin start
設(shè)置開機(jī)自動(dòng)啟動(dòng):
[root@vmw201 /]# chkconfig krb5kdc on
[root@vmw201 /]# chkconfig kadmin on
現(xiàn)在KDC已經(jīng)在工作了别惦。這兩個(gè)daemons將會(huì)在后臺(tái)運(yùn)行,可以查看它們的日志文件(/var/log/krb5kdc.log 和 /var/log/kadmind.log)夫椭。
可以通過命令kinit來檢查這兩個(gè)daemons是否正常工作掸掸。
2.2.9關(guān)于AES-256加密
對(duì)于使用 centos5. 6及以上的系統(tǒng),默認(rèn)使用 AES-256 來加密的蹭秋。這就需要集群中的所有節(jié)點(diǎn)上安裝 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File扰付。
下載的文件是一個(gè) zip 包,解開后仁讨,將里面的兩個(gè)文件放到下面的目錄中:$JAVA_HOME/jre/lib/security
2.3 Configuring Kerberos Clients
2.3.1 Installing Kerberos Client(CentOS7可以省略此步驟)
在另外兩臺(tái)主機(jī)(vmw202,vmw203)上安裝kerberos客戶端羽莺。
yum install krb5-workstation krb5-libs krb5-auth-dialog
2.3.2 配置krb5.conf
配置這些主機(jī)上的/etc/krb5.conf,這個(gè)文件的內(nèi)容與KDC中的文件保持一致即可洞豁。
kerberos的日常操作與常見問題
3.1 管理員操作
3.1.1 登錄
登錄到管理員賬戶: 如果在本機(jī)上盐固,可以通過kadmin.local直接登錄。其它機(jī)器的丈挟,先使用kinit進(jìn)行驗(yàn)證闰挡。
3.1.2增刪改查賬戶
在管理員的狀態(tài)下使用addprinc,delprinc,modprinc,listprincs命令。使用?可以列出所有的命令
kadmin.local: addprinc test
kadmin.local: delprinc test
kadmin.local: listprincs
3.1.3生成keytab:使用xst命令或者ktadd命令
kadmin:xst -k /xxx/xxx/kerberos.keytab hdfs/hadoop1
3.2 用戶操作
3.2.1 查看當(dāng)前的認(rèn)證用戶
3.2.3 認(rèn)證用戶
kinit -kt /xx/xx/kerberos.keytab hdfs/hadoop1
3.2.4 刪除當(dāng)前的認(rèn)證的緩存
kdestroy
3.3 常見問題
3.3.1 查看ticket是否是renewable
通過klist命令來查看
如果Valid starting的值與renew until的值相同礁哄,則表示該principal的ticket 不是 renwable长酗。
3.3.2 ticket無法更新
如果過了Expires,可以通過命令kinit –R來更新ticket
但如果ticket無法更新
[root@vmw201 ~]$ kinit -R
kinit: Ticket expired while renewing credentials
這是因?yàn)閗rbtgt/HADOOP.COM@ HADOOP.COM的[renewlife]被設(shè)置成了0,這一點(diǎn)可以通過[kadmin.local => getprinc krbtgt/ HADOOP.COM @ HADOOP.COM]看出來桐绒。
將krbtgt/HADOOP.COM@HADOOP.COM的[renewlife]修改為7days即可夺脾,方法
kadmin.local: modprinc -maxrenewlife 1week krbtgt/HADOOP.COM@HADOOP.COM
tips:配置JCE,這是因?yàn)镃entOS6.5及以上系統(tǒng)默認(rèn)使用AES-256加密茉继,因此需要所有節(jié)點(diǎn)安裝并配置JCE咧叭,JCE下載路徑: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
[root@cent-1 UnlimitedJCEPolicyJDK8]# ll
total 16
-rw-rw-r--. 1 root root 3035 Dec 21 2013 local_policy.jar
-rw-r--r--. 1 root root 7323 Dec 21 2013 README.txt
-rw-rw-r--. 1 root root 3023 Dec 21 2013 US_export_policy.jar
[root@cent-1 security]# cp /home/centos/UnlimitedJCEPolicyJDK8/ /usr/java/jdk1.8.0_11/jre/lib/security/
local_policy.jar README.txt US_export_policy.jar
[root@cent-1 security]# cp /home/centos/UnlimitedJCEPolicyJDK8/US_export_policy.jar /usr/java/jdk1.8.0_11/jre/lib/security/
cp: overwrite `/usr/java/jdk1.8.0_11/jre/lib/security/US_export_policy.jar'? y