1-- 为啥需要开启zookeeper认证
2-- 如何开启zookeeper认证
2.1-- 修改文件 zoo.cfg, 开启认证功能
2.2-- 创建 jaas.conf文件,配置认证的用户和密码(例子的文件路径为 /etc/zookeeper/jaas.conf)
2.3-- 设置jaas.conf的权限,权限是 zookeeper 组件的用户,假设组件zookeeper的拥有使用者名为 zkp,所需组为root
2.4-- 更新zookeeper的JVM flags
2.5-- 重启zookeeper实例(node or pod)
3-- 如何配置kafka对zookeeper的身份认证
3.1-- 开启kafka上的zookeeper的认证。 创建 jass.conf文件(以/etc/kafka/jass.conf为例),密码是刚刚在启动zookeeper认证(/etc/zookeeper/jass.conf)时候配置的
3.2-- 设置3.1的文件jass.conf的权限
3.3-- 更新kafka 的 jvm options
3.4-- 重启所有的brokers
3.5-- 执行ACL迁移
3.6-- 配置kafka使用zookeeper的ACL
3.7-- 重启所有的brokers
3.8-- 确认zookeeper的数据
kafka使用zookeeper来存储元数据,其中包括了ACL。默认的情况下,任何可以访问网络的人,都可以访问zookeeper,这意味着任何人可以:
以下步骤需要在所有的zookeeper的实例(node or pod)执行
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider #开启认证功能
requireClientAuthScheme=sasl #认证方式为sasl
jaasLoginRenew=3600000
以定义两个用户 admin和 kafka为例
Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_admin="password"
user_kafka="password";
};
注意,配置项最后必须添加分号 " ; "
sudo chown root:zkp /etc/zookeeper/jaas.conf
sudo chmod 640 /etc/zookeeper/jaas.conf
将jaas的配置文件位置作为JVM参数传递给每个客户端的JVM,不同的安装方式有不同的jvmflags名字,例如jvm_opts,请查看zookeeper的启动脚本(startup script).以jvmflags为例
JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/jaas.conf -Dzookeeper.allowSaslFailedClients=false"
以下操作,需要在每个broker中执行
ZkClient {
org.apache.zookeeper.server.auth.DigestLoginModule required
username="kafka"
password=“password";
};
同样假设 kafka的拥有者叫 kfk,组是 root
sudo chown root:kafka /etc/kafka/jaas.conf
sudo chown 640 /etc/kafka/jaas.conf
KAFKA_JVM_PERFORMANCE_OPTS=... -Dzookeeper.sasl.client=true -Dzookeeper.sasl.clientconfig=ZkClient -Dzookeeper.sasl.client.username=kafka -Djava.security.auth.login.config=/etc/kafka/jaas.conf
'...'是任何现有的设置选项
正常的执行完3.4后,kafka会有一个 zookeeper-security-migration.sh的脚本,执行这个脚本可以更新kafka数据中的zookeeper的 ACL
假设 kakfa的安装bin路径为 /opt/kafka/bin, zookeeper.connect 是你zookeeper的链接(主机名或服务名)
sudo KAFKA_OPTS="-Dzookeeper.sasl.client=true -Dzookeeper.sasl.clientconfig=ZkClient -Dzookeeper.sasl.client.username=kafka -Djava.security.auth.login.config=/etc/kafka/jaas.conf" \
/opt/kafka/bin/zookeeper-security-migration.sh --zookeeper.acl secure --zookeeper.connect zookeeper00-internal.prod
zookeeper.set.acl=true
使用zookeeper cli确认已有 ACL 集
[zk: localhost:2181(CONNECTED) 5] getAcl /config
'world,'anyone
: r
'digest,'kafka
: cdrwa
zk的权限详解可以看这篇 zookeeper的权限控制 - 天宇轩-王 - 博客园
我这里是 /config 这个目录的 acl情况是
'world','anyone' : r - - 指的是 所有人 对 /config这个目录有 r(读取)的权限
'digest', 'kafka' : cdrwa -- 指的是,开启用户认证的用户 kafka,对目录 /config,具有
这5种权限简写为cdrwa,注意:这5种权限中,delete是指对子节点的删除权限,其它4种
权限指对自身节点的操作权限
如图所示,此时配置成功。配置成功后,kaka在链接zookeeper的 时候进行身份验证,kafka保存到zookeeper的数据也执行由zookeeper中的kafka用户(由步骤2.2和3.1定义,此例为kafka)修改
匿名用户仍然可以连接查看不受ACL保护的数据,这样看来虽然安全性不是很好,但是还是可以防止kafka数据不受污染。
应用(zookeeper,kafka)运行在容器中(docker + k8s)
step 1 :zoo.cfg文件新增
quorum.auth.enableSasl=true # 开启sasl开关
quorum.auth.learnerRequireSasl=true # zk作为learner的时候,会发送认证消息
quorum.auth.serverRequireSasl=true # zk作为server,learner链接的时候,需要发送认证消息
quorum.auth.learner.loginContext=QuorumLearner # JAAS配置中 context的名字
quorum.auth.server.loginContext=QuorumServer # JAAS配置中 context的名字
quorum.cnxn.threads.size=20 # 建议设置为 zk 节点数量 乘以 2
requireClientAuthScheme=sasl
authProvider.=org.apache.zookeeper.server.auth.SASLAuthenticationProvider # IdOfBroker是指ZK节点的myid
authProvider.=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
authProvider.=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
step 2: 新增配置文件 JAAS, 内容是 用户名和密码。
Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_super="123456" # 格式是 user_用户名=密码
user_kafka="123456"
user_someoneelse="123456";
};
QuorumServer {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_zookeeper="123456";
};
QuorumLearner {
org.apache.zookeeper.server.auth.DigestLoginModule required
username="zookeeper"
password="123456";
};
step 3 : bin/zkEnv.sh 添加 jvm 选项 (即告知jaas的路径), 我直接在dockerfile中将jaas 文件 copy到 容器路径 "/opt/zookeeper/conf/jaas.conf" 。 SERVER_JVMFLAGS这个名字还是要到 bin/zkServer.sh中确认是否正确, 因为可能以后的kafka 迭代版本后, 这个变量名字会更改
SERVER_JVMFLAGS="-Djava.security.auth.login.config=/opt/zookeeper/conf/jaas.conf"
step 4 : 再修改zoo.cfg
requireClientAuthScheme=sasl
authProvider.=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
authProvider.=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
authProvider.=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
step 1: 在config/server.properties 新增配置
zookeeper.set.acl=true # 开启 ACL名单
step 2: 新增配置文件 JAAS,新增用户和密码,注意 用户名和密码 需要和 zk的JAAS配置文件保持一致 。我是在dockerfile中将 jaas 拷贝copy到容器中
Client {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="kafka"
password="123456";
};
step 3:kafka启动时 告诉它在哪里读取jaas文件, 我是直接在k8s的 yaml文件中配置,你也可以在 kafka的bin/kafka-run-class.sh 添加的
KAFKA_OPTS="-Djava.security.auth.login.config=./config/jaas.conf" #jaas文件的路径
参考文档:Apache Kafka ZooKeeper authentication