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 官方配置说明》
相关推荐
一个儒雅随和的男子18 分钟前
kafka消息中间件的rebalance机制
分布式·kafka
谦行29 分钟前
前端视角 Java Web 入门手册 4.4:Web 开发基础—— Listener
java·后端
小技工丨1 小时前
Flink SQL 读取 Kafka 数据到 Mysql 实战
sql·flink·kafka
非优秀程序员1 小时前
使用Python给自己网站生成llms.txt
人工智能·后端·架构
尘鹄1 小时前
一文讲懂Go语言如何使用配置文件连接数据库
开发语言·数据库·后端·golang
benben0441 小时前
Django小白级开发入门
后端·python·django
qw9492 小时前
SpringBoot3—场景整合:环境准备
java·后端
孟and平4 小时前
Flask 打包为exe 文件
后端·python·flask
大只因bug6 小时前
基于Django的协同过滤算法养老新闻推荐系统的设计与实现
后端·python·django·协同过滤算法推荐系统·新闻推荐网站系统·养老新闻推荐系统·个性化新闻推荐网站系统
_TokaiTeio10 小时前
JVM面试题100
java·开发语言·jvm·后端·虚拟机