Kafka 认证三:Kerberos 认证中心部署

Posted 毕小宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kafka 认证三:Kerberos 认证中心部署相关的知识,希望对你有一定的参考价值。

背景

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 官方配置说明》

以上是关于Kafka 认证三:Kerberos 认证中心部署的主要内容,如果未能解决你的问题,请参考以下文章

Kafka 认证三:添加 Kerberos 认证详细流程

Kafka 认证三:添加 Kerberos 认证详细流程

Kafka 认证三:添加 Kerberos 认证详细流程

Kafka Kerberos 安全认证

kafka kerberos 认证访问与非认证访问共存下的ACL问题

FlinkFlink跨集群访问开启Kerberos认证的Kafka