Kafka 支持 Kerberos的前提是部署 Kerberos 服务端,然后在 Kafka 所在的主机安装 Kerberos 客户端。
Kerberos 是神话中具有三个头的保卫神犬,在没有部署 Kerberos 认证中心之前,曾看来两天这个协议的理论,但是很快就忘记了。
本周为了测试 Kafka 的 Kerberos 认证,玩了一下 Kerberos 认证中心的部署,看着 kdc 的日志文件,操作几遍 kadmin.local 命令后,突然就理解了 Kerberos 认证流程了。
第一步,安装 KDC 所需的软件 krb5-server 和 krb5-workstation 。
yum install krb5-libs krb5-server krb5-workstation
第二步,修改 Kerberos 配置文件 /etc/krb5.conf 。Kerberos 官方文档第一章就告诉我们需要先确定好我们的 Kerberos 服务需要配置的东西:

服务 Realm、服务 Realm 对应的主机名、KDC 和 kadmin 服务域名。
添加一个我们测试的 Realm 名称为 MY_KDC.COM :
[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 = MY_KDC.COM
# default_ccache_name = KEYRING:persistent:%{uid}
[realms]
MY_KDC.COM = {
kdc = oracle
admin_server = oracle
}
[domain_realm]
.oracle = MY_KDC.COM
oracle = MY_KDC.COM
关键配置:
default_ccache_name 这一项注释掉,不明原因。default_realm 设置默认的 Realm,多 Realm 时不知道怎么配置。realms 配置,kdc 和 admin_server 后面的值是 /etc/hosts 中的目标主机 IP 的主机名称。domain_realm 是固定语法,即请求目标主机 oracle 的 Realm 值,这个配置令人费解,这里指定主机对应的 Realm,而前面又是 Realm 对应的主机。难道不会出现死循环吗?第三步,设置本机主机名 oracle 。 因为 Krb5.conf 中 Realm 中的 kdc 和 admin_server 的值是一个域名,这里设置为当前 Kerberos 服务器主机的域名。

第四步,修改 kdc 配置文件 /var/kerveros/krb5kdc/kdc.conf 文件 ,其中的 Realm 与上一步 krb5.conf 一致。
第五步,为我们的 Realm 创建 Kerberos 数据库。
kdb5_util create -r MY_KDC.COM -s
第五步,创建管理员并设置密码。
kadmin.local -q "addprinc admin/admin"
第六步,给数据库管理员添加ACL权限。 * 代表全部权限。
vi /var/kerberos/krb5kdc/kadm5.acl
添加我们的 Realm 的权限:* /admin@MY_KDC.COM *
到这里,Kerberos 服务端就部署完成了。
Kerberos 服务端包含两个服务 krb5kdc 和 kadmin ,服务端必须启动这两个服务。
systemctl enable kadmin
systemctl enable krb5kdc
systemctl start kadmin
systemctl start krb5kdc
启动成功后,可以用管理员帐号登录:

客户端安装 yum install krb5-libs krb5-workstation,这是客户端的软件,然后 krb5.conf 文件从 Kerberos 服务端拷贝一份即可。
我们在 Kafka 服务器上安装 Kerberos 客户端,就可以为 Kafka 添加 Kerberos 认证了。
(一)基础操作,数据库初始化命令:/usr/sbin/kdb5_util create -s。
(二)数据库创建后,使用本地登录 kadmin.local 后,可以执行下列操作:
addprinc username/hostnamemodprinc -maxrenewlife 90day username/hostname@Realm,时间参数 90 day 可按需调整。delprinc username/hostname@Realm。list_principals。(三)命令行方式,生成 keytab 文件:kadmin.local -q "xst -norandkey -k /root/kafka-client.keytab username/host@Realm"
感觉这几个命令就够用了,部署 Kafka Kerberos 认证时,就用了增、删、查、导出 keytab 文件这几个命令。
网上没找到多 Realm 实践的案例,就我自己测试的来看,在 Kerberos 客户端配置多个 realms 后,默认只会走 deault_realm 这一个 Realm ,认证流程错乱了。
理论上 Kerberos 肯定是支持多 Realm 的,我们的需求是一个主机需要连接不同的 Kafka 集群,它们可能归属不同的 KDC 认证中心。