基于Hadoop集群安全考虑,需要上线kerberos认证,此章将介绍如果搭建一个主从配置(防止单点故障)的KDC环境。
环境信息:
主机信息:
system: centos7
hosts:
kdcsrv01 - master kdc
kdcsrv02 - slave kdc
kdcsrv01 - master kadmin
相关信息介绍:
HADOOP.COM - realm name(域)
/var/kerberos/krb5kdc/.k5.HADOOP.COM - stash file(数据库自动登陆文件)
/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服务器搭建
1.安装KDC服务程序
sudo yum install -y krb5-server openldap-clients krb5-workstation krb5-libs
2.设置配置文件
$ 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
*/[email protected] *
3.生成master kdc database(需记录输入的数据库密码)
$ sudo kdb5_util create -r HADOOP.COM -s
# 将在/var/kerberos/krb5kdc/目录下生成多个principal*文件
# 注:生成random随机数时较耗时,所以此步骤执行时间较长。
4.master 服务器添加admin用户
$ sudo kadmin.local
addprinc admin/[email protected]
5.启动kdc 及 kadmin服务
$ sudo service krb5kdc start
$ sudo service kadmin start
$ sudo chkconfig --level 35 krb5kdc on
$ sudo chkconfig --level 35 kadmin on
6.验证admin账户是否能成功认证
$ 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 启动时需要生成随机数种子导致启动时间较长,执行kadmin命令可能会卡住.
# 以上日志未在kadmin.log中查看kadmin进程启动情况(完成启动耗时12分钟)。
# """
配置slave kdc
7.master服务器生成host keytab文件(需root用户,不能使用普通用户:/etc/目录无权限写入)
$ sudo su - root
$ kadmin.local
addprinc -randkey host/kdcsrv01
ktadd host/kdcsrv01
8.安装slave服务器
$ sudo yum install -y krb5-server openldap-clients krb5-workstation
# 拷贝master /etc/krb5.conf文件: scp kdcsrv01:/etc/krb5.conf /etc/krb5.conf
9.slave 服务器生成host keytab文件(需root用户,不能使用普通用户:/etc/目录无权限写入)
$ sudo su - root
$ kadmin.local
addprinc -randkey host/kdcsrv02
ktadd host/kdcsrv02
10.slave服务器创建kpropd.acl文件
$ sudo touch /var/kerberos/krb5kdc/kpropd.acl
$ sudo vi /var/kerberos/krb5kdc/kpropd.acl
host/[email protected]
host/[email protected]
11.拷贝master配置文件至slave服务器
$ scp /etc/krb5.conf kdcsrv02:/etc/;
$ cd /var/kerberos/krb5kdc;scp kdc.conf kadm5.acl .k5.HADOOP.COM kdcsrv02:/var/kerberos/krb5kdc/;
12.在slave上启动kpropd服务
$ sudo kpropd
13.在master上将相关数据同步到slave上(需定期手动同步)
$ sudo kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
$ sudo kprop -f /var/kerberos/krb5kdc/slave_datatrans kdcsrv02
# 成功后,会出现以下信息:
# Database propagation to kdcsrv02: SUCCEEDED
# 创建crontab 脚本定期同步数据库:
$ 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 主机):30 16 * * * /home/dengsc/kdc/sync_db.sh >> /home/dengsc/kdc/sync.log
14.slave上/var/kerberos/krb5kdc/会多出一些文件
- from_master
- principal
- pricipal.kadm5
- principal.kadmin5.lock
- principal.ok
15.启动slave kdc服务
$ sudo service krb5kdc start
$ sudo chkconfig --level 35 krb5kdc on
KDC测试主从
16.搭建客户端
$ sudo yum install krb5-workstation krb5-libs krb5-auth-dialog
17.更新客户端/etc/krb5.conf文件
- 从第三台服务器,使用kinit 获取ticket,正常情况下会从master上获取。
- 关闭master上的kdc服务(sudo service krb5kdc stop)。
- 再次从第三台服务器上,使用kinit 获取ticket,如果成功,说明生效。可以观察kdc的日志,在/var/log/krb5kdc.log
Kadmin切换:
先决条件
- KDC配置为能够用作主KDC或从KDC
如果主KDC仍在运行,在老的主KDC执行以下操作:
- 杀死kadmind进程(
ps -ef | grep kadmin | grep -v grep | awk '{print $2}' | xargs kill
)。 - 禁用同步数据库的crontab作业。
- 手动运行数据库同步脚本,以确保从kdc都具有数据库的最新副本。
- 注:必须手动同步数据库至从kdc,否则可能存在数据丢失(kerberos认证时是按照/etc/krb5.conf中主机顺序访问kdc服务器,kdc认证只会读取本地数据库)。
在从KDC上执行
- 删除/var/kerberos/krb5kdc/kpropd.acl。
- 启动kadmind守护进程(
sudo service kadmin start
)。 - 设置cron作业以传播数据库(将数据库同步到每个从站KDC,需确保从KDC已启动kpropd进程,以及存在/var/kerberos/krb5kdc/kpropd.acl文件)。
- 在Kerberos领域的每台客户端机器上更改krb5.conf文件中admin_server值。
在客户端主机上:
- 确保krb5.conf文件中admin_server值正确。
- 登录kadmin(
kadmin -p admin/admin
) - 验证kadmin功能是否正常。
使用方法:
管理员用户:
- 官方文档: http://web.mit.edu/kerberos/krb5-devel/doc/admin/index.html
- 无密码登陆([1]需要在master kdc主机, [2]需要root权限):
sudo kadmin.local
- 密码认证登陆:
kadmin -p admin/admin
常用管理命令:
add_principal, addprinc, ank - 添加用户
例: ank [email protected]
delete_principal, delprinc - 删除用户
例: delprinc [email protected]
change_password, cpw - 修改用户密码
例: cpw [email protected]
list_principals, listprincs, get_principals, getprincs - 查看所有用户
例: listprincs
modify_principal, modprinc - 修改票据属性
例: modprinc -maxrenewlife 1week [email protected](修改票据可在一周内renew)
get_principal, getprinc - 查看票据信息
例: getprinc [email protected]
ktadd, xst - 导出keytab文件
例: xst -e aes128-cts-hmac-sha1-96:normal -k /home/dengsc/dengsc.keytab [email protected]
-e 执定加密方式
-k 指定keytab文件名
注:导出keytab文件时会重新生成密码.
kadmin.local模式下可添加参数‘-norandkey’,导出keytab文件时不重置密码.
egg: xst -norandkey -k /home/dengsc/dengsc.keytab
? - help
普通用户:
- 官方文档: http://web.mit.edu/kerberos/krb5-devel/doc/user/index.html
常用命令:
kinit -kt dengsc.keytab [email protected] - 通过keytab文件认证,获取用户princpal
klist -e - 查看当前生效票据
-e 显示加密方式
如果expired值与renew until值相同,则表示该principal的ticket 不是 renwable。
kpasswd - 修改密码
kinit -R - 刷新票据
问题:
描述:RHEL 6.x主机执行kinit -kt命令报如下错误
[caijt@nfjd-jpush-portal-test01-248226 ~]$ kinit -kt caijt.keytab caijt
kinit: Bad encryption type while getting initial credentials
原因:
KDC服务器正在RHEL 7.x主机上运行,RHEL 6.x该主机对keytab文件中的加密类型有不同的识别。
如<----行所示,两种加密类型在RHEL 6.x和7.x系统中都有不同的名称。这使得KDC服务器在RHEL 6.x主机的kinit请求中无法识别这两种加密类型.
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 [email protected] (aes128-cts-hmac-sha1-96)
3 07/06/17 16:48:20 [email protected] (des3-cbc-sha1)
3 07/06/17 16:48:20 [email protected] (arcfour-hmac)
3 07/06/17 16:48:20 [email protected] (etype 26) <----
3 07/06/17 16:48:20 [email protected] (etype 25) <----
3 07/06/17 16:48:20 [email protected] (des-hmac-sha1)
3 07/06/17 16:48:20 [email protected] (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 [email protected] (aes128-cts-hmac-sha1-96)
5 07/06/2017 16:54:15 [email protected] (des3-cbc-sha1)
5 07/06/2017 16:54:15 [email protected] (arcfour-hmac)
5 07/06/2017 16:54:15 [email protected] (camellia256-cts-cmac) <----
5 07/06/2017 16:54:15 [email protected] (camellia128-cts-cmac) <----
5 07/06/2017 16:54:15 [email protected] (des-hmac-sha1)
5 07/06/2017 16:54:15 [email protected] (des-cbc-md5)
解决方案:
导出密码时指定加密类型,跳过有差异的加密方法: 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 [email protected] (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