Kerberos service in high-availability environment, the method of data full synchronization and incremental synchronization.
1 前言
Kerberos服务将域信息(Realm)、身份信息(Principals)、身份密码、策略和其它信息存储在KDC(英文名:Key Distribution Center,中文名:密钥分发中心)数据库,由KADMIN程序(Kerberos database administration)管理(增加、删除、修改)。KDC和KADMIN可以单独部署或一起部署在同一个服务器。
为了安全和服务不间断,通常把kerberos服务以高可用方式部署,分为主节点(Master)和备用节点(Slave),主节点对外提供管理服务(增加、删除、修改)和KDC服务,备用节点从主节点同步数据,对外提供KDC服务;当然为了更安全,也会在备用节点部署管理服务(但不推荐,原因见后面说明),在紧急情况时使用。
主备节点数据同步在 1.13 以前的版本只有全量同步,1.13 及以后的版本可用使用全量同步和增量同步。本文使用环境:
项目 | 内容 |
---|---|
kerberos版本 | 1.14.1 |
主节点主机名 | lx-sywu |
备用节点主机名 | lx-sywu01 |
2 安装kerberos服务
主备节点都需要安装kerberos服务;
yum install -y krb5-server krb5-libs krb5-workstation
krb5-libs.x86_64 1.14.1-27.el7_3 @centos7
krb5-server.x86_64 1.14.1-27.el7_3 @centos7
krb5-workstation.x86_64 1.14.1-27.el7_3 @centos7
主节点创建数据库;
[root@lx-sywu krb5kdc]# kdb5_util create -r sywu.com -s
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'sywu.com',
master key name 'K/M@sywu.com'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key:
Re-enter KDC database master key to verify:
[root@lx-sywu krb5kdc]# ll /var/kerberos/krb5kdc
total 24
-rw-------. 1 root root 22 Jan 8 2022 kadm5.acl
-rw-------. 1 root root 451 Jan 14 2022 kdc.conf
-rw-------. 1 root root 8192 Jul 15 13:53 principal
-rw-------. 1 root root 8192 Jul 15 13:53 principal.kadm5
-rw-------. 1 root root 0 Jul 15 13:53 principal.kadm5.lock
-rw-------. 1 root root 0 Jul 15 13:53 principal.ok
修改配置文件;
[root@lx-sywu ~]# vi /etc/krb5.conf
[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 = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
default_realm = sywu.com
default_ccache_name = FILE:/tmp/krb5cc_%{uid}
[realms]
sywu.com = {
admin_server = lx-sywu
kdc = lx-sywu
}
[root@lx-sywu ~]# vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
sywu.com = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal 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
}
启动管理服务和KDC服务;
service kadmin start
service krb5kdc start
这样kerberos服务就在主节点部署好了。
3 全量同步
每次都生成一个全量数据,同步到备用节点;对于数据库较大的环境,同步会比较耗时。
3.1 主节点配置
修改/etc/krb5.conf文件,将备用节点配置加入;
[root@lx-sywu ~]# vi /etc/krb5.conf
[realms]
sywu.com = {
admin_server = lx-sywu
kdc = lx-sywu
kdc = lx-sywu01
}
添加主备同步服务账号;
[root@lx-sywu ~]# kadmin.local
addprinc -randkey -kvno 1 host/lx-sywu01
addprinc -randkey -kvno 1 host/lx-sywu
addprinc -randkey -kvno 1 kiprop/lx-sywu01
addprinc -randkey -kvno 1 kiprop/lx-sywu
将主备同步服务账号生成keytab文件,默认文件:/etc/krb5.keytab;
[root@lx-sywu ~]# kadmin.local
ktadd -norandkey host/lx-sywu01
ktadd -norandkey host/lx-sywu
ktadd -norandkey kiprop/lx-sywu01
ktadd -norandkey kiprop/lx-sywu
将主节点以下文件同步到备用节点相同目录下;
/var/kerberos/krb5kdc/kadm5.acl
/var/kerberos/krb5kdc/kdc.conf
/var/kerberos/krb5kdc/.k5.sywu.com
/etc/krb5.keytab
/etc/krb5.conf
3.2 备用节点配置
将主节点同步过来的配置文件放到相同目录下,创建 kprop 服务权限文件,该权限文件默认放在/var/kerberos/krb5kdc目录下,但这样会导致管理服务(kadmin)认为这个节点是备用节点不能启动该服务,所以如果有备用节点启动kadmin服务的需求,建议kprop配置放在别的地方,我放到 /etc/krb5.conf.d 目录,配置允许主备节点可以使用同步权限;
[root@lx-sywu01 ~]# vi /etc/krb5.conf.d/kpropd.acl
host/lx-sywu
host/lx-sywu01
启动kprop同步服务;
[root@lx-sywu01 ~]# /usr/sbin/kpropd -a /etc/krb5.conf.d/kpropd.acl
Jul 14 22:40:11 lx-sywu01 systemd[1]: Starting Kerberos 5 Propagation...
Jul 14 22:40:11 lx-sywu01 systemd[1]: Started Kerberos 5 Propagation.
3.3 同步验证
添加测试用户(主节点操作)
[root@lx-sywu ~]# kadmin.local
addprinc -randkey -kvno 1 test001
执行同步(主节点操作)
[root@lx-sywu ~]# kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
[root@lx-sywu ~]# kprop -f /var/kerberos/krb5kdc/slave_datatrans -d -P 754 lx-sywu01
32768 bytes sent.
65536 bytes sent.
72180 bytes sent.
Database propagation to lx-sywu01: SUCCEEDED
同步确认(备用节点操作)
Jul 14 22:40:11 lx-sywu01 systemd[1]: Starting Kerberos 5 Propagation...
Jul 14 22:40:11 lx-sywu01 systemd[1]: Started Kerberos 5 Propagation.
Jul 14 22:40:55 lx-sywu01 kpropd[25603]: Connection from lx-sywu
[root@lx-sywu01 ~]# kadmin.local
kadmin.local: list_principals test001
test001@sywu.com
备用节点生成文件(from_master、principal)
[root@lx-sywu01 ~]# ll -lah /var/kerberos/krb5kdc
drwxr-xr-x. 2 root root 187 7月 14 23:23 .
drwxr-xr-x. 3 root root 21 7月 13 16:11 ..
-rw-------. 1 root root 66K 7月 14 23:23 from_master
-rw-------. 1 root root 72 7月 13 16:11 .k5.sywu.com
-rw-r--r--. 1 root root 71 7月 14 23:34 kadm5.acl
-rw-r--r--. 1 root root 530 7月 14 23:34 kdc.conf
-rw-------. 1 root root 60K 7月 15 14:49 principal
启动管理服务和KDC服务(备用节点操作)
service kadmin start
service krb5kdc start
最后编写同步脚本(主节点操作)
[root@lx-sywu ~]# vi kerberos_sync_to_slave
kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
kprop -f /var/kerberos/krb5kdc/slave_datatrans -d -P 754 lx-sywu01
用crontab定时触发同步(主节点操作)
*/2 * * * * sh kerberos_sync_to_slave
4 增量同步
增量同步 1.13 及以后的版本才可以使用,由于都是通过kprop同步服务实现,使用增量同步就不能使用全量同步,执行上面的全量同步功能会异常。
修改kdc.conf配置文件,启用iprop配置(主备节点都操作)
[root@lx-sywu krb5kdc]# vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
sywu.com = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal 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
iprop_enable = true
iprop_master_ulogsize = 2000
iprop_slave_poll = 2m
iprop_port = 760
iprop_resync_timeout = 600
}
iprop_slave_poll表示同步间隔时间,其它参数见参考资料链接。
重启 kadmin服务和kdc服务(主节点操作)
service kadmin restart
service krb5kdc restart
重启 kadmin服务、kdc服务、和kprop服务(备用节点操作)
service kadmin restart
service krb5kdc restart
sudo service kprop restop
首次启动kprop服务会自动进行全量同步;
Jul 14 23:18:33 lx-sywu01 systemd[1]: Starting Kerberos 5 Propagation...
Jul 14 23:18:33 lx-sywu01 systemd[1]: Started Kerberos 5 Propagation.
Jul 14 23:18:33 lx-sywu01 kpropd[13963]: kpropd: Full resync needed.
Jul 14 23:18:33 lx-sywu01 kpropd[13963]: Full resync request granted.
Jul 14 23:18:33 lx-sywu01 kpropd[13991]: Connection from lx-sywu
在主备节点都生成同步文件(principal.ulog),主节点kadmin服务在用户管理(增加、修改、删除)操作时会更新该文件,备用节点按照设定时间定时同步,可以在kpropd服务日志种查看到同步信息;
Jul 14 23:39:06 lx-sywu01 kpropd[24688]: Incremental updates: 1 updates / 13254 us
7月 15 14:49:07 lx-sywu01 kpropd[24688]: Incremental updates: 1 updates / 3624 us
也可以通过kproplog查看到同步信息。
[root@lx-sywu01 ~]# /usr/sbin/kproplog -h
Kerberos update log (/var/kerberos/krb5kdc/principal.ulog)
Update log dump :
Log version # : 1
Log state : Stable
Entry block size : 2048
Number of entries : 4
First serial # : 4
Last serial # : 7
First time stamp : Fri Jul 14 21:41:53 2023
Last time stamp : Sat Jul 15 14:48:41 2023
5 最后的验证
在客户端或者主备节点,分别注释主备节点kdc,测试认证正常;
[root@lx-sywu ~]# vi /etc/krb5.conf
[realms]
sywu.com = {
admin_server = lx-sywu
# kdc = lx-sywu
kdc = lx-sywu01
}
[root@lx-sywu ~]# kinit test-sywu
Password for test-sywu@sywu.com:
[root@lx-sywu ~]# klist
Ticket cache: FILE:/tmp/krb5cc_1555
Default principal: test-sywu@sywu.com
Valid starting Expires Service principal
2023-07-14T22:46:37 2023-07-15T22:46:37 krbtgt/sywu.com@sywu.com
6 遗留问题
上面也提到了如果备用节点 kprop服务权限文件(kpropd.acl)出现在默认数据库目录下时会导致kadmin服务无法启动报错;
Jul 14 14:45:27 lx-sywu01 systemd[1]: Starting Kerberos 5 Password-changing and Administration...
Jul 14 14:45:27 lx-sywu01 _kadmind[12053]: Error. This appears to be a slave server, found kpropd.acl
Jul 14 14:45:27 lx-sywu01 systemd[1]: kadmin.service: control process exited, code=exited status=6
这是因为kerberos的主备高可用主要是针对kdc服务,没有针对管理服务的高可用,如果主备都开启了管理服务,就会存在有客户端连接主节点的管理服务操作,其它客户端可能连接备用节点的管理服务操作,这时主节点的操作可以正常同步到备用节点,但备用节点的操作不能反向同步到主节点,备用节点的管理数据丢失、主备不一致了,所以备用节点启用管理服务要慎重,至少要能做到记录操作的内容,主节点恢复后将操作内容重新执行。
7 总结
1.13 版本以前只能使用全量同步方式实现kerberos高可用,仅推荐在数据库较小和增量较小的环境中使用;增量同步是 1.13 版本新加入的功能,可以在1.13版本及以后的版本使用,比较适用于数据库大和增量大的环境,也建议优先使用该方案。不推荐备用节点启用管理服务,启用该服务要综合考量。
8 参考资料
https://k5wiki.kerberos.org/wiki/Projects/Hierarchical_iprop - Projects/Hierarchical iprop
http://web.mit.edu/kerberos/krb5-latest/doc/admin/conf_files/kdc_conf.html#kdc-conf-5 - kdc-conf-5