Kafka 认证:Kerberos 认证中心部署手册

1,459 阅读3分钟

背景

Kafka 支持 Kerberos的前提是部署 Kerberos 服务端,然后在 Kafka 所在的主机安装 Kerberos 客户端。

Kerberos 是神话中具有三个头的保卫神犬,在没有部署 Kerberos 认证中心之前,曾看来两天这个协议的理论,但是很快就忘记了。

本周为了测试 Kafka 的 Kerberos 认证,玩了一下 Kerberos 认证中心的部署,看着 kdc 的日志文件,操作几遍 kadmin.local 命令后,突然就理解了 Kerberos 认证流程了。

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

关键配置:

  1. default_ccache_name 这一项注释掉,不明原因。
  2. default_realm 设置默认的 Realm,多 Realm 时不知道怎么配置。
  3. realms 配置,kdc 和 admin_server 后面的值是 /etc/hosts 中的目标主机 IP 的主机名称。
  4. 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 服务端包含两个服务 krb5kdckadmin ,服务端必须启动这两个服务。

systemctl enable kadmin
systemctl enable krb5kdc
systemctl start kadmin
systemctl start krb5kdc

启动成功后,可以用管理员帐号登录: 在这里插入图片描述

Kerberos 客户端安装

客户端安装 yum install krb5-libs krb5-workstation,这是客户端的软件,然后 krb5.conf 文件从 Kerberos 服务端拷贝一份即可。

我们在 Kafka 服务器上安装 Kerberos 客户端,就可以为 Kafka 添加 Kerberos 认证了。

KDC 数据库操作命令

(一)基础操作,数据库初始化命令:/usr/sbin/kdb5_util create -s

(二)数据库创建后,使用本地登录 kadmin.local 后,可以执行下列操作:

  1. 注册帐号:addprinc username/hostname
  2. 修改帐号:modprinc -maxrenewlife 90day username/hostname@Realm,时间参数 90 day 可按需调整。
  3. 删除帐号:delprinc username/hostname@Realm
  4. 查看帐号列表: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 认证中心。

参考文献

  1. 《由浅入深理解Kerberos协议》
  2. 《Kerberos 部署参考》 (虽然页面有劫持广告,但是流程还是很完整的。)
  3. 《Kerberos 部署准备工作》
  4. 《Kerberos 协议官方文档》
  5. 《Krb5.conf 官方配置说明》