4.7. 授权
Kafka 代理中的授权使用授权器插件实现。
在本节中,我们描述了如何使用 Kafka 提供的 AclAuthorizer
插件。
或者,您可以使用自己的授权插件。例如,如果您使用 基于 OAuth 2.0 令牌的身份验证,您可以使用 OAuth 2.0 授权。
4.7.1. 简单 ACL 授权器 复制链接链接已复制到粘贴板!
Authorizer 插件(包括 AclAuthorizer
)通过 authorizer.class.name
属性启用:
authorizer.class.name=kafka.security.auth.AclAuthorizer
authorizer.class.name=kafka.security.auth.AclAuthorizer
所选授权器需要完全限定名称。对于 AclAuthorizer
,完全限定名称为 kafka.security.auth.AclAuthorizer
。
4.7.1.1. ACL 规则 复制链接链接已复制到粘贴板!
AclAuthorizer
使用 ACL 规则来管理 Kafka 代理的访问。
ACL 规则的格式定义:
主体 P 允许/拒绝来自主机 H 的 Kafka 资源 R 中的操作 O
例如,可以设置一个规则以便用户:
John 可以查看 主机 127.0.0.1中的主题 注释
Host 是 John 进行连接的机器的 IP 地址。
在大多数情况下,用户是生成者或消费者应用程序:
Consumer01 可以对来自主机 127.0.0.1 的消费者组账户有写入权限。
如果没有 ACL 规则
如果给定资源没有 ACL 规则,则所有操作都会被拒绝。通过在 Kafka 配置文件 /opt/kafka/config/server.properties
中将属性 allow.everyone.if.no.acl.found
设置为 true
来更改此行为。
4.7.1.2. 主体 复制链接链接已复制到粘贴板!
principal(主体)代表用户的身份。ID 格式取决于客户端用来连接到 Kafka 的身份验证机制:
-
在没有身份验证的情况下连接时,user
:ANONYMOUS
. 使用简单身份验证机制(如 PLAIN 或 SCRAM)连接时,user:<
username
>。例如
User:admin
orUser:user1
。使用 TLS 客户端身份验证
连接时,user:<DistinguishedName
>。例如
User:CN=user1,O=MyCompany,L=Prague,C=CZ
。-
使用
Kerberos 连接时,user:<Kerberos username
>。
DistinguishedName 是与客户端证书区分的名称。
Kerberos 用户名是 Kerberos 主体的主要部分,在使用 Kerberos 连接时默认使用它。您可以使用 sasl.kerberos.principal.to.local.rules
属性来配置 Kafka 主体如何从 Kerberos 主体构建。
4.7.1.3. 用户身份验证 复制链接链接已复制到粘贴板!
要使用授权,您需要启用身份验证并供您的客户端使用。否则,所有连接都将具有主体 User:ANONYMOUS
。
有关身份验证方法的更多信息,请参阅加密和身份验证。
4.7.1.4. 超级用户 复制链接链接已复制到粘贴板!
超级用户被允许执行所有操作,无论 ACL 规则是什么。
超级用户使用属性 super.users
在 Kafka 配置文件中定义。
例如:
super.users=User:admin,User:operator
super.users=User:admin,User:operator
4.7.1.5. 副本代理身份验证 复制链接链接已复制到粘贴板!
启用授权后,它将适用于所有监听程序和所有连接。这包括用于在代理间复制数据的 inter-broker 连接。如果启用授权,请确保使用身份验证进行代理连接,并授予代理使用足够权利的用户。例如,如果代理之间的身份验证使用 kafka-broker
用户,则超级用户配置必须包含用户名 super.users=User:kafka-broker
。
4.7.1.6. 支持的资源 复制链接链接已复制到粘贴板!
您可以将 Kafka ACL 应用到这些资源类型:
- topics
- 消费者组
- 集群
- TransactionId
- DelegationToken
4.7.1.7. 支持的操作 复制链接链接已复制到粘贴板!
AclAuthorizer
授权对资源的操作。
下表中带有 X
的字段标记每个资源支持的操作。
topics | 消费者组 | 集群 | |
---|---|---|---|
读 | X | X | |
写 | X | ||
创建 | X | ||
删除 | X | ||
更改 | X | ||
Describe | X | X | X |
ClusterAction | X | ||
All | X | X | X |
4.7.1.8. ACL 管理选项 复制链接链接已复制到粘贴板!
ACL 规则使用 bin/kafka-acls.sh
工具进行管理,该工具作为 Kafka 发布软件包的一部分提供。
使用 kafka-acls.sh
参数选项来添加、列出和删除 ACL 规则,并执行其他功能。
参数需要双假设惯例,如 --add
。
选项 | 类型 | 描述 | 默认 |
---|---|---|---|
| 操作 | 添加 ACL 规则。 | |
| 操作 | 删除 ACL 规则。 | |
| 操作 | 列出 ACL 规则。 | |
| 操作 | 授权者的完全限定类名称。 |
|
| Configuration | 传递给授权器进行初始化的键/值对。
对于 | |
| 资源 | 主机/端口对以连接到 Kafka 集群。 |
使用这个选项或 |
| 资源 |
要传递给 Admin Client 的配置文件,与 | |
| 资源 | 将集群指定为 ACL 资源。 | |
| 资源 | 将主题名称指定为 ACL 资源。
一个星号(
单个命令可以指定多个 | |
| 资源 | 将消费者组名称指定为 ACL 资源。
单个命令可以指定多个 | |
| 资源 | 将事务 ID 指定为 ACL 资源。 事务发送意味着,生产者发送到多个分区的所有消息都必须成功发送或不发送它们。
使用通配符星号 ( | |
| 资源 | 将委托令牌指定为 ACL 资源。
使用通配符星号 ( | |
| Configuration |
指定
使用
使用 |
|
| 主体 | 添加到允许 ACL 规则的主体。
单个命令可以指定多个 | |
| 主体 | 添加到拒绝 ACL 规则的主体。
单个命令可以指定多个 | |
| 主体 |
与
单个命令可以指定多个 | |
| 主机 |
允许访问 不支持主机名或 CIDR 范围。 |
如果指定了 |
| 主机 |
拒绝访问 不支持主机名或 CIDR 范围。 |
如果指定了 |
| 操作 | 允许或拒绝操作。
单个命令可以指定多个Multiple | All |
| 快捷键 | 允许或拒绝消息制作者需要的所有操作的快捷方式(主题中为 WRITE 和 DESCRIBE,集群中为 CREATE)。 | |
| 快捷键 | 允许或拒绝消息消费者所需的所有操作的快捷方式(主题为READ 和 DESCRIBE,READ on consumer group)。 | |
| 快捷键 |
与 如果制作者被授权根据特定的事务 ID 发送消息,则会自动启用 Idepmotence。 | |
| 快捷键 | 接受所有查询且不提示的快捷方式。 |
4.7.2. 启用授权 复制链接链接已复制到粘贴板!
此流程描述了如何为 Kafka 代理中的授权启用 AclAuthorizer
插件。
先决条件
- AMQ Streams 安装在 用作 Kafka 代理的所有主机上。
流程
编辑
/opt/kafka/config/server.properties
Kafka 配置文件,以使用AclAuthorizer
。authorizer.class.name=kafka.security.auth.AclAuthorizer
authorizer.class.name=kafka.security.auth.AclAuthorizer
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - (重新)启动 Kafka 代理。
其他资源
- 有关配置 AMQ Streams 的详情,请参考 第 2.8 节 “配置 AMQ Streams”。
- 有关运行 Kafka 集群的更多信息,请参阅 第 4.5 节 “运行多节点 Kafka 集群”。
4.7.3. 添加 ACL 规则 复制链接链接已复制到粘贴板!
AclAuthorizer
使用访问控制列表(ACL),它定义了一组规则来描述用户可以执行的操作。
此流程描述了如何在 Kafka 代理中使用 AclAuthorizer
插件时添加 ACL 规则。
使用 kafka-acls.sh
工具添加规则,并存储在 ZooKeeper 中。
先决条件
- AMQ Streams 安装在 用作 Kafka 代理的所有主机上。
- 在 Kafka 代理 中启用 授权。
流程
使用
--add
选项运行kafka-acls.sh
。示例:
允许使用
MyConsumerGroup
消费者组从myTopic
读取user1
和user2
访问权限。bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --add --operation Read --topic myTopic --allow-principal User:user1 --allow-principal User:user2 bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --add --operation Describe --topic myTopic --allow-principal User:user1 --allow-principal User:user2 bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --add --operation Read --operation Describe --group MyConsumerGroup --allow-principal User:user1 --allow-principal User:user2
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --add --operation Read --topic myTopic --allow-principal User:user1 --allow-principal User:user2 bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --add --operation Describe --topic myTopic --allow-principal User:user1 --allow-principal User:user2 bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --add --operation Read --operation Describe --group MyConsumerGroup --allow-principal User:user1 --allow-principal User:user2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 拒绝
user1
访问从 IP 地址主机127.0.0.1
读取myTopic
。bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --add --operation Describe --operation Read --topic myTopic --group MyConsumerGroup --deny-principal User:user1 --deny-host 127.0.0.1
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --add --operation Describe --operation Read --topic myTopic --group MyConsumerGroup --deny-principal User:user1 --deny-host 127.0.0.1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加
user1
作为带有MyConsumerGroup
的myTopic
的消费者。bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --add --consumer --topic myTopic --group MyConsumerGroup --allow-principal User:user1
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --add --consumer --topic myTopic --group MyConsumerGroup --allow-principal User:user1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
-
有关所有
kafka-acls.sh
选项列表,请参阅 第 4.7.1 节 “简单 ACL 授权器”。
4.7.4. 列出 ACL 规则 复制链接链接已复制到粘贴板!
此流程描述了如何在 Kafka 代理中使用 AclAuthorizer
插件时列出现有的 ACL 规则。
使用 kafka-acls.sh
实用程序列出规则。
先决条件
- AMQ Streams 安装在 用作 Kafka 代理的所有主机上。
- 在 Kafka 代理 中启用 授权
- 添加了 ACL。
流程
使用
--list
选项运行kafka-acls.sh
。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
-
有关所有
kafka-acls.sh
选项列表,请参阅 第 4.7.1 节 “简单 ACL 授权器”。
4.7.5. 删除 ACL 规则 复制链接链接已复制到粘贴板!
此流程描述了如何在 Kafka 代理中使用 AclAuthorizer
插件时删除 ACL 规则。
使用 kafka-acls.sh
工具删除规则。
先决条件
- AMQ Streams 安装在 用作 Kafka 代理的所有主机上。
- 在 Kafka 代理 中启用 授权。
- 添加了 ACL。
流程
使用
--remove
选项运行kafka-acls.sh
。示例:
删除 ACL,允许
user1
和user2
使用MyConsumerGroup
消费者组从myTopic
读取。bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --remove --operation Read --topic myTopic --allow-principal User:user1 --allow-principal User:user2 bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --remove --operation Describe --topic myTopic --allow-principal User:user1 --allow-principal User:user2 bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --remove --operation Read --operation Describe --group MyConsumerGroup --allow-principal User:user1 --allow-principal User:user2
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --remove --operation Read --topic myTopic --allow-principal User:user1 --allow-principal User:user2 bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --remove --operation Describe --topic myTopic --allow-principal User:user1 --allow-principal User:user2 bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --remove --operation Read --operation Describe --group MyConsumerGroup --allow-principal User:user1 --allow-principal User:user2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除 ACL 添加
user1
作为带有MyConsumerGroup
的myTopic
的消费者。bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --remove --consumer --topic myTopic --group MyConsumerGroup --allow-principal User:user1
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --remove --consumer --topic myTopic --group MyConsumerGroup --allow-principal User:user1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除 ACL 拒绝
user1
从 IP 地址主机127.0.0.1
读取myTopic
的访问。bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --remove --operation Describe --operation Read --topic myTopic --group MyConsumerGroup --deny-principal User:user1 --deny-host 127.0.0.1
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=zoo1.my-domain.com:2181 --remove --operation Describe --operation Read --topic myTopic --group MyConsumerGroup --deny-principal User:user1 --deny-host 127.0.0.1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
-
有关所有
kafka-acls.sh
选项列表,请参阅 第 4.7.1 节 “简单 ACL 授权器”。 - 有关启用授权的更多信息,请参阅 第 4.7.2 节 “启用授权”。