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 的過程,包括 Kerberos 的安裝和 CDH 相關(guān)配置修改說明。

一、安裝Kerberos

1. 整體說明

  • 軟件版本
    操作系統(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 請使用小寫,要不然在集成 kerberos 時會出現(xiàn)一些錯誤。

3. 安裝 Kerberos

在 sunmvm20 上安裝 krb5、krb5-server 和 krb5-client。

yum install krb5-server -y
# klist等命令找不大時執(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ù)涉及到三個配置文件:

  • /etc/krb5.conf
  • /var/kerberos/krb5kdc/kdc.conf
  • /var/kerberos/krb5kdc/kadm5.acl

1)編輯配置文件 /etc/krb5.conf。默認(rèn)安裝的文件中包含多個示例項。

[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

說明:

  • [logging]:表示 server 端的日志的打印位置
  • [libdefaults]:每種連接的默認(rèn)配置,需要注意以下幾個關(guān)鍵的小配置
    • default_realm = 0HKJ.COM:設(shè)置 Kerberos 應(yīng)用程序的默認(rèn)領(lǐng)域。如果您有多個領(lǐng)域,只需向 [realms] 節(jié)添加其他的語句。
    • ticket_lifetime: 表明憑證生效的時限,一般為24小時。
    • renew_lifetime: 表明憑證最長可以被延期的時限,一般為一個禮拜。當(dāng)憑證過期之后,對安全認(rèn)證的服務(wù)的后續(xù)訪問則會失敗。
    • clockskew:時鐘偏差是不完全符合主機(jī)系統(tǒng)時鐘的票據(jù)時戳的容差,超過此容差將不接受此票據(jù)。通常,將時鐘扭斜設(shè)置為 300 秒(5 分鐘)。這意味著從服務(wù)器的角度看,票證的時間戳與它的偏差可以是在前后 5 分鐘內(nèi)。
    • udp_preference_limit= 1:禁止使用 udp 可以防止一個 Hadoop 中的錯誤
  • [realms]:列舉使用的 realm。
    • kdc:代表要 kdc 的位置。格式是 機(jī)器:端口
    • admin_server:代表 admin 的位置。格式是 機(jī)器:端口
    • default_domain:代表默認(rèn)的域名
  • [appdefaults]:可以設(shè)定一些針對特定應(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
 }

說明:

  • 0HKJ.COM: 是設(shè)定的 realms。名字隨意。Kerberos 可以支持多個 realms,會增加復(fù)雜度。大小寫敏感,一般為了識別使用全部大寫。這個 realms 跟機(jī)器的 host 沒有大關(guān)系。
  • master_key_type:和 supported_enctypes 默認(rèn)使用 aes256-cts。JAVA 使用 aes256-cts 驗(yàn)證方式需要安裝 JCE 包,見下面的說明。為了簡便,你可以不使用 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加密:

對于使用 centos5. 6 及以上的系統(tǒng),默認(rèn)使用 AES-256 來加密的。這就需要集群中的所有節(jié)點(diǎn)上安裝 JCE,如果你使用的是 JDK1.6 ,則到Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 6 頁面下載,如果是 JDK1.7,則到 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 7 下載。下載的文件是一個 zip 包,解開后,將里面的兩個文件放到下面的目錄中:$JAVA_HOME/jre/lib/security.

上面這一步一定要做,否則會報zk,namenode等不支持默認(rèn)tkt的加密方式錯誤。

3)為了能夠不直接訪問 KDC 控制臺而從 Kerberos 數(shù)據(jù)庫添加和刪除主體,請對 Kerberos 管理服務(wù)器指示允許哪些主體執(zhí)行哪些操作。通過創(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ù)庫

在 sunmvm20 上運(yùn)行初始化數(shù)據(jù)庫命令。其中 -r 指定對應(yīng) realm。

$ kdb5_util create -r 0HKJ.COM -s

出現(xiàn) Loading random data 的時候另開個終端執(zhí)行點(diǎn)消耗CPU的命令如 cat /dev/sda > /dev/urandom 可以加快隨機(jī)數(shù)采集。該命令會在 /var/kerberos/krb5kdc/ 目錄下創(chuàng)建 principal 數(shù)據(jù)庫。

