当我使用开启了 SASL/SCRAM 身份验证的 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 集群时,我遇到了身份验证和权限问题。
解决方法
代理日志中的“ClusterAuthorizationException”错误
当您访问 Amazon MSK 集群时,可能会收到以下错误消息:“org.apache.kafka.common.errors.ClusterAuthorizationException: Request Request(processor=11, connectionId=INTERNAL_IP-INTERNAL_IP-0, session=Session(User:ANONYMOUS,/INTERNAL_IP), listenerName=ListenerName(REPLICATION_SECURE), securityProtocol=SSL, buffer=null) is not authorized.”
当以下两个条件都成立时,您会收到上述错误:
- 您的 Amazon MSK 集群已开启 SASL/SCRAM 身份验证。
- 在集群的访问控制列表 (ACL) 中,将 resourceType 设置为 CLUSTER ,将 operation 设置为 CLUSTER_ACTION。
Amazon MSK 集群不支持上述设置,因为这些设置会阻止 Apache Kafka 的内部复制。当上述两个条件都成立时,对于代理之间的通信,代理的身份为 ANONYMOUS(匿名)。如果您在使用 SASL/SCRAM 身份验证时需要集群支持这些 ACL,则必须向该 ANONYMOUS 用户授予针对 ALL 操作的权限。这样可以防止限制代理之间的复制。
要将此权限授予 ANONYMOUS 用户,请运行以下命令:
./kafka-acls.sh --authorizer-properties
zookeeper.connect=example-ZookeeperConnectString --add --allow-principal
User:ANONYMOUS --operation ALL --cluster
SASL 身份验证错误
如果您已更改 AWS Secrets Manager 密钥的用户名或密码,但旧凭证仍然有效,则会收到身份验证错误。
AWS Secrets Manager 密钥只能与单个用户关联。当用户不再需要访问集群时,必须取消密钥的关联并更新 ACL。
当您更新密钥的用户名时,AWS Secrets Manager 不会自动解除旧用户名的关联。最佳做法是为新用户创建新密钥。如果您需要使用旧密钥,请先解除该密钥的关联,然后更新凭证,之后再次关联该密钥。有关详细信息,请参阅使用用户。
非管理员用户无需授权即可创建和修改 ACL
默认情况下,所有用户都有权创建或修改 ACL。为了防止非管理员用户通过 Apache ZooKeeper 修改 ACL,请将 ZooKeeper 节点放在单独的安全组中。此外,请确保所有 Apache Kafka 命令和客户端连接都通过引导代理运行,而不是 Apache ZooKeeper。
**注意:**您可以使用引导字符串来执行所有 Apache Kafka 操作。
相关信息
Apache Kafka ACL
Scram secrets(Scram 密钥)