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 官方配置说明》
相关推荐
追逐时光者1 小时前
免费、简单、直观的数据库设计工具和 SQL 生成器
后端·mysql
初晴~2 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581362 小时前
InnoDB 的页分裂和页合并
数据库·后端
小_太_阳2 小时前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾2 小时前
scala借阅图书保存记录(三)
开发语言·后端·scala
星就前端叭3 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
漫无目的行走的月亮3 小时前
Ubuntu下C语言操作kafka示例
kafka·librdkafka
小林coding4 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
AI理性派思考者4 小时前
【保姆教程】手把手教你在Linux系统搭建早期alpha项目cysic的验证者&证明者
后端·github·gpu