- 由于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
|
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
super.users=User:kafka
allow.everyone.if.no.acl.found=false
|
检查已授权信息
1
| kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --list
|
添加 kerberos 用户
- 登陆 docker
- 添加 principal
- 创建 keytab 授权文件
- 验证授权是否成功
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
|
手动消费验证
至少需要两个 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
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
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
|
手动消费验证
启用授权后想无需授权访问 Topic?