7.4 Authorization and ACLs(授权和访问控制列表)
Kafka 带有一个可扩展的 Authorizer (授权器) 和一个用 zookeeper 实现的 Authorizer (授权器),zookeeper 会存储所有的 acls 授权信息。 Kafka acls 授权信息定义的规则是 " P is [Allowed/Denied] Operation O From Host H On Resource R"。您可以在KIP-11上阅读更多关于 acl 结构信息。您可以通过Kafka认证器(authorizer)的CLI对acls进行添加、删除或查询。默认情况下,如果资源R没有关联acls 授权信息,那么除超级用户以外的任何人都不能访问资源R。如果要更改该行为,你可以在server.properties 文件中填写以下内容。
allow.everyone.if.no.acl.found=true
还可以在server.properties中添加超级用户,如下所示(请注意,由于SSL用户名可能包含逗号,因此分隔符是分号)
super.users=User:Bob;User:Alice
默认情况下,SSL用户名的格式为:"CN=writeuser,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,C=Unknown"。可以通过在server.properties中设置一个自定义的PrincipalBuilder来改变这种情况,如下所示。
principal.builder.class=CustomizedPrincipalBuilderClass
默认情况下,SASL用户名将成为Kerberos主体的主要部分。有一种方式可以改变,通过设置 sasl.kerberos.principal.to.local.rules
在server.properties中自定义规则。sasl.kerberos.principal.to.local.rules
是一个列表,其中每个规则的工作方式与Kerberos configuration file (krb5.conf)中的auth_to_local相同。每一个规则以 RULE: 开始,并且包含一个格式为[n:string](regexp)s/pattern/replacement/g的表达式。请查看kerberos文档获取更多细节。下面是添加一个规则的示例,该示例可以很正确地翻译user@MYDOMAIN.COM。并让user同时保持默认的规则:
sasl.kerberos.principal.to.local.rules=RULE:[1:$1@$0](.*@MYDOMAIN.COM)s/@.*//,DEFAULT
Command Line Interface(命令行界面)
Kafka的授权管理CLI(命令行界面)可以在bin目录下找到,并使用所有其他CLIs。命令行界面脚本的名字是 kafka-acls.sh。以下列出了脚本支持的所有选项:
选项 | 说明 | 默认值 | 选项类型 |
---|---|---|---|
--add | 表示用户正在尝试添加acl的脚本 | Action | |
--remove | 表示用户正在尝试删除acl的脚本。 | Action | |
--list | 表示用户正在尝试列出acls的脚本。 | Action | |
--authorizer | 授权器的完全限定类名。 | kafka.security.auth.SimpleAclAuthorizer | Configuration |
--authorizer-properties | 键值对(key=val)将被传递给授权器进行初始化。对于默认授权器,示例值为:zookeeper.connect = localhost:2181 | Configuration | |
--cluster | 指定一个集群作为资源。 | Resource | |
--topic [topic-name] | 指定一个topic(主题)作为资源。 | Resource | |
--group [group-name] | 指定consumer-group(消费组)作为资源。 | Resource | |
--allow-principal | Principal(委托人)是PrincipalType:name的格式,将被添加到ACL中并有允许权限。 你可以在单个命令中指定多个 --allow-principal。 | Principal | |
--deny-principal | Principal是PrincipalType:name格式,将被添加到ACL中并有拒绝权限。 你可以在单个命令中指定多个--deny-principal。 | Principal | |
--allow-host | 在--allow-principal中列出将允许principal从哪些IP地址访问。 | 如果指定 --allow-principal的默认值为 *,将允许从所有主机进行访问。 | Host |
--deny-host | 在--deny-principal中列出将拒绝principal从哪些IP地址访问。 | 如果指定 --deny-principal的默认值为 *,将允许从所有主机进行访问。 | Host |
--operation | 将会被允许和拒绝的操作 有效值: Read(读), Write(写), Create(创建), Delete(删除), Alter(修改), Describe(描述), ClusterAction(集群操作), All(所有) | All | Operation |
--producer | 该选项可为生产者添加和删除acls(访问控制列表)。它生成的acls允许在topic(主题)上进行WRITE, DESCRIBE操作,并且在集群上进行CREATE操作。 | Convenience | |
--consumer | 该选项可为消费者添加和删除acls(访问控制列表)。 它生成的acls允许在topic(主题)上进行READ, DESCRIBE操作,并且通过消费组进行READ操作。 | Convenience | |
--force | 该选项对所有的查询都假设为yes,并且不提示。 | Convenience |
Examples(例子)
- Adding Acls
如果您想添加一个 acl 授权信息 "允许 User:Bob 和 User:Alice 从 IP 198.51.100.0 和 198.51.100.1 对 Topic 中的 Test-Topic 进行读写"。您可以按照下面的选项在终端执行 CLI :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
默认情况下,所有的没有显示声明 acl 授权信息的用户,对某个资源操作时都将被拒绝。在极少情况下,我们需要在acl 授权信息定义一个少数用户不允许访问,其他用户都允许访问的规则,这个时候就需要使用 --deny-principal 和 --deny-host 选项。如果我们想允许所有用户对 Test-topic 进行读取,仅拒绝 User:BadBob 从 IP 198.51.100.3 进行读取。我们可以使用下面的命令:
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
Note that ``--allow-host`` and ``deny-host`` only support IP addresses (hostnames are not supported). 注意:``--allow-host`` 和 ``deny-host`` 只支持 IP地址(不支持主机名) 以上示例通过--topic [topic-name]指定资源选项来将acls添加到 topic 上。同样,用户可以通过指定 --cluster 将 acls 添加到 cluster;通过指定 --group [group-name] 将 acls 添加到一个 consumer group。
- Removing Acls
移除 acl 授权信息几乎是相同的命令。唯一的不同就是必须使用 --remove 选项来代替 --add 选项。为了移除上面第一个示例添加的 acls 授权信息,我们可以用 CLI 终端执行下面的选项: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
- List Acls
我们可以通过指定 --list 选项和资源来列出任何资源的 acls 授权信息。如果我们想列出 Test-topic 的所有的 acls授权信息,我们可以用 CLI 终端执行下面的选项:bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --list --topic Test-topic
- Adding or removing a principal as producer or consumer
ACL 管理最常见的情况就是添加或移除一个用户作为 producer 或 consumer。因此我们添加方便的选项来处理这些情景。为了添加 User:Bob 作为 Test-topic 的 producer 我们可以执行下面的命令:bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:Bob --producer --topic Test-topic
类似的,如果要添加 Alice 到 consumer group Group-1 中作为 Test-topic 的一个 consumer,我们仅需要传递 --consumer 选项:
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:Bob --consumer --topic Test-topic --group Group-1
注意:对于 consumer 选项我们必须指定 consumer group。 为了从 producer 和 consumer 的角色中移除一个用户我们仅需要传 --remove 选项