基于Hadoop集群安全考慮,需要上線kerberos認(rèn)證进倍,此章將介紹如果搭建一個(gè)主從配置(防止單點(diǎn)故障)的KDC環(huán)境微谓。
環(huán)境信息:
主機(jī)信息:
system: centos7
hosts:
kdcsrv01 - master kdc
kdcsrv02 - slave kdc
kdcsrv01 - master kadmin
相關(guān)信息介紹:
HADOOP.COM - realm name(域)
/var/kerberos/krb5kdc/.k5.HADOOP.COM - stash file(數(shù)據(jù)庫(kù)自動(dòng)登陸文件)
/var/kerberos/krb5kdc/principal, /var/kerberos/krb5kdc/principal.ok - kerberos database file
/var/kerberos/krb5kdc/principal.kadm5 - Kerberos administrative database file
/var/kerberos/krb5kdc/principal.kadm5.lock - administrative database lock file
/var/kerberos/krb5kdc/kdc.conf - kdc config file
/var/kerberos/krb5kdc/kadm5.acl - kdc acl file
/etc/krb5.conf - kdc config file
KDCs服務(wù)器搭建
1.安裝KDC服務(wù)程序
sudo yum install -y krb5-server openldap-clients krb5-workstation krb5-libs
2.設(shè)置配置文件
$ vi /etc/krb5.conf
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 1d
renew_lifetime = 7d
forwardable = true
rdns = false
default_realm = HADOOP.COM
renewable = true
udp_preference_limit = 1
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
HADOOP.COM = {
kdc = kdcsrv01:88
kdc = kdcsrv02:88
admin_server = kdcsrv01:749
default_domain = HADOOP.COM
}
[domain_realm]
.HADOOP.COM = HADOOP.COM
HADOOP.COM = HADOOP.COM
$ vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
HADOOP.COM = {
master_key_type = aes128-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
max_life = 1d
max_renewable_life = 7d
supported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
$ vi /var/kerberos/krb5kdc/kadm5.acl
*/admin@HADOOP.COM *
3.生成master kdc database(需記錄輸入的數(shù)據(jù)庫(kù)密碼)
$ sudo kdb5_util create -r HADOOP.COM -s
# 將在/var/kerberos/krb5kdc/目錄下生成多個(gè)principal*文件
# 注:生成random隨機(jī)數(shù)時(shí)較耗時(shí),所以此步驟執(zhí)行時(shí)間較長(zhǎng)式镐。
4.master 服務(wù)器添加admin用戶
$ sudo kadmin.local
addprinc admin/admin@HADOOP.COM
5.啟動(dòng)kdc 及 kadmin服務(wù)
$ sudo service krb5kdc start
$ sudo service kadmin start
$ sudo chkconfig --level 35 krb5kdc on
$ sudo chkconfig --level 35 kadmin on
6.驗(yàn)證admin賬戶是否能成功認(rèn)證
$ kinit admin/admin
# 注:
# """
# Aug 30 14:27:25 kdcsrv01 kadmind[6451](info): Seeding random number generator
# Aug 30 14:39:14 kdcsrv01 kadmind[6451](info): starting
#
# kamdin 啟動(dòng)時(shí)需要生成隨機(jī)數(shù)種子導(dǎo)致啟動(dòng)時(shí)間較長(zhǎng),執(zhí)行kadmin命令可能會(huì)卡住.
# 以上日志未在kadmin.log中查看kadmin進(jìn)程啟動(dòng)情況(完成啟動(dòng)耗時(shí)12分鐘)涛癌。
# """
配置slave kdc
7.master服務(wù)器生成host keytab文件(需root用戶,不能使用普通用戶:/etc/目錄無(wú)權(quán)限寫入)
$ sudo su - root
$ kadmin.local
addprinc -randkey host/kdcsrv01
ktadd host/kdcsrv01
8.安裝slave服務(wù)器
$ sudo yum install -y krb5-server openldap-clients krb5-workstation
# 拷貝master /etc/krb5.conf文件: scp kdcsrv01:/etc/krb5.conf /etc/krb5.conf
9.slave 服務(wù)器生成host keytab文件(需root用戶,不能使用普通用戶:/etc/目錄無(wú)權(quán)限寫入)
$ sudo su - root
$ kadmin.local
addprinc -randkey host/kdcsrv02
ktadd host/kdcsrv02
10.slave服務(wù)器創(chuàng)建kpropd.acl文件
$ sudo touch /var/kerberos/krb5kdc/kpropd.acl
$ sudo vi /var/kerberos/krb5kdc/kpropd.acl
host/kdcsrv01@HADOOP.COM
host/kdcsrv02@HADOOP.COM
11.拷貝master配置文件至slave服務(wù)器
$ scp /etc/krb5.conf kdcsrv02:/etc/;
$ cd /var/kerberos/krb5kdc;scp kdc.conf kadm5.acl .k5.HADOOP.COM kdcsrv02:/var/kerberos/krb5kdc/;
12.在slave上啟動(dòng)kpropd服務(wù)
$ sudo kpropd
13.在master上將相關(guān)數(shù)據(jù)同步到slave上(需定期手動(dòng)同步)
$ sudo kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
$ sudo kprop -f /var/kerberos/krb5kdc/slave_datatrans kdcsrv02
# 成功后犯戏,會(huì)出現(xiàn)以下信息:
# Database propagation to kdcsrv02: SUCCEEDED
# 創(chuàng)建crontab 腳本定期同步數(shù)據(jù)庫(kù):
$ vi /home/dengsc/kdc/sync_db.sh
#!/bin/sh
kdclist="kdcsrv02"
echo `date`"start to sync!"
sudo kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
for kdc in $kdclist;
do
sudo kprop -f /var/kerberos/krb5kdc/slave_datatrans $kdc
done
echo `date`"end to sync!"
# crontab 信息(master kdc 主機(jī)):30 16 * * * /home/dengsc/kdc/sync_db.sh >> /home/dengsc/kdc/sync.log
14.slave上/var/kerberos/krb5kdc/會(huì)多出一些文件
- from_master
- principal
- pricipal.kadm5
- principal.kadmin5.lock
- principal.ok
15.啟動(dòng)slave kdc服務(wù)
$ sudo service krb5kdc start
$ sudo chkconfig --level 35 krb5kdc on
KDC測(cè)試主從
16.搭建客戶端
$ sudo yum install krb5-workstation krb5-libs krb5-auth-dialog
17.更新客戶端/etc/krb5.conf文件
- 從第三臺(tái)服務(wù)器,使用kinit 獲取ticket拳话,正常情況下會(huì)從master上獲取先匪。
- 關(guān)閉master上的kdc服務(wù)(sudo service krb5kdc stop)。
- 再次從第三臺(tái)服務(wù)器上弃衍,使用kinit 獲取ticket呀非,如果成功,說(shuō)明生效镜盯“度梗可以觀察kdc的日志,在/var/log/krb5kdc.log
Kadmin切換:
先決條件
- KDC配置為能夠用作主KDC或從KDC
如果主KDC仍在運(yùn)行速缆,在老的主KDC執(zhí)行以下操作:
- 殺死kadmind進(jìn)程(
ps -ef | grep kadmin | grep -v grep | awk '{print $2}' | xargs kill
)降允。 - 禁用同步數(shù)據(jù)庫(kù)的crontab作業(yè)。
- 手動(dòng)運(yùn)行數(shù)據(jù)庫(kù)同步腳本艺糜,以確保從kdc都具有數(shù)據(jù)庫(kù)的最新副本剧董。
- 注:必須手動(dòng)同步數(shù)據(jù)庫(kù)至從kdc,否則可能存在數(shù)據(jù)丟失(kerberos認(rèn)證時(shí)是按照/etc/krb5.conf中主機(jī)順序訪問(wèn)kdc服務(wù)器破停,kdc認(rèn)證只會(huì)讀取本地?cái)?shù)據(jù)庫(kù))翅楼。
在從KDC上執(zhí)行
- 刪除/var/kerberos/krb5kdc/kpropd.acl。
- 啟動(dòng)kadmind守護(hù)進(jìn)程(
sudo service kadmin start
)真慢。 - 設(shè)置cron作業(yè)以傳播數(shù)據(jù)庫(kù)(將數(shù)據(jù)庫(kù)同步到每個(gè)從站KDC毅臊,需確保從KDC已啟動(dòng)kpropd進(jìn)程,以及存在/var/kerberos/krb5kdc/kpropd.acl文件)黑界。
- 在Kerberos領(lǐng)域的每臺(tái)客戶端機(jī)器上更改krb5.conf文件中admin_server值管嬉。
在客戶端主機(jī)上:
- 確保krb5.conf文件中admin_server值正確。
- 登錄kadmin(
kadmin -p admin/admin
) - 驗(yàn)證kadmin功能是否正常园爷。
使用方法:
管理員用戶:
- 官方文檔: http://web.mit.edu/kerberos/krb5-devel/doc/admin/index.html
- 無(wú)密碼登陸([1]需要在master kdc主機(jī), [2]需要root權(quán)限):
sudo kadmin.local
- 密碼認(rèn)證登陸:
kadmin -p admin/admin
常用管理命令:
add_principal, addprinc, ank - 添加用戶
例: ank dengsc@HADOOP.COM
delete_principal, delprinc - 刪除用戶
例: delprinc dengsc@HADOOP.COM
change_password, cpw - 修改用戶密碼
例: cpw dengsc@HADOOP.COM
list_principals, listprincs, get_principals, getprincs - 查看所有用戶
例: listprincs
modify_principal, modprinc - 修改票據(jù)屬性
例: modprinc -maxrenewlife 1week dengsc@HADOOP.COM(修改票據(jù)可在一周內(nèi)renew)
get_principal, getprinc - 查看票據(jù)信息
例: getprinc dengsc@HADOOP.COM
ktadd, xst - 導(dǎo)出keytab文件
例: xst -e aes128-cts-hmac-sha1-96:normal -k /home/dengsc/dengsc.keytab dengsc@HADOOP.COM
-e 執(zhí)定加密方式
-k 指定keytab文件名
注:導(dǎo)出keytab文件時(shí)會(huì)重新生成密碼.
kadmin.local模式下可添加參數(shù)‘-norandkey’,導(dǎo)出keytab文件時(shí)不重置密碼.
egg: xst -norandkey -k /home/dengsc/dengsc.keytab
? - help
普通用戶:
常用命令:
kinit -kt dengsc.keytab dengsc@HADOOP.COM - 通過(guò)keytab文件認(rèn)證,獲取用戶princpal
klist -e - 查看當(dāng)前生效票據(jù)
-e 顯示加密方式
如果expired值與renew until值相同,則表示該principal的ticket 不是 renwable宠蚂。
kpasswd <username> - 修改密碼
kinit -R - 刷新票據(jù)
問(wèn)題:
描述:RHEL 6.x主機(jī)執(zhí)行kinit -kt命令報(bào)如下錯(cuò)誤
[caijt@nfjd-jpush-portal-test01-248226 ~]$ kinit -kt caijt.keytab caijt
kinit: Bad encryption type while getting initial credentials
原因:
KDC服務(wù)器正在RHEL 7.x主機(jī)上運(yùn)行式撼,??RHEL 6.x該主機(jī)對(duì)keytab文件中的加密類型有不同的識(shí)別童社。
如<----行所示,兩種加密類型在RHEL 6.x和7.x系統(tǒng)中都有不同的名稱著隆。這使得KDC服務(wù)器在RHEL 6.x主機(jī)的kinit請(qǐng)求中無(wú)法識(shí)別這兩種加密類型.
RHEL 6x
[caijt@nfjd-jpush-portal-test01-248226 ~]$ klist -e -kt caijt.keytab
Keytab name: FILE:caijt.keytab
KVNO Timestamp Principal
---- ----------------- --------------------------------------------------------
3 07/06/17 16:48:20 caijt@HADOOP.COM (aes128-cts-hmac-sha1-96)
3 07/06/17 16:48:20 caijt@HADOOP.COM (des3-cbc-sha1)
3 07/06/17 16:48:20 caijt@HADOOP.COM (arcfour-hmac)
3 07/06/17 16:48:20 caijt@HADOOP.COM (etype 26) <----
3 07/06/17 16:48:20 caijt@HADOOP.COM (etype 25) <----
3 07/06/17 16:48:20 caijt@HADOOP.COM (des-hmac-sha1)
3 07/06/17 16:48:20 caijt@HADOOP.COM (des-cbc-md5)
RHEL 7x
[dengsc@nfjd-hadoop-test01 bash_script]$ klist -e -kt caijt.keytab
Keytab name: FILE:caijt.keytab
KVNO Timestamp Principal
---- ------------------- ------------------------------------------------------
5 07/06/2017 16:54:15 caijt@HADOOP.COM (aes128-cts-hmac-sha1-96)
5 07/06/2017 16:54:15 caijt@HADOOP.COM (des3-cbc-sha1)
5 07/06/2017 16:54:15 caijt@HADOOP.COM (arcfour-hmac)
5 07/06/2017 16:54:15 caijt@HADOOP.COM (camellia256-cts-cmac) <----
5 07/06/2017 16:54:15 caijt@HADOOP.COM (camellia128-cts-cmac) <----
5 07/06/2017 16:54:15 caijt@HADOOP.COM (des-hmac-sha1)
5 07/06/2017 16:54:15 caijt@HADOOP.COM (des-cbc-md5)
解決方案:
導(dǎo)出密碼時(shí)指定加密類型扰楼,跳過(guò)有差異的加密方法: xst -e "aes128-cts-hmac-sha1-96:normal" -k caijt.keytab caijt
[caijt@nfjd-jpush-portal-test01-248226 ~]$ klist -ekt caijt.keytab
Keytab name: FILE:caijt.keytab
KVNO Timestamp Principal
---- ----------------- --------------------------------------------------------
6 07/06/17 17:13:41 caijt@HADOOP.COM (aes128-cts-hmac-sha1-96)
參考:https://discuss.pivotal.io/hc/en-us/articles/214259328-kinit-on-RHEL-6-x-fails-with-keytab-file-generated-on-RHEL-7-x