Cấu hình SASL/SCRAM cho Amazon MSK

Tổng quan

Amazon MSK (Managed Streaming for Apache Kafka) là một dịch vụ SaaS chạy Kafka do Amazon quản lý. Nó chạy phiên bản mã nguồn mở của Kafka do vậy tương thích hoàn toàn với các ứng dụng và plugin mà Apache Kafka community đang hỗ trợ.


      Diagram showing the architecture of an example Amazon MSK Cluster.

Một sơ đồ kiến trúc của Kafka trên AWS (gọi là MSK) như hình trên. Trong đó đáng chú ý có các ZooKeeper và Broker.

  • ZooKeeper: đảm nhận việc quản lý kiến trúc phân tán của hệ thống Kafka, có thể coi ZooKeeper là người vận hành hệ thống, giúp nó hoạt động trơn tru.
  • Broker: là Kafka server để lưu trữ các messages, vì là hệ thống phân tán nên sẽ có nhiều brokers hoạt động cùng nhau đảm bảo không bị mất messages.

Hoạt động của Kafka cluster về cơ bản như mô hình dưới đây

Producers tạo messages và Kafka truyền tải tới consumers

Cấu hình MSK Cluster đối với phương thức xác thực SASL/SCRAM:

SASL/SCRAM là phương thức xác thực phổ biến dùng username/password. Để cấu hình phương thức xác thực này cần cấu hình như sau:

  1. Tạo cluster:
  • Theo hướng dẫn ở link này
  • Phần Encryption: Chọn Only TLS encryption traffic allowed.
  • Phần Authentication: Chọn SASL/SCRAM authentication.

2. Liên kết MSK cluster vừa tạo với 1 secret

  • Trong màn hình console của MSK cluster bấm vào “Associate secrets”
  • Trong màn hình tiếp theo, chọn “Create new secret”
  • Làm theo hướng dẫn, trong đó vào AWS Secret Manager để store new secret với prefix là AmazonMSK_. Phần “Encryption key” chọn “Create new custom AWS KMS key” vì key mặc định không dùng được cho MSK. Phần Key type chọn Symmetric vì MSK không hỗ trợ key Asynmetric (xem phần Limitations https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html)

3. Cấu hình client

3.1. Ở máy client, tạo file config JAAS tên là users_jaas.conf để chứa thông tin authentication của kafka user

KafkaClient {org.apache.kafka.common.security.scram.ScramLoginModule requiredusername="user"password="password";};

3.2. Export JAAS config file

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

3.3. Copy JDK key store file từ JVM vào một thư mục ./tmp, xem thêm tại Step 6: Produce and Consume Data trong phần Getting Started tutorial.

cp /usr/lib/jvm/JDKFolder/jre/lib/security/cacerts /tmp/kafka.client.truststore.jks

3.4. Cũng ở máy client tạo một file client_sasl.properties với nội dung sau

security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-512
ssl.truststore.location=<path-to-keystore-file>/kafka.client.truststore.jks

3.5. Lấy thông tin về MSK cluster với dòng lệnh dưới đây, chú ý thay ClusterArn bằng Amazon Resource Name (ARN) của cluster

aws kafka describe-cluster --region eu-central-1 --cluster-arn "ClusterArn"

Lưu giá trị “ZookeeperConnectString” của kết quả trả về

3.6. Tạo một topic trong MSK cluster bằng cách chạy lện sau trong thư mucj bin của client machine, với ZookeeperConnectString  lấy từ step 3.5

./kafka-topics.sh --create --zookeeper ZookeeperConnectString --replication-factor 3 --partitions 1 --topic AWSKafkaTopic

3.7. Chạy lệnh dưới đây và lưu kết quả “BootstrapBrokerStringSaslScram” trong JSON trả về

aws kafka get-bootstrap-brokers --region eu-central-1 --cluster-arn ClusterArn

3.8. Bây giờ có thể tạo các messages trong topic với lệnh sau, trong đó thay BootstrapBrokerStringSaslScram  với kết quả từ step 3.7

./kafka-console-producer.sh --broker-list BootstrapBrokerStringSaslScram --topic AWSKafka
Topic --producer.config client_sasl.properties

3.9. Nhận các messages ở kafka consumer với lệnh sau

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

Các lưu ý

AWS MSK sử dụng Certificate Manager, mà Certificate Manager lại dùng để tạo ra các Private Certificate Authority cho việc xác thực trong cơ chế xác thực của MSK SASL. Private Certificate Authority có giá khá cao đó là $400 mỗi tháng. Vì vậy bạn nên cân nhắc chi phí khi dùng MSK SASL.

Các topic của AWS MSK mặc định có thể truy cập đối với tất cả các user. Để giới hạn việc truy cập đến các topic cần dùng đến ACLs

Leave a comment