【Kafka】docker 中配置带 Kerberos 认证的 Kafka 环境(全过程)_docker搭建带用户认证的kafka
1. 准备 docker
-
下载镜像
docker pull centos/systemd
,该镜像是基于 centos7 增加了 systemd 的功能,可以更方便启动后台服务 -
启动镜像
-
使用 systemd 功能需要权限,如果是模拟 gitlab services 就不要使用 systemd 的方式启动
-
如果不使用 systemd 功能
docker run -itd --name kafka_kerberos -p 9092:9092 centos/systemd
-
如果使用 systemd 功能
docker run -itd --name kafka_kerberos -p 9092:9092 --privileged=true centos/systemd /usr/sbin/init
-
-
根据需求清空 /etc/resolv.conf,内网环境中自动添加的 8.8.8.8 会影响网络
-
启动 sshd
/usr/sbin/sshd -D &
2. 配置 kerberos
服务端
-
安装服务端
yum install krb5-server
-
配置 /etc/hosts
- 根据需要配置,配置下面 /etc/krb5.conf 文件中 TEST.COM 里的域名对应的 IP
-
配置 /etc/krb5.conf
-
对下面的行进行修改,其它行不变
default_realm = TEST.COMdefault_ccache_name = /tmp/krb5cc_%{uid}dns_lookup_realm = falsedns_lookup_kdc = falserdns = false# 这行注释掉# renew_lifetime=...[realms]TEST.COM = { kdc = kafka_kerberos admin_server = kafka_kerberos}[domain_realm].test.com = TEST.COMtest.com = TEST.COM
-
-
配置 /var/kerberos/krb5kdc/kdc.conf,将
EXAMPLE.COM
修改为TEST.COM
-
配置 /var/kerberos/krb5kdc/kadm5.acl,配置对 Kerberos 数据库的访问权限的,我只将
EXAMPLE.COM
改为了TEST.COM
,有权限需要可以找资料学习配置 -
初始化 Kerberos 数据库
-
kdb5_util create -s -r TEST.COM
-
键入密码,个人输入 kerberos,记录在此,以免忘记
-
-
启动 kerberos 服务
-
不使用 systemd 启动 (不带 systemd 的 docker 镜像需要用这种方式启动)
/usr/sbin/krb5kdc -P /var/run/krb5kdc.pid -r TEST.COM/usr/sbin/kadmind -P /var/run/kadmind.pid -r TEST.COM
-
使用 systemd 启动
systemctl start krb5kdcsystemctl start kadmin
-
-
kerberos 服务端使用 kadmin.local 进行管理,创建 root 的 principal (默认是 {当前用户}/admin@TEST.COM)
kadmin.local -q \"add_principal root/admin@TEST.COM\"
- 输入密码,个人输入密码 root,记录在此,以免忘记
客户端
-
安装客户端
yum install krb5-workstation
-
配置 /etc/krb5,将服务端的文件拷贝覆盖
-
在客户端使用 kadmin 管理
-
认证用户
kinit root/admin@TEST.COM
-
查看当前认证的用户
klist
-
清空当前认证缓存
kdestroy
3. 配置 kafka 环境
在 kafka 官网下载一个可用版本
在服务端生成认证所需的密钥
# 创建 principalkadmin.local -q \"add_principal -randkey zookeeper/kafka_kerberos@TEST.COM\"kadmin.local -q \"add_principal -randkey kafka/kafka_kerberos@TEST.COM\"kadmin.local -q \"add_principal -randkey kafka-client@TEST.COM\"# 生成密钥前必须要建立密钥放置的目录mkdir /root/keytabs# 生成密钥文件kadmin.local -q \"xst -k /root/keytabs/zookeeper-server.keytab zookeeper/kafka_kerberos@TEST.COM\"kadmin.local -q \"xst -k /root/keytabs/kafka-server.keytab kafka/kafka_kerberos@TEST.COM\"kadmin.local -q \"xst -k /root/keytabs/kafka-client.keytab kafka-client@TEST.COM\"# 测试是否能够认证成功kinit -kt /root/keytabs/zookeeper-server.keytab zookeeper/kafka_kerberos@TEST.COMklist
配置 java 环境
# 安装JDK安装包(先查,再下载development环境的)yum install openjdk-devel# 配置JAVA的真实位置which java # 找到java位置ls -lr /usr/bin/java # 找到java链接的文件(上面执行的结果)ls -lrt /etc/alternatives/java # 找到链接文件的真实地址(上面执行的结果)# 配置JAVA_HOME (上面执行的结果,截取到系统版本号)export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64export CLASSPATH=$JAVA_HOME/lib:$CLASSPATHexport PATH=$JAVA_HOME/bin:$PATH
开始配置 kafka 环境
-
配置 zookeeper 相关文件
-
创建 config/kerberos/zookeeper-server-jaas.conf 文件,注意下面内容有两个分号
Server { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true useTicketCache=false keyTab=\"/root/keytabs/zookeeper-server.keytab\" principal=\"zookeeper/kafka_kerberos@TEST.COM\";};
-
拷贝 config/zookeeper.properties 到 config/zookeeper-kerberos.properties,在末尾添加以下内容
# 根据需要配置 dataDirdataDir=/root/kafka_data/zookeeperauthProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProviderjaasLoginRenew=3600000sessionRequireClientSASLAuth=true
-
创建启动脚本 zookeeper_start.sh
export KAFKA_OPTS=\'-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/zookeeper-server-jaas.conf\'./bin/zookeeper-server-start.sh -daemon config/zookeeper-kerberos.properties
-
创建停止脚本 zookeeper_stop.sh
./bin/zookeeper-server-stop.sh config/zookeeper.properties
-
-
配置 kafka 相关文件
-
创建 config/kerberos/kafka-server.jaas.conf 文件,注意下面内容有两个分号
KafkaServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true useTicketCache=false keyTab=\"/root/keytabs/kafka-server.keytab\" principal=\"kafka/kafka_kerberos@TEST.COM\";};Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true useTicketCache=false keyTab=\"/root/keytabs/kafka-server.keytab\" principal=\"kafka/kafka_kerberos@TEST.COM\";};
-
拷贝 config/server.properties 到 config/server-kerberos.properties,在末尾添加以下内容
# 根据需要配置 log.dirslog.dirs=/root/kafka_data/kafka-logs# 这里要将 localhost 改为 principal 中的值,与 zookeeper/kafka_kerberos 对应zookeeper.connect=kafka_kerberos:2181listeners=SASL_PLAINTEXT://0.0.0.0:9092advertised.listeners=SASL_PLAINTEXT://kafka_kerberos:9092security.inter.broker.protocol=SASL_PLAINTEXTsasl.mechanism.inter.broker.protocol=GSSAPIsasl.enabled.mechanisms=GSSAPI# 需要和 principal 相同sasl.kerberos.service.name=kafka
-
创建启动脚本 kafka_start.sh
export KAFKA_OPTS=\'-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf\'./bin/kafka-server-start.sh -daemon config/server-kerberos.properties
-
创建停止脚本 kafka_stop.sh
./bin/kafka-server-stop.sh config/server-kerberos.properties
-
创建 topic_list.sh 脚本
export KAFKA_OPTS=\'-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf\'./bin/kafka-topics.sh --zookeeper kafka_kerberos:2181 --list
-
创建 create_topic.sh 脚本
export KAFKA_OPTS=\'-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf\'./bin/kafka-topics.sh --create --zookeeper kafka_kerberos:2181 --replication-factor 1 --partitions 1 --topic $1
-
创建 delete_topic.sh 脚本
export KAFKA_OPTS=\'-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf\'./bin/kafka-topics.sh --delete --zookeeper kafka_kerberos:2181 --topic $1
-
-
配置 kafka 客户端相关文件
-
创建 config/kerberos/kafka-client-jaas.conf 文件,注意下面内容有两个分号
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true useTicketCache=false keyTab=\"/root/keytabs/kafka-client.keytab\" principal=\"kafka-client@TEST.COM\";};
-
创建 config/client-kerberos.properties 文件
security.protocol=SASL_PLAINTEXTsasl.mechanism=GSSAPIsasl.kerberos.service.name=kafka
-
创建 producer.sh 脚本
export KAFKA_OPTS=\'-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-client-jaas.conf\'./bin/kafka-console-producer.sh --broker-list kafka_kerberos:9092 --topic $1 --producer.config config/client-kerberos.properties
-
创建 consumer.sh 脚本
export KAFKA_OPTS=\'-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-client-jaas.conf\'./bin/kafka-console-consumer.sh --bootstrap-server kafka_kerberos:9092 --topic $1 --from-beginning --consumer.config config/client-kerberos.properties
-
过程中报错处理
-
报错 Server not found in Kerberos database
-
查看 /var/log/krb5kdc.log 中报错,找不到 zookeeper/localhost@TEST.COM
-
原因:配置 server-kerberos.properties 文件时,需要更改连接 zookeeper 的 host
-