开启zookeeper的安全认证功能,并配置kafka对zookeeper的身份验证

目录

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的数据


1-- 为啥需要开启zookeeper认证

kafka使用zookeeper来存储元数据,其中包括了ACL。默认的情况下,任何可以访问网络的人,都可以访问zookeeper,这意味着任何人可以:

  • 通过修改配置ACL来升级特权
  • 通过恶意修改zookeeper的元数据,来使得kafka集群收到污染,崩溃
  • 开启认证后,可以阻止恶意修改,同事不妨碍正常访问zookeeper服务

2-- 如何开启zookeeper认证

以下步骤需要在所有的zookeeper的实例(node or pod)执行

2.1-- 修改文件 zoo.cfg, 开启认证功能

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider  #开启认证功能
requireClientAuthScheme=sasl   #认证方式为sasl
jaasLoginRenew=3600000

2.2-- 创建 jaas.conf文件,配置认证的用户和密码(例子的文件路径为 /etc/zookeeper/jaas.conf)

        以定义两个用户 admin和 kafka为例

Server {
  org.apache.zookeeper.server.auth.DigestLoginModule required
  user_admin="password"
  user_kafka="password";
};

注意,配置项最后必须添加分号 " ; "

2.3-- 设置jaas.conf的权限,权限是 zookeeper 组件的用户,假设组件zookeeper的拥有使用者名为 zkp,所需组为root

sudo chown root:zkp /etc/zookeeper/jaas.conf
sudo chmod 640 /etc/zookeeper/jaas.conf

2.4-- 更新zookeeper的JVM flags

将jaas的配置文件位置作为JVM参数传递给每个客户端的JVM,不同的安装方式有不同的jvmflags名字,例如jvm_opts,请查看zookeeper的启动脚本(startup script).以jvmflags为例

JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/jaas.conf -Dzookeeper.allowSaslFailedClients=false"

2.5-- 重启zookeeper实例(node or pod)

3-- 如何配置kafka对zookeeper的身份认证

以下操作,需要在每个broker中执行

3.1-- 开启kafka上的zookeeper的认证。 创建 jass.conf文件(以/etc/kafka/jass.conf为例),密码是刚刚在启动zookeeper认证(/etc/zookeeper/jass.conf)时候配置的

ZkClient {
  org.apache.zookeeper.server.auth.DigestLoginModule required
  username="kafka"
  password=“password";
};

3.2-- 设置3.1的文件jass.conf的权限

同样假设 kafka的拥有者叫 kfk,组是 root

sudo chown root:kafka /etc/kafka/jaas.conf
sudo chown 640 /etc/kafka/jaas.conf

3.3-- 更新kafka 的 jvm options

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-- 重启所有的brokers

3.5-- 执行ACL迁移

正常的执行完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

3.6-- 配置kafka使用zookeeper的ACL

zookeeper.set.acl=true

3.7-- 重启所有的brokers

3.8-- 确认zookeeper的数据

使用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,具有

  • CREATE(c): 创建权限,可以在在当前node下创建child node
  • DELETE(d): 删除权限,可以删除当前的node
  • READ(r): 读权限,可以获取当前node的数据,可以list当前node所有的child nodes
  • WRITE(w): 写权限,可以向当前node写数据
  • ADMIN(a): 管理权限,可以设置当前node的permission

这5种权限简写为cdrwa,注意:这5种权限中,delete是指对子节点的删除权限,其它4种
权限指对自身节点的操作权限

如图所示,此时配置成功。配置成功后,kaka在链接zookeeper的 时候进行身份验证,kafka保存到zookeeper的数据也执行由zookeeper中的kafka用户(由步骤2.2和3.1定义,此例为kafka)修改

匿名用户仍然可以连接查看不受ACL保护的数据,这样看来虽然安全性不是很好,但是还是可以防止kafka数据不受污染。

4-- 我在实战的使用

    应用(zookeeper,kafka)运行在容器中(docker + k8s)

   4.1-- zookeeper的配置

      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.<IdOfBroker1>=org.apache.zookeeper.server.auth.SASLAuthenticationProvider # IdOfBroker是指ZK节点的myid
authProvider.<IdOfBroker2>=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
authProvider.<IdOfBroker3>=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.<IdOfBroker1>=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
authProvider.<IdOfBroker2>=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
authProvider.<IdOfBroker3>=org.apache.zookeeper.server.auth.SASLAuthenticationProvider

  4.2-- kafka的配置

   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

  • 12
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值