轉(zhuǎn)載自 JavaChen Blog,作者:JavaChen
原文鏈接地址:http://blog.javachen.com/2014/11/04/config-kerberos-in-cdh-hdfs.html
轉(zhuǎn)載自 小黑的博客
原文鏈接地址:http://www.xiaohei.info/2016/09/01/cdh-install-kerberos-ldap-sentry/
參考上面兩篇基本配置,添加了部分配置
本文主要記錄 CDH 集群上集成 Kerberos 的過(guò)程,包括 Kerberos 的安裝和 CDH 相關(guān)配置修改說(shuō)明。
一、安裝Kerberos
1. 整體說(shuō)明
軟件版本
操作系統(tǒng):CentOs 6.8
CDH版本:Hadoop 2.6.0-cdh5.9.0
JDK版本:jdk1.7.0_67-cloudera
運(yùn)行用戶:root集群主機(jī)角色劃分
sunmvm20 作為master節(jié)點(diǎn),安裝kerberos Server
其他節(jié)點(diǎn)作為slave節(jié)點(diǎn),安裝kerberos client
2. 配置host
添加主機(jī)名到 /etc/hosts 文件中。
$ cat /etc/hosts
127.0.0.1 localhost
192.168.1.20 sunmvm20
192.168.1.26 sunmvm26
192.168.1.27 sunmvm27
192.168.1.28 sunmvm28
注意:hostname 請(qǐng)使用小寫(xiě),要不然在集成 kerberos 時(shí)會(huì)出現(xiàn)一些錯(cuò)誤。
3. 安裝 Kerberos
在 sunmvm20 上安裝 krb5、krb5-server 和 krb5-client。
yum install krb5-server -y
# klist等命令找不大時(shí)執(zhí)行下面安裝
yum install -y krb5-server krb5-workstation pam_krb5
在其他節(jié)點(diǎn)安裝 krb5-devel、krb5-workstation
$ ssh sunmvm26 "yum install krb5-devel krb5-workstation -y"
$ ssh sunmvm27 "yum install krb5-devel krb5-workstation -y"
$ ssh sunmvm28 "yum install krb5-devel krb5-workstation -y"
4. 修改配置文件
kdc 服務(wù)涉及到三個(gè)配置文件:
- /etc/krb5.conf
- /var/kerberos/krb5kdc/kdc.conf
- /var/kerberos/krb5kdc/kadm5.acl
1)編輯配置文件 /etc/krb5.conf。默認(rèn)安裝的文件中包含多個(gè)示例項(xiàng)。
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = 0HKJ.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
default_tgs_enctypes = aes256-cts-hmac-sha1-96
default_tkt_enctypes = aes256-cts-hmac-sha1-96
permitted_enctypes = aes256-cts-hmac-sha1-96
clockskew = 120
udp_preference_limit = 1
[realms]
0HKJ.COM = {
kdc = sunmvm20
admin_server = sunmvm20
}
[domain_realm]
.0hkj.com = 0HKJ.COM
ohkj.com = 0HKJ.COM
說(shuō)明:
- [logging]:表示 server 端的日志的打印位置
- [libdefaults]:每種連接的默認(rèn)配置,需要注意以下幾個(gè)關(guān)鍵的小配置
- default_realm = 0HKJ.COM:設(shè)置 Kerberos 應(yīng)用程序的默認(rèn)領(lǐng)域。如果您有多個(gè)領(lǐng)域,只需向 [realms] 節(jié)添加其他的語(yǔ)句。
- ticket_lifetime: 表明憑證生效的時(shí)限,一般為24小時(shí)。
- renew_lifetime: 表明憑證最長(zhǎng)可以被延期的時(shí)限,一般為一個(gè)禮拜。當(dāng)憑證過(guò)期之后,對(duì)安全認(rèn)證的服務(wù)的后續(xù)訪問(wèn)則會(huì)失敗。
- clockskew:時(shí)鐘偏差是不完全符合主機(jī)系統(tǒng)時(shí)鐘的票據(jù)時(shí)戳的容差,超過(guò)此容差將不接受此票據(jù)。通常,將時(shí)鐘扭斜設(shè)置為 300 秒(5 分鐘)。這意味著從服務(wù)器的角度看,票證的時(shí)間戳與它的偏差可以是在前后 5 分鐘內(nèi)。
- udp_preference_limit= 1:禁止使用 udp 可以防止一個(gè) Hadoop 中的錯(cuò)誤
- [realms]:列舉使用的 realm。
- kdc:代表要 kdc 的位置。格式是 機(jī)器:端口
- admin_server:代表 admin 的位置。格式是 機(jī)器:端口
- default_domain:代表默認(rèn)的域名
- [appdefaults]:可以設(shè)定一些針對(duì)特定應(yīng)用的配置,覆蓋默認(rèn)配置。
2)修改 /var/kerberos/krb5kdc/kdc.conf ,該文件包含 Kerberos 的配置信息。例如,KDC 的位置,Kerbero 的 admin 的realms 等。需要所有使用的 Kerberos 的機(jī)器上的配置文件都同步。這里僅列舉需要的基本配置。詳細(xì)介紹參考:krb5conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
0HKJ.COM = {
#master_key_type = aes256-cts acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
max_renewable_life = 7d
max_life = 1d
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
default_principal_flags = +renewable, +forwardable
}
說(shuō)明:
- 0HKJ.COM: 是設(shè)定的 realms。名字隨意。Kerberos 可以支持多個(gè) realms,會(huì)增加復(fù)雜度。大小寫(xiě)敏感,一般為了識(shí)別使用全部大寫(xiě)。這個(gè) realms 跟機(jī)器的 host 沒(méi)有大關(guān)系。
- master_key_type:和 supported_enctypes 默認(rèn)使用 aes256-cts。JAVA 使用 aes256-cts 驗(yàn)證方式需要安裝 JCE 包,見(jiàn)下面的說(shuō)明。為了簡(jiǎn)便,你可以不使用 aes256-cts 算法,這樣就不需要安裝 JCE 。
- acl_file:標(biāo)注了 admin 的用戶權(quán)限,需要用戶自己創(chuàng)建。文件格式是:Kerberos_principal permissions [target_principal] [restrictions]
- supported_enctypes:支持的校驗(yàn)方式。
- admin_keytab:KDC 進(jìn)行校驗(yàn)的 keytab。
關(guān)于AES-256加密:
對(duì)于使用 centos5. 6 及以上的系統(tǒng),默認(rèn)使用 AES-256 來(lái)加密的。這就需要集群中的所有節(jié)點(diǎn)上安裝 JCE,如果你使用的是 JDK1.6 ,則到Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 6 頁(yè)面下載,如果是 JDK1.7,則到 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 7 下載。下載的文件是一個(gè) zip 包,解開(kāi)后,將里面的兩個(gè)文件放到下面的目錄中:$JAVA_HOME/jre/lib/security.
上面這一步一定要做,否則會(huì)報(bào)zk,namenode等不支持默認(rèn)tkt的加密方式錯(cuò)誤。
3)為了能夠不直接訪問(wèn) KDC 控制臺(tái)而從 Kerberos 數(shù)據(jù)庫(kù)添加和刪除主體,請(qǐng)對(duì) Kerberos 管理服務(wù)器指示允許哪些主體執(zhí)行哪些操作。通過(guò)創(chuàng)建 /var/lib/kerberos/krb5kdc/kadm5.acl 完成此操作。
$ cat /var/kerberos/krb5kdc/kadm5.acl
內(nèi)容如下:
*/admin@0HKJ.COM *
表示principal的名字的第二部分如果是admin,那么該principal就擁有管理員權(quán)限
5. 同步配置文件
將 kdc 中的 /etc/krb5.conf 拷貝到集群中其他服務(wù)器即可。
$ scp /etc/krb5.conf sunmvm26:/etc/krb5.conf
$ scp /etc/krb5.conf sunmvm27:/etc/krb5.conf
$ scp /etc/krb5.conf sunmvm28:/etc/krb5.conf
6. 創(chuàng)建數(shù)據(jù)庫(kù)
在 sunmvm20 上運(yùn)行初始化數(shù)據(jù)庫(kù)命令。其中 -r 指定對(duì)應(yīng) realm。
$ kdb5_util create -r 0HKJ.COM -s
出現(xiàn) Loading random data 的時(shí)候另開(kāi)個(gè)終端執(zhí)行點(diǎn)消耗CPU的命令如 cat /dev/sda > /dev/urandom 可以加快隨機(jī)數(shù)采集。該命令會(huì)在 /var/kerberos/krb5kdc/ 目錄下創(chuàng)建 principal 數(shù)據(jù)庫(kù)。
如果遇到數(shù)據(jù)庫(kù)已經(jīng)存在的提示,可以把 /var/kerberos/krb5kdc/ 目錄下的 principal 的相關(guān)文件都刪除掉。默認(rèn)的數(shù)據(jù)庫(kù)名字都是 principal??梢允褂?-d指定數(shù)據(jù)庫(kù)名字。
7. 啟動(dòng)Kerberos服務(wù)
在 sunmvm20 節(jié)點(diǎn)上運(yùn)行:
$ chkconfig --level 35 krb5kdc on
$ chkconfig --level 35 kadmin on
$ service krb5kdc start
$ service kadmin start
8. 創(chuàng)建 kerberos 管理員
關(guān)于 kerberos 的管理,可以使用 kadmin.local 或 kadmin,至于使用哪個(gè),取決于賬戶和訪問(wèn)權(quán)限:
如果有訪問(wèn) kdc 服務(wù)器的 root 權(quán)限,但是沒(méi)有 kerberos admin 賬戶,使用 kadmin.local
如果沒(méi)有訪問(wèn) kdc 服務(wù)器的 root 權(quán)限,但是用 kerberos admin 賬戶,使用 kadmin
在 sunmvm20 上創(chuàng)建遠(yuǎn)程管理的管理員:手動(dòng)輸入兩次密碼
$ kadmin.local -q "addprinc root/admin"
- 也可以不用手動(dòng)輸入密碼
$ echo -e "root\nroot" | kadmin.local -q "addprinc root/admin"
抽取密鑰并將其儲(chǔ)存在本地 keytab 文件 /etc/krb5.keytab 中。這個(gè)文件由超級(jí)用戶擁有,所以必須是 root 用戶才能在 kadmin shell 中執(zhí)行以下命令:
kadmin.local -q "ktadd kadmin/admin"
# 查看生成的keytab
klist -k /etc/krb5.keytab
9. 測(cè)試 kerberos
# 列出Kerberos中的所有認(rèn)證用戶,即principals
kadmin.local -q "list_principals"
# 添加認(rèn)證用戶,需要輸入密碼
kadmin.local -q "addprinc user1"
# 使用該用戶登錄,獲取身份認(rèn)證,需要輸入密碼
kinit user1
# 查看當(dāng)前用戶的認(rèn)證信息ticket
klist
# 更新ticket
kinit -R
# 銷毀當(dāng)前的ticket
kdestroy
# 刪除認(rèn)證用戶
kadmin.local -q "delprinc user1"
二、CDH啟用Kerberos
CM中的操作
在CM的界面上點(diǎn)擊啟用Kerberos,啟用的時(shí)候需要確認(rèn)幾個(gè)事情:
1.KDC已經(jīng)安裝好并且正在運(yùn)行
2.將KDC配置為允許renewable tickets with non-zerolifetime(在之前修改kdc.conf文件的時(shí)候已經(jīng)添加了kdc_tcp_ports、max_life和max_renewable_life這個(gè)三個(gè)選項(xiàng))
3.在Cloudera Manager Server上安裝openldap-clients
4.為Cloudera Manager創(chuàng)建一個(gè)principal,使其能夠有權(quán)限在KDC中創(chuàng)建其他的principals,就是上面創(chuàng)建的Kerberos管理員賬號(hào)
上述確認(rèn)完了之后點(diǎn)擊continue,進(jìn)入下一頁(yè)進(jìn)行配置,要注意的是:這里的『Kerberos Encryption Types』必須跟KDC實(shí)際支持的加密類型匹配即 /etc/krb5.conf 中的default_tgs_enctypes、default_tkt_enctypes和permitted_enctypes三個(gè)選項(xiàng)的值對(duì)應(yīng)起來(lái),不然會(huì)出現(xiàn)集群服務(wù)無(wú)法認(rèn)證通過(guò)的情況。
填 aes256-cts
點(diǎn)擊continue,進(jìn)入下一頁(yè),這一頁(yè)中可以不勾選『Manage krb5.conf through Cloudera Manager』注意,如果勾選了這個(gè)選項(xiàng)就可以通過(guò)CM的管理界面來(lái)部署krb5.conf,但是實(shí)際操作過(guò)程中發(fā)現(xiàn)有些配置仍然需要手動(dòng)修改該文件并同步。
點(diǎn)擊continue,進(jìn)入下一頁(yè),輸入Cloudera Manager Principal的管理員賬號(hào)和密碼,注意輸入賬號(hào)的時(shí)候要使用@前要使用全稱,root/admin。
點(diǎn)擊continue,進(jìn)入下一頁(yè),導(dǎo)入KDC Account Manager Credentials。
點(diǎn)擊continue,進(jìn)入下一頁(yè),restart cluster并且enable Kerberos。
之后CM會(huì)自動(dòng)重啟集群服務(wù),啟動(dòng)之后會(huì)會(huì)提示Kerberos已啟用。
在CM上啟用Kerberos的過(guò)程中,CM會(huì)自動(dòng)做以下的事情:
1.集群中有多少個(gè)節(jié)點(diǎn),每個(gè)賬戶都會(huì)生成對(duì)應(yīng)個(gè)數(shù)的principal,格式為username/hostname@OHKJ.COM,例如hdfs/hadoop-10-0-8-124@OHKJ.COM。使用如下命令來(lái)查看:
kadmin.local -q "list_principals"
2.為每個(gè)對(duì)應(yīng)的principal創(chuàng)建keytab
3.部署keytab文件到指定的節(jié)點(diǎn)中
keytab是包含principals和加密principal key的文件,keytab文件對(duì)于每個(gè)host是唯一的,因?yàn)閗ey中包含hostname,keytab文件用于不需要人工交互和保存純文本密碼,實(shí)現(xiàn)到kerberos上驗(yàn)證一個(gè)主機(jī)上的principal。啟用之后訪問(wèn)集群的所有資源都需要使用相應(yīng)的賬號(hào)來(lái)訪問(wèn),否則會(huì)無(wú)法通過(guò)Kerberos的authenticatin
4.在每個(gè)服務(wù)的配置文件中加入有關(guān)Kerberos的配置,其中包括Zookeeper服務(wù)所需要的jaas.conf和keytab文件都會(huì)自動(dòng)設(shè)定并讀取,如果用戶仍然手動(dòng)修改了Zookeeper的服務(wù),要確保這兩個(gè)文件的路徑和內(nèi)容正確性。
創(chuàng)建HDFS超級(jí)用戶
此時(shí)直接用CM生成的principal訪問(wèn)HDFS會(huì)失敗,因?yàn)槟切┳詣?dòng)生成的principal的密碼是隨機(jī)的,用戶并不知道,而通過(guò)命令行的方式訪問(wèn)HDFS需要先使用kinit來(lái)登錄并獲得ticket,所以使用kinit hdfs/hadoop-10-0-8-124@XIAOHEI.INFO需要輸入密碼的時(shí)候無(wú)法繼續(xù)。用戶可以通過(guò)創(chuàng)建一個(gè)hdfs@0HKJ.COM的principal并記住密碼從命令行中訪問(wèn)HDFS。登錄之后就可以通過(guò)認(rèn)證并訪問(wèn)HDFS,默認(rèn)hdfs用戶是超級(jí)用戶。
kadmin.local -q "addprinc hdfs"
kinit hdfs@0HKJ.COM
為每個(gè)用戶創(chuàng)建principal
當(dāng)集群運(yùn)行Kerberos后,每一個(gè)Hadoop user都必須有一個(gè)principal或者keytab來(lái)獲取Kerberos credentials(即使用密碼的方式或者使用keytab驗(yàn)證的方式)這樣才能訪問(wèn)集群并使用Hadoop的服務(wù)。也就是說(shuō),如果Hadoop集群存在一個(gè)名為hdfs@0HKJ.COM的principal那么在集群的每一個(gè)節(jié)點(diǎn)上應(yīng)該存在一個(gè)名為hdfs的Linux用戶。同時(shí),在HDFS中的目錄/user要存在相應(yīng)的用戶目錄(即/user/hdfs),且該目錄的owner和group都要是hdfs
一般來(lái)說(shuō),Hadoop user會(huì)對(duì)應(yīng)集群中的每個(gè)服務(wù),即一個(gè)服務(wù)對(duì)應(yīng)一個(gè)user。例如impala服務(wù)對(duì)應(yīng)用戶impala。
至此,集群上的服務(wù)都啟用了Kerberos的安全認(rèn)證
三、驗(yàn)證Kerberos在集群上是否正常工作
1.確認(rèn)HDFS可以正常使用
登錄到某一個(gè)節(jié)點(diǎn)后,切換到hdfs用戶,然后用kinit來(lái)獲取credentials
現(xiàn)在用hadoop hdfs -ls /應(yīng)該能正常輸出結(jié)果
用kdestroy銷毀credentials后,再使用hadoop hdfs -ls /會(huì)發(fā)現(xiàn)報(bào)錯(cuò)
2.確認(rèn)可以正常提交MapReduce job
獲取了hdfs的證書(shū)后,提交一個(gè)PI程序,如果能正常提交并成功運(yùn)行,則說(shuō)明Kerberized Hadoop cluster在正常工作
hadoop jar /opt/cloudera/parcels/CDH-5.9.0-1.cdh5.9.0.p0.23/lib/hadoop-mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.9.0.jar pi 2 2
四、集群集成Kerberos過(guò)程中遇到的坑
hdfs用戶提交mr作業(yè)無(wú)法運(yùn)行
INFO mapreduce.Job: Job job_1442654915965_0002 failed with state FAILED due to: Application application_1442654915965_0002 failed 2 times due to AM Container for appattempt_1442654915965_0002_000002 exited with exitCode: -1000 due to: Application application_1442654915965_0002 initialization failed (exitCode=255) with output: Requested user hdfs is not whitelisted and has id 496,which is below the minimum allowed 1000
原因:
Linux user 的 user id 要大于等于1000,否則會(huì)無(wú)法提交Job。例如,如果以hdfs(id為490)的身份提交一個(gè)job,就會(huì)看到以上的錯(cuò)誤信息
解決方法:
1.使用命令 usermod -u 修改一個(gè)用戶的user id
2.修改Clouder關(guān)于這個(gè)該項(xiàng)的設(shè)置,Yarn->配置->min.user.id修改為合適的值,當(dāng)前為0
提交mr作業(yè)時(shí)可以運(yùn)行但是有錯(cuò)誤信息
INFO mapreduce.Job: Job job_1442722429197_0001 failed with state FAILED due to: Application application_1442722429197_0001 failed 2 times due to AM Container for appattempt_1442722429197_0001_000002 exited with exitCode: -1000 due to: Application application_1442722429197_0001 initialization failed (exitCode=255) with output: Requested user hdfs is banned
原因:
hdfs用戶被禁止運(yùn)行 YARN container,yarn的設(shè)置中將hdfs用戶禁用了
解決方法:
修改Clouder關(guān)于這個(gè)該項(xiàng)的設(shè)置,Yarn->配置->banned.users 將hdfs用戶移除
YARN job運(yùn)行時(shí)無(wú)法創(chuàng)建緩存目錄
異常信息:
main : user is hdfs
main : requested yarn user is hdfs
Can’t create directory /data/data/yarn/nm/usercache/hdfs/appcache/application_1442724165689_0005 - Permission denied
原因:
該緩存目錄在集群進(jìn)入Kerberos狀態(tài)前就已經(jīng)存在了。例如當(dāng)我們還沒(méi)為集群Kerberos支持的時(shí)候,就用該用戶跑過(guò)YARN應(yīng)用
解決方法:
在每一個(gè)NodeManager節(jié)點(diǎn)上刪除該用戶的緩存目錄,對(duì)于用戶hdfs,是/data/data/yarn/nm/usercache/hdfs