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

背景

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

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

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

Kerberos 服务端部署

第一步,安装 KDC 所需的软件 krb5-server 和 krb5-workstation 。

typescript 复制代码
yum install krb5-libs krb5-server krb5-workstation

第二步,修改 Kerberos 配置文件 /etc/krb5.conf 。Kerberos 官方文档第一章就告诉我们需要先确定好我们的 Kerberos 服务需要配置的东西:

服务 Realm、服务 Realm 对应的主机名、KDC 和 kadmin 服务域名。

添加一个我们测试的 Realm 名称为 MY_KDC.COM

typescript 复制代码
[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 数据库

typescript 复制代码
kdb5_util create -r MY_KDC.COM -s

第五步,创建管理员并设置密码。

typescript 复制代码
kadmin.local -q "addprinc admin/admin"

第六步,给数据库管理员添加ACL权限。 * 代表全部权限。

typescript 复制代码
vi /var/kerberos/krb5kdc/kadm5.acl
添加我们的 Realm 的权限:* /admin@MY_KDC.COM	*

到这里,Kerberos 服务端就部署完成了。

添加开机服务

Kerberos 服务端包含两个服务 krb5kdckadmin ,服务端必须启动这两个服务。

typescript 复制代码
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 官方配置说明》
相关推荐
晴子呀9 分钟前
Spring底层原理大致脉络
java·后端·spring
andrew_121931 分钟前
腾讯 IEG 游戏前沿技术 二面复盘
后端·sql·面试
Lill_bin41 分钟前
JVM内部结构解析
jvm·后端·spring cloud·微服务·云原生·ribbon
evanYang_1 小时前
Spring Boot配置文件敏感信息加密
spring boot·后端·oracle
huisheng_qaq1 小时前
【kafka-03】springboot整合kafka以及核心参数详解
spring boot·kafka·消息队列·topic·partition·kafka底层原理
晚枫20002 小时前
kafka发送事件的几种方式
spring boot·分布式·docker·容器·kafka·intellij-idea·linq
customer082 小时前
【开源免费】基于SpringBoot+Vue.JS网上超市系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
小王是个弟弟2 小时前
ClickHouse-Kafka Engine 正确的使用方式
clickhouse·kafka
happycao1232 小时前
kafka 一步步探究消费者组与分区分配策略
中间件·kafka
qianer0_02 小时前
php实现kafka
kafka·php·linq