跳转至

4.4 命令行工具

kafka-acls.sh

详细参数

  • Action:
    • --add: 增加 acl 规则
    • --remove: 删除 acl 规则
    • --list
  • Configuration:
    • --authorizer: authorizer 的类名,默认 kafka.security.authorizer.AclAuthorizer
    • --authorizer-properties: key-val pairs 用来初始 authorizer。对于默认的 authorizer,需要传 zookeeper.connect=
    • --bootstrap-server: kafka 服务地址,与 authorizer 相关的配置只需要保留一个
    • --command-config: 可与 --bootstrap-server 一起使用,指定一个包含配置的 property 文件,用来初始 Admin Client
    • --resource-pattern-type [pattern-type]
      • add acls:
        • LITERAL: 完全匹配,但是可以用 * 代表所有
        • PREFIXED: 前缀匹配
      • list or remove acls:
        • ANY:
        • MATCH: 表示所有会影响到 resource 的规则,包括前缀匹配或者 *
    • --zk-tls-config-file
  • ResourcePattern
    • --cluster
    • --topic [topic-name]
    • --group [group-name]
    • --transactional-id [transactional-id]
    • --delegation-token [delegation-token]
  • Principal
    • --allow-principal
    • --deny-principal
    • --principal
  • Host
    • --allow-host
    • --deny-host
  • Operation
    • --operation: 可选的值:
      • All
      • Read
      • Write
      • Create
      • Delete
      • Alter
      • Describe
      • ClusterAction
      • DescribeConfigs
      • AlterConfigs
      • IdempotentWrite
      • CreateTokens
      • DescribeTokens
  • Convenience
    • --producer: Write, Describe, Create on topic
    • --consumer: Read, Describe on topic and Read on consumer-group
    • --idempotent: 和 --producer 一起使用,表示 producer 可以幂等写

示例

添加权限

  1. 允许 User:Bob 或者 User:Alice 从 IP 198.51.100.0 或者 198.51.100.1 读写 Test-topic

    bin/kafka-acls.sh \
        --authorizer-properties zookeeper.connect=localhost:2181 \
        --add \
        --allow-principal User:Bob --allow-principal User:Alice \
        --allow-host 198.51.100.0 --allow-host 198.51.100.1 \
        --operation Read --operation Write \
        --topic Test-topic
    
  2. 允许除 从 IP 198.51.100.3 访问的 User:BadBob 外的所有用户读 Test-topic

    bin/kafka-acls.sh \
        --authorizer-properties zookeeper.connect=localhost:2181 \
        --add \
        --allow-principal User:* --allow-host '*' \
        --deny-principal User:BadBob --deny-host 198.51.100.3 \
        --operation Read \
        --topic Test-topic
    
  3. 从 IP 198.51.200.0 访问的 User:Peter 允许向任何 topic 生产消息

    bin/kafka-acls.sh \
        --authorizer-properties zookeeper.connect=localhost:2181 \
        --add \
        --allow-principal User:Peter \
        --allow-host 198.51.200.1 \
        --producer \
        --topic '*'
    
  4. 允许 User:Jane 向任何以 Test- 开头的 topic 生产消息

    bin/kafka-acls.sh \
        --authorizer-properties zookeeper.connect=localhost:2181 \
        --add \
        --allow-principal User:Jane \
        --producer \
        --topic Test- \
        --resource-pattern-type prefixed
    

移除权限

  1. 移除添加的第 1 条 acl 规则

    bin/kafka-acls.sh \
        --authorizer-properties zookeeper.connect=localhost:2181 \
        --remove \
        --allow-principal User:Bob --allow-principal User:Alice \
        --allow-host 198.51.100.0 --allow-host 198.51.100.1 \
        --operation Read --operation Write \
        --topic Test-topic
    
  2. 移除添加的第 4 条 acl 规则(topic 前缀匹配)

    bin/kafka-acls.sh \
        --authorizer-properties zookeeper.connect=localhost:2181 \
        --remove \
        --allow-principal User:Jane \
        --producer \
        --topic Test- \
        --resource-pattern-type Prefixed
    

获取关联权限

  1. 可以根据 resource 列出关联的 acl 规则列表,比如列出 topic Test-topic 相关联的 acl 规则

    bin/kafka-acls.sh \
        --authorizer-properties zookeeper.connect=localhost:2181 \
        --list \
        --topic Test-topic
    
  2. 可以用 * 表示所有 resource,比如列出所有 topic 的 acl 规则

    bin/kafka-acls.sh \
        --authorizer-properties zookeeper.connect=localhost:2181 \
        --list \
        --topic '*'
    
  3. 如果想看特定 resource 关联的所有记录,包括前缀匹配和 *,可以使用 match

    bin/kafka-acls.sh \
        --authorizer-properties zookeeper.connect=localhost:2181 \
        --list \
        --topic Test-topic \
        --resource-pattern-type match
    

按场景快速添加权限

  1. --producer 选项可以方便的代表生产消息需要的操作

    bin/kafka-acls.sh \
        --bootstrap-server ${BOOTSTRAP_SERVER} \
        --add \
        --allow-principal User:Bob \
        --producer \
        --topic '*'
    
  2. --consumer 选项可以方便的代表消费消息需要的操作,并且要与 --group 搭配使用

    bin/kafka-acls.sh \
        --bootstrap-server ${BOOTSTRAP_SERVER} \
        --add \
        --allow-principal User:Bob \
        --consumer \
        --topic '*' \
        --group '*'
    
  3. 给用户 Bob 增加 幂等写 权限

    kafka-acls.sh \
        --authorizer-properties zookeeper.connect=loalhost:2181 \
        --add \
        --allow-principal User:Bob \
        --operation IdempotentWrite
        --cluster
    

    上述命令也替换成使用 --bootstrap-server 的方式:

    kafka-acls.sh \
        --bootstrap-server ${BOOTSTRAP_SERVER} \
        --add \
        --allow-principal User:* \
        --operation IdempotentWrite \
        --cluster
    
  4. 给用户 alice 增加事务Id transaction_id 的写权限:

    kafka-acls.sh \
        --bootstrap-server ${BOOTSTRAP_SERVER} \
        --add \
        --allow-principal User:alice \
        --operation Write
        --transactional-id transaction_id \
        --resource-pattern-type LITERAL \
    

    --resource-pattern-type LITERAL --transactional-id '*' 表示所有事务Id

    kafka-acls.sh \
        --bootstrap-server ${BOOTSTRAP_SERVER} \
        --add \
        --allow-principal User:alice \
        --operation Write
        --transactional-id '*' \
        --resource-pattern-type LITERAL \
    
  5. 给用户增加 describe_configs 权限

    kafka-acls.sh \
        --bootstrap-server ${BOOTSTRAP_SERVER} \
        --add \
        --allow-principal User:alice \
        --operation DescribeConfigs \
        --topic '*' \
        --resource-pattern-type LITERAL \
        --command-config /usr/local/kafka-worker/conf/kafka.properties
    
  6. 给用户增加 describe cluster 权限

    kafka-acls.sh \
        --bootstrap-server ${BOOTSTRAP_SERVER} \
        --add \
        --allow-principal User:alice \
        --operation Describe \
        --cluster \
        --command-config /usr/local/kafka-worker/conf/kafka.properties
    

在 Linux 命令行中,命令中的 * 通常会被 Shell 展开为匹配到的文件列表,然后再把这些文件名作为参数传给命令,通过 '*' 可以避免 Shell 预展开