Kerberos KDC主从搭建

基于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

你可能感兴趣的:(Kerberos KDC主从搭建)