CDH集成Kerberos配置

轉(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容