

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Apache Kafka ACL
<a name="msk-acls"></a>

Apache Kafka 有一个可插拔的授权方并附带开箱即用的授权方实现。Amazon MSK 在代理上的 `server.properties` 文件中启用此授权方。

Apache Kafka ACL 的格式为 “主体 P 是 [Allowed/Denied] 在任何与 RP 匹配 ResourcePattern 的资源 R 上来自主机 H 的操作 O”。如果 RP 与特定资源 R 不匹配，则 R 没有关联的 ACL，因此不允许除超级用户之外的用户访问 R。若要更改此 Apache Kafka 行为，请将属性 `allow.everyone.if.no.acl.found` 设为 true。默认情况下，Amazon MSK 会将其设置为 true。这意味着，对于 Amazon MSK 集群，如果您没有在资源上显式设置 ACL，则所有委托人都可以访问此资源。如果在资源上启用 ACL，则只有授权的委托人才能访问它。如果要限制对主题的访问并使用 TLS 相互身份验证授权客户端，请使用 Apache Kafka 授权方 CLI 添加 ACL。有关添加、删除和列出 ACL 的更多信息，请参阅 [Kafka 授权命令行界面](https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Authorization+Command+Line+Interface)。

由于 Amazon MSK 将代理配置为超级用户，因此代理可访问所有主题。这有助于代理从主分区复制消息，无论是否为集群配置定义了 `allow.everyone.if.no.acl.found` 属性。

**添加或删除对主题的读写访问权**

1. 将代理添加到 ACL 表中，以允许它们读取具有 ACL 的所有主题。要授予代理对主题的读取访问权限，请在可与 MSK 集群通信的客户端计算机上运行以下命令。

   {{Distinguished-Name}}替换为集群中任何引导程序代理的 DNS，然后将此可分辨名称中第一个句点之前的字符串替换为星号 () `*`。例如，如果集群的某个引导代理有 DNS`b-6.mytestcluster.67281x.c4.kafka.us-east-1.amazonaws.com`，则在以下命令{{Distinguished-Name}}中替换为。`*.mytestcluster.67281x.c4.kafka.us-east-1.amazonaws.com`有关如何获取引导代理的信息，请参阅[获取 Amazon MSK 集群的引导代理](msk-get-bootstrap-brokers.md)。

   ```
   {{<path-to-your-kafka-installation>}}/bin/kafka-acls.sh --bootstrap-server BootstrapServerString --add --allow-principal "User:CN={{Distinguished-Name}}" --operation Read --group=* --topic {{Topic-Name}}
   ```

1. 要授予客户端应用对主题的读访问权，请在客户端计算机上运行以下命令。如果您使用双向 TLS 身份验证，请使用与创建私钥时相同的{{Distinguished-Name}}身份验证。

   ```
   {{<path-to-your-kafka-installation>}}/bin/kafka-acls.sh --bootstrap-server BootstrapServerString --add --allow-principal "User:CN={{Distinguished-Name}}" --operation Read --group=* --topic {{Topic-Name}}
   ```

   要删除读访问权，您可以运行相同的命令，并将 `--add` 替换为 `--remove`。

1. 要授予对主题的写访问权，请在客户端计算机上运行以下命令。如果您使用双向 TLS 身份验证，请使用与创建私钥时相同的{{Distinguished-Name}}身份验证。

   ```
   {{<path-to-your-kafka-installation>}}/bin/kafka-acls.sh --bootstrap-server BootstrapServerString --add --allow-principal "User:CN={{Distinguished-Name}}" --operation Write --topic {{Topic-Name}}
   ```

   要删除写访问权，您可以运行相同的命令，并将 `--add` 替换为 `--remove`。