如果遇到數(shù)據(jù)庫已經(jīng)存在的提示,可以把 /var/kerberos/krb5kdc/ 目錄下的 principal 的相關(guān)文件都刪除掉。默認(rèn)的數(shù)據(jù)庫名字都是 principal??梢允褂?-d指定數(shù)據(jù)庫名字。

7. 啟動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,至于使用哪個,取決于賬戶和訪問權(quán)限:

  • 如果有訪問 kdc 服務(wù)器的 root 權(quán)限,但是沒有 kerberos admin 賬戶,使用 kadmin.local

  • 如果沒有訪問 kdc 服務(wù)器的 root 權(quán)限,但是用 kerberos admin 賬戶,使用 kadmin
    在 sunmvm20 上創(chuàng)建遠(yuǎn)程管理的管理員:

  • 手動輸入兩次密碼

$ kadmin.local -q "addprinc root/admin"
  • 也可以不用手動輸入密碼
$ echo -e "root\nroot" | kadmin.local -q "addprinc root/admin"

抽取密鑰并將其儲存在本地 keytab 文件 /etc/krb5.keytab 中。這個文件由超級用戶擁有,所以必須是 root 用戶才能在 kadmin shell 中執(zhí)行以下命令:

kadmin.local -q "ktadd kadmin/admin"

# 查看生成的keytab
klist -k /etc/krb5.keytab

9. 測試 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,啟用的時候需要確認(rèn)幾個事情:

1.KDC已經(jīng)安裝好并且正在運(yùn)行  
2.將KDC配置為允許renewable tickets with non-zerolifetime(在之前修改kdc.conf文件的時候已經(jīng)添加了kdc_tcp_ports、max_life和max_renewable_life這個三個選項)  
3.在Cloudera Manager Server上安裝openldap-clients  
4.為Cloudera Manager創(chuàng)建一個principal,使其能夠有權(quán)限在KDC中創(chuàng)建其他的principals,就是上面創(chuàng)建的Kerberos管理員賬號

上述確認(rèn)完了之后點(diǎn)擊continue,進(jìn)入下一頁進(jìn)行配置,要注意的是:這里的『Kerberos Encryption Types』必須跟KDC實(shí)際支持的加密類型匹配即 /etc/krb5.conf 中的default_tgs_enctypes、default_tkt_enctypes和permitted_enctypes三個選項的值對應(yīng)起來,不然會出現(xiàn)集群服務(wù)無法認(rèn)證通過的情況。
填 aes256-cts

點(diǎn)擊continue,進(jìn)入下一頁,這一頁中可以不勾選『Manage krb5.conf through Cloudera Manager』注意,如果勾選了這個選項就可以通過CM的管理界面來部署krb5.conf,但是實(shí)際操作過程中發(fā)現(xiàn)有些配置仍然需要手動修改該文件并同步。

點(diǎn)擊continue,進(jìn)入下一頁,輸入Cloudera Manager Principal的管理員賬號和密碼,注意輸入賬號的時候要使用@前要使用全稱,root/admin。

點(diǎn)擊continue,進(jìn)入下一頁,導(dǎo)入KDC Account Manager Credentials。

點(diǎn)擊continue,進(jìn)入下一頁,restart cluster并且enable Kerberos。

之后CM會自動重啟集群服務(wù),啟動之后會會提示Kerberos已啟用。

在CM上啟用Kerberos的過程中,CM會自動做以下的事情:

1.集群中有多少個節(jié)點(diǎn),每個賬戶都會生成對應(yīng)個數(shù)的principal,格式為username/hostname@OHKJ.COM,例如hdfs/hadoop-10-0-8-124@OHKJ.COM。使用如下命令來查看:

kadmin.local -q "list_principals"

2.為每個對應(yīng)的principal創(chuàng)建keytab

