Kerberos服务高可用环境数据全量同步和增量同步

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值