• 由于acl信息存储在zookeeper中,所以在没有启用zookeeper权限体系的情况下,任何用户理论上都可以执行 kafka-acls.sh

服务端启用 ACL

添加配置到 config/server.properties

  • 因为之前创建用户的 kafka kerberos 认证的 principal 为 kafka/ubuntu@EXAMPLE.COM, 所以这里 User 部分直接取 kafka 即可. 配置成集群的 superuser, superuser不受 ACL 限制.
1
2
3
4
5
6
7
8
9
# 允许自动创建 Topic
# auto.create.topics.enable=true
#acl相关,配置后才能启用acl
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
# 配置 superuser 为 kafka
super.users=User:kafka
# 设置为true,ACL机制为黑名单机制,只有黑名单中的用户无法访问
# 默认为false,ACL机制为白名单机制,只有白名单中的用户可以访问
allow.everyone.if.no.acl.found=false

检查已授权信息

  • 无返回即为无授权信息, 否则会显示所有 ACLs
1
kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --list

添加 kerberos 用户

  1. 登陆 docker
  2. 添加 principal
  3. 创建 keytab 授权文件
  4. 验证授权是否成功
1
2
3
4
docker exec -it krb5 sh
kadmin.local -q 'addprinc -randkey acl/acl@EXAMPLE.COM'
kadmin.local -q "ktadd -k /etc/security/keytabs/acl_acl.keytab acl/acl@EXAMPLE.COM"
kinit -V -kt /home/ubuntu/docker-krb5-server/keytabs/acl.keytab acl/acl@EXAMPLE.COM

创建客户端 jass 文件

  • vim config/kafka_acl_jass.conf
1
2
3
4
5
6
7
8
9
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
serviceName=kafka
useKeyTab=true
storeKey=true
keyTab="/home/ubuntu/docker-krb5-server/keytabs/acl_acl.keytab"
principal="acl/acl@EXAMPLE.COM";
};

添加环境变量

  • 需指定 KAFKA_HOME, krb5.conf, jaas.conf 等配置的绝对路径
1
2
export KAFKA_HOME=/home/ubuntu/kafka
export KAFKA_OPTS=" -Dzookeeper.sasl.client=false -Dsun.security.krb5.debug=true -Djava.security.krb5.conf=/home/ubuntu/kafka/config/krb5.conf -Djava.security.auth.login.config=/home/ubuntu/kafka/config/kafka_acl_jass.conf "

授权 Topic及消费组 读权限

  • 未授权之前, 除了 superuers 正常读写集群. 其他用户默认拒绝.

因为 kafka 鉴权是按消费组进行的, 所以授权之前需要明确 Consumer 的 group.id

以 config/comsumer.properties 里面的 test-consumer-group 为例

  • 给 acl/acl@EXAMPLE.COM 用户, 授予对 Topic: test_acl 和消费组: test-consumer-group 的读权限

这里 acl/acl@EXAMPLE.COM 的 acl 可以简单理解成用户组之类的, 授权之后 acl/acl_acl@EXAMPLE.COM 这个 principal 也享有同等权限. 所以如果想错开授权的话, 开头这个 acl 必须修改.

1
2
3
./bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:acl --operation Read --topic test_acl --group test-consumer-group
# 移除读权限 --add 改成 --remove 即可
# kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --remove --allow-principal User:acl --operation Read --topic test_acl --group test-consumer-group

手动消费验证

至少需要两个 broker, 一个的话,大概率不能正常消费.

消费不到数据的时候, 先验证 kafka 是否配置完整, 所有节点是否都已启动

任何一步提示需要密码之类的报错, 大概率都是因为 kerberos 认证配置的问题, 如 jass 文件, 环境变量, 消费时未指定 comsumer.properties 等. 文件太多了很容易就忘记改了, 从而导致鉴权失败.

日志: $KAFKA_HOME/logs/server.log

producer.properties

  • export KAFKA_HOME KAFKA_OPTS 配置, 追加以下内容到 config/producer.properties
1
2
3
4
security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
# service.name 同上
sasl.kerberos.service.name=kafka
  • 因为这里还未授权写权限所以会报错: TopicAuthorizationException: Not authorized to access topics: [test_acl]
1
./bin/kafka-console-producer.sh --broker-list localhost:19092,localhost:19093 --producer.config config/producer.properties  --topic test_acl

consumer.properties

  • export KAFKA_HOME KAFKA_OPTS 配置, 追加以下内容到 config/consumer.properties
1
2
3
4
5
group.id=test-consumer-group
security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
# service.name 同上
sasl.kerberos.service.name=kafka
  • 如果没有权限的话, Comsumer 会直接退出.
  • 这里已经授权了读权限, 所以会正常进入监听模式
1
./bin/kafka-console-consumer.sh --bootstrap-server localhost:19092,localhost:19093 --from-beginning --consumer.config config/consumer.properties --topic test_acl

授权 Topic 写权限

  • 因为写入没有组的概念, 所以不需要对组进行授权.
1
2
3
./bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:acl --operation Write --topic test_acl
# 移除写权限
# kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --remove --allow-principal User:acl --operation Write --topic test_acl

手动消费验证

启用授权后想无需授权访问 Topic?

  • 不能