在AWS MSK中启用用户名密码认证及ACL设置

1.     概述

Amazon Managed Streaming for Apache Kafka (Amazon MSK)是亚马逊云推出的一个完全托管、高度可用且安全的Apache Kafka服务。本文讲述了如何在MSK中启用用户名和密码的方式来完成认证,同时也提及了ACL的配置。因为这部分内容和自建的Kafka集群有些不同,所以想通过本文来做个演示。本文步骤基本上按照MSK官方文档,只是增加了截图和例子,方便理解。

2.     创建MSK集群

AmazonMSK使用SASL/SCRAM (Simple Authentication andSecurity Layer/ Salted Challenge Response Mechanism)来完成用户名和密码验证,它的前提是客户端和代理之间需要使用TLS加密。所以在创建MSK集群时,需要选择 客户端和代理之间只允许TLS。此选项无法在创建后修改,所以如果你选择了其他选项,必须要重新创建欣的集群。


在创建过程中选择传输加密,客户端和代理之间 仅允许经TLS加密的流量。


身份验证选择SASL/SCRAM身份验证。



3.     创建KMSKey

AmazonMSK使用Amazon Secret Manager来存储MSK所用的用户名和密码。在设置Secret Manager之前,先要在AmazonKMS(Key Management Service)中创建一个客户托管的Key。KMS是Amazon托管的密钥管理服务。

创建过程采用默认选项即可,如果有特殊权限要求可以后续再改。起名例如 kafka

4.     创建SecretsManager密钥

AmazonSecrets Manager是一项密码管理服务,可以把敏感的密码等信息存放其中,无须在代码中嵌入,只要通过API调用就可以取得,避免在代码中泄露。

AmazonMSK通过Secrets Manager来存储用户名和密码。在创建密码时,注意密钥名称必须具有前缀AmazonMSK_

在Secrets Manager中选择 其他类型的密码,将用户名和密码填入,可以通过JSON格式,也可以通过Key/Value方式。加密的密钥要选择上面创建的KMS密钥(非常重要)。

例如:

{

 "username": "alice",

 "password": "alice-secret"

}






5.     关联密钥到MSK集群

等MSK集群创建完成后,就可以把密码关联到MSK集群了。



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

现在就可以来通过用户名和密码来连接MSK集群了。

请按照以下步骤来完成:

6.1.       运行以下命令,同时替换 ClusterArn 为MSK集群的 Amazon 资源名称 (ARN):

aws kafka describe-cluster --cluster-arn "ClusterArn"

ClusterArn可以在MSK的集群界面查到:

运行命令之后得到该集群的详细信息:

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


6.2.   在客户端计算机上下载相应版本的Kafka程序,具体链接可以查看https://kafka.apache.org/downloads

例如:

wget https://archive.apache.org/dist/kafka/2.6.1/kafka_2.13-2.6.1.tgz

下载完后解压。


6.3.        在客户端计算机上kafka程序的 bin 目录中运行以下命令来在集群中创建主题,替换 ZookeeperConnectString 为之前记录的字符串。如果集群的节点数小于3个,replication-factor要设置小于3.


./kafka-topics.sh --create

--zookeeper ZookeeperConnectString--replication-factor 3 --partitions 1 --topicExampleTopicName



6.4.        在客户端计算机上,创建一个 JAAS 配置文件。例如,对于用户 alice,创建一个名为 users_jaas.conf 的文件,该文件包含以下内容:

KafkaClient {

  org.apache.kafka.common.security.scram.ScramLoginModule required

   username="alice"

   password="alice-secret";

};


6.5.        将此 JAAS 配置文件设置为 KAFKA_OPTS 环境变量:

export KAFKA_OPTS=-Djava.security.auth.login.config=<path-to-jaas-file>/users_jaas.conf


6.6.        将 JDK 密钥库文件从 JVM 复制到用户所需目录。JDK的目录根据安装版本不同可能不同。


cp /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.amzn2.0.1.x86_64/jre/lib/security/cacerts <path-to-keystore-file>/kafka.client.truststore.jks


6.7.       使用以下内容创建名为 client_sasl.properties 的客户端属性文件。此文件定义 SASL 机制和协议,将被用来访问Kafka集群。MSK当前只支持SCRAM-SHA-512认证。


security.protocol=SASL_SSL

sasl.mechanism=SCRAM-SHA-512

ssl.truststore.location=<path-to-keystore-file>/kafka.client.truststore.jks


6.8. 接下来要取得MSK的代理(Broker)地址,替换 ClusterArn 替换为MSK集群的 Amazon 资源名称 (ARN):

aws kafka get-bootstrap-brokers

--cluster-arn ClusterArn


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


6.9.   现在可以通过Producer在Topic中生产数据了。在Kafka客户端的 bin 目录中运行以下命令,并将 BootstrapBrokerStringSaslScram 替换为上一个命令时获取的值。

./kafka-console-producer.sh --broker-list BootstrapBrokerStringSaslScram --topic

ExampleTopicName --producer.config client_sasl.properties


输入任意消息:


6.10.                打开另一窗口来通过Consumer消费该Topic中的消息,在Kafka客户端的 bin 目录中运行以下命令,并将 BootstrapBrokerStringSaslScram 替换为之前获取的值。

./kafka-console-consumer.sh --bootstrap-server BootstrapBrokerStringSaslScram --topic

ExampleTopicName --from-beginning --consumer.config client_sasl.properties

可以看到之前键入的消息:


7.     创建更多用户

上文演示了单个用户的过程,如果需要创建其他用户,请重复步骤3-4来创建Secrets Manager的密钥,并关联到MSK集群。需要注意:

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

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


8.     设置ACL

ACL可以用来控制生产者(Producer),消费者(Consumer)和管理员(admin)对于Topic的权限控制。

Apache Kafka ACLs的格式为“Principal P is [Allowed/Denied] Operation O From Host Hon any Resource R matching ResourcePattern RP”。如果RP与特定资源R不匹配,则R没有关联的ACLs,因此不允许除超级用户之外的任何人访问R。

默认情况下,AmazonMSK会将allow.everyone.if.no.acl.found设置为true。这意味着,如果没有显式设置ACL,则所有委托人都可以访问此资源。只有启用了ACL,才能限制只有授权的委托人才能访问它。


1.  首先将MSK的代理添加到ACL表,以允许它们读取已配置ACL的所有主题。这可以保证代理(Broker节点)可以正常同步。

替换 ZooKeeper-Connection-String 替换为上文取得的连接字符串。

替换Distinguished-Name 替换为集群中任一代理的名字,然后将此第一个点之前的字符串替换为星号 (*)。


bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ZooKeeper-Connection-String --add

--allow-principal "User:CN=Distinguished-Name"

--operation Read --group=* --topic Topic-Name

 


8.2. 要授予某个用户对主题的读访问权,请在客户端计算机上运行以下命令。

bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ZooKeeper-Connection-String --add

--allow-principal "User:CN=Distinguished-Name"

--operation Read --group=* --topic Topic-Name

例如


8.3.      要授予对主题的写访问权,请在客户端计算机上运行以下命令

bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ZooKeeper-Connection-String--add

--allow-principal "User:CN=Distinguished-Name" --operationWrite --topic Topic-Name

例如

8.4.        如果使用未授权的用户,将会出现没有授权的错误,无法读取Topic内容。


9. 结束

本文演示了如何在Amazon MSK中启用用户名和密码验证以及简单的ACL设置,其它未涉及的内容以及更多信息,请参考AmazonWeb Services的MSK官方文档。如有疑问,欢迎探讨。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容