3.部署keytab文件到指定的節(jié)點(diǎn)中
keytab是包含principals和加密principal key的文件,keytab文件對于每個host是唯一的,因?yàn)閗ey中包含hostname,keytab文件用于不需要人工交互和保存純文本密碼,實(shí)現(xiàn)到kerberos上驗(yàn)證一個主機(jī)上的principal。啟用之后訪問集群的所有資源都需要使用相應(yīng)的賬號來訪問,否則會無法通過Kerberos的authenticatin

4.在每個服務(wù)的配置文件中加入有關(guān)Kerberos的配置,其中包括Zookeeper服務(wù)所需要的jaas.conf和keytab文件都會自動設(shè)定并讀取,如果用戶仍然手動修改了Zookeeper的服務(wù),要確保這兩個文件的路徑和內(nèi)容正確性。

創(chuàng)建HDFS超級用戶

此時直接用CM生成的principal訪問HDFS會失敗,因?yàn)槟切┳詣由傻膒rincipal的密碼是隨機(jī)的,用戶并不知道,而通過命令行的方式訪問HDFS需要先使用kinit來登錄并獲得ticket,所以使用kinit hdfs/hadoop-10-0-8-124@XIAOHEI.INFO需要輸入密碼的時候無法繼續(xù)。用戶可以通過創(chuàng)建一個hdfs@0HKJ.COM的principal并記住密碼從命令行中訪問HDFS。登錄之后就可以通過認(rèn)證并訪問HDFS,默認(rèn)hdfs用戶是超級用戶。

kadmin.local -q "addprinc hdfs"
kinit hdfs@0HKJ.COM

為每個用戶創(chuàng)建principal

當(dāng)集群運(yùn)行Kerberos后,每一個Hadoop user都必須有一個principal或者keytab來獲取Kerberos credentials(即使用密碼的方式或者使用keytab驗(yàn)證的方式)這樣才能訪問集群并使用Hadoop的服務(wù)。也就是說,如果Hadoop集群存在一個名為hdfs@0HKJ.COM的principal那么在集群的每一個節(jié)點(diǎn)上應(yīng)該存在一個名為hdfs的Linux用戶。同時,在HDFS中的目錄/user要存在相應(yīng)的用戶目錄(即/user/hdfs),且該目錄的owner和group都要是hdfs

一般來說,Hadoop user會對應(yīng)集群中的每個服務(wù),即一個服務(wù)對應(yīng)一個user。例如impala服務(wù)對應(yīng)用戶impala。

至此,集群上的服務(wù)都啟用了Kerberos的安全認(rèn)證

三、驗(yàn)證Kerberos在集群上是否正常工作

1.確認(rèn)HDFS可以正常使用

登錄到某一個節(jié)點(diǎn)后,切換到hdfs用戶,然后用kinit來獲取credentials

現(xiàn)在用hadoop hdfs -ls /應(yīng)該能正常輸出結(jié)果
用kdestroy銷毀credentials后,再使用hadoop hdfs -ls /會發(fā)現(xiàn)報錯

2.確認(rèn)可以正常提交MapReduce job

獲取了hdfs的證書后,提交一個PI程序,如果能正常提交并成功運(yùn)行,則說明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過程中遇到的坑

hdfs用戶提交mr作業(yè)無法運(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,否則會無法提交Job。例如,如果以hdfs(id為490)的身份提交一個job,就會看到以上的錯誤信息

解決方法:

1.使用命令 usermod -u 修改一個用戶的user id   
2.修改Clouder關(guān)于這個該項的設(shè)置,Yarn->配置->min.user.id修改為合適的值,當(dāng)前為0  

提交mr作業(yè)時可以運(yùn)行但是有錯誤信息

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)于這個該項的設(shè)置,Yarn->配置->banned.users 將hdfs用戶移除

YARN job運(yùn)行時無法創(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)我們還沒為集群Kerberos支持的時候,就用該用戶跑過YARN應(yīng)用

解決方法:
在每一個NodeManager節(jié)點(diǎn)上刪除該用戶的緩存目錄,對于用戶hdfs,是/data/data/yarn/nm/usercache/hdfs

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

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

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