将用户名和密码身份验证用于 AWS Secrets Manager - Amazon Managed Streaming for Apache Kafka
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

将用户名和密码身份验证用于 AWS Secrets Manager

您可以使用通过 Amazon MSK AWS 存储和保护的用户名和密码,控制对 Secrets Manager 集群的访问。在 Secrets Manager 中存储用户凭证可减少集群身份验证的开销,包括审核、更新和轮换凭证。使用 Secrets Manager 还可以跨集群共享用户凭证。

工作方式

的用户名和密码身份验证使用 SASL/SCRAM(简单身份验证和安全层/加盐质询响应机制)身份验证。Amazon MSK要为集群设置用户名和密码身份验证,请在 AWS Secrets Manager 中创建一个密钥资源,并将用户名和密码与密钥相关联。

SASL/ SCRAM 在 RFC 5802 中定义。SCRAM 使用安全的哈希算法,不会在客户端和服务器之间传输明文密码。

为 Amazon MSK 集群设置 SASL/SCRAM 身份验证

要在 AWS Secrets Manager 中设置密钥,请按照 https://docs.amazonaws.cn/secretsmanager/latest/userguide/tutorials_basic.html 用户指南AWS 中的Secrets Manager创建和检索密钥教程进行操作。

为 Amazon MSK 集群创建密钥时,请注意以下要求:

  • 为密钥类型选择 Other type of secrets (e.g. API key) (其他密钥类型(例如 API 密钥))

  • 您的密钥名称必须具有前缀 AmazonMSK_

  • 您必须使用现有的自定义 AWS KMS 密钥,或者为密钥创建新的自定义 AWS KMS 密钥。默认情况下,Secrets Manager 为密钥使用默认 AWS KMS 密钥。

    重要

    使用默认 AWS KMS 密钥创建的密钥无法用于 Amazon MSK 集群。

  • 您的用户和密码数据必须采用以下格式:

    { "username": "alice", "password": "alice-secret" }
  • 记录您的密钥的 ARN (Amazon 资源名称) 值。

如果使用 AWS CLI 创建密钥,请为 kms-key-id 参数指定密钥 ID 或 ARN。不要指定别名。

要将密钥与集群关联,请使用 Amazon MSK 控制台或 BatchAssociateScramSecret 操作。

操作的以下示例 JSON 输入将密钥与集群关联:BatchAssociateScramSecret

{ "clusterArn" : "arn:aws:kafka:us-west-2:0123456789019:cluster/SalesCluster/abcd1234-abcd-cafe-abab-9876543210ab-4", "secretArnList": [ "arn:aws:secretsmanager:us-west-2:0123456789019:secret:AmazonMSK_MyClusterSecret" ] }

使用用户名和密码连接到集群

在创建密钥并将其与集群关联后,请执行以下操作将客户端连接到集群:

  1. 在您的客户端计算机上,使用密钥中存储的用户凭证创建 JAAS 配置文件。例如,对于用户 alice,创建一个名为 users_jaas.conf 的文件,该文件包含以下内容:

    KafkaClient { org.apache.kafka.common.security.scram.ScramLoginModule required username="alice" password="alice-secret"; };
  2. 使用以下命令将此 JAAS 配置文件导出为 KAFKA_OPTS 环境参数:

    export KAFKA_OPTS=-Djava.security.auth.login.config=<path-to-jaas-file>/users_jaas.conf
  3. 将 JDK 密钥库文件从 JVM 复制到 ./tmp 目录。有关此步骤的详细信息,请参阅第6步: 生成和消耗数据教程中的入门

  4. 使用以下内容创建名为 client_sasl.properties 的客户端属性文件。此文件定义 SASL 机制和协议。

    security.protocol=SASL_SSL sasl.mechanism=SCRAM-SHA-512 ssl.truststore.location=<path-to-keystore-file>/kafka.client.truststore.jks
  5. 运行以下命令,同时替换 ClusterArn 替换为您的集群的 Amazon 资源名称 (ARN):

    aws kafka describe-cluster --region us-west-2 --cluster-arn "ClusterArn"

    从命令的 JSON 结果中,保存与名为“ZookeeperConnectString”的字符串关联的值。

  6. 通过在客户端计算机的 bin 目录中运行以下命令来在集群中创建主题,从而替换 ZookeeperConnectString 替换为您在上一个命令中记录的字符串。

    ./kafka-topics.sh --create --zookeeper ZookeeperConnectString --replication-factor 3 --partitions 1 --topic AWSKafkaTutorialTopic
  7. 运行以下命令,同时替换 ClusterArn 替换为您的集群的 Amazon 资源名称 (ARN):

    aws kafka get-bootstrap-brokers --region us-west-2 --cluster-arn ClusterArn

    从命令的 JSON 结果中,保存与名为“BootstrapBrokerStringSaslScram”的字符串关联的值。

  8. 要生成为您创建的主题,请在客户端计算机的 bin 目录中运行以下命令,并将 BootstrapBrokerStringSaslScram 替换为您在运行上一个命令时获取的值。

    ./kafka-console-producer.sh --broker-list BootstrapBrokerStringSaslScram --topic AWSKafkaTutorialTopic --producer.config client_sasl.properties
  9. 要使用您创建的 主题,请在客户端计算机的 bin 目录中运行以下命令,并将 BootstrapBrokerStringSaslScram 替换为您之前获取的值。

    ./kafka-console-consumer.sh --bootstrap-server BootstrapBrokerStringSaslScram --topic AWSKafkaTutorialTopic --from-beginning --consumer.config client_sasl.properties

使用用户

创建用户: 在密钥中以键/值对形式创建用户。AWS KMS 要求用户名和密码数据采用以下格式:

{ "username": "alice", "password": "alice-secret" }

撤消用户访问权限: 要撤消用户的凭证以访问集群,我们建议您先在集群上删除或实施 ACL,然后取消密钥的关联。这是因为:

  • 删除用户不会关闭现有连接。

  • 对密钥的更改最多需要 10 分钟进行传播。

有关将 ACL 与 Amazon MSK 结合使用的信息,请参阅Apache Kafka ACL

我们建议您限制对 zookeeper 节点的访问,以防止用户修改 ACLs。 有关更多信息,请参阅控制对 Apache ZooKeeper 的访问

Limitations

使用 SCRAM 密钥时,请注意以下限制:

  • Amazon MSK 仅支持 SCRAM-SHA-512 身份验证。

  • 一个 Amazon MSK 集群最多可以有 1000 个用户。

  • 您必须将客户主密钥 (CMK) 与您的密钥结合使用。您不能使用将默认 Secrets Manager 加密密钥用于 Amazon MSK 的密钥。有关创建 CMK 的信息,请参阅创建对称 CMKs

  • 您不能将非对称 CMK 用于 Secrets Manager。

  • 您可以使用 BatchAssociateScramSecret 操作,一次最多可以将 10 个密钥与集群相关联。

  • 与 Amazon MSK 集群关联的密钥的名称必须具有前缀 AmazonMSK_

  • 与 Amazon MSK 集群关联的密钥必须与集群位于相同的 AWS 账户和 AWS 区域中。