Kafka に関する情報がばらけるのでここにまとめておきます。
Kafka一般
認証
kafka_jaas.conf
KafkaClient { org.apache.kafka.common.security.plain.PlainLoginModule required username="username" password="password"; };
kafka_jaas.conf (scram)
KafkaClient { org.apache.kafka.common.security.scram.ScramLoginModule required username="username" password="password"; };
SASL 認証を利用したアクセス
KAFKA_OPTS に -Djava.security.auth.login.config を指定して各種バイナリを利用します。
デフォルトのディレクトリのものを使う場合
export KAFKA_OPTS=-Djava.security.auth.login.config=/home/bitnami/stack/kafka/config/kafka_jaas.conf
別の場所に配置する場合
export KAFKA_OPTS=-Djava.security.auth.login.config=/home/bitnami/stack/kafka/secrets/kafka_jaas.conf
SASL 認証時のコマンド例
./bin/kafka-topics.sh --bootstrap-server localhost:9092 --command-config ./config/client_sasl_plain.properties --list
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer.config ./config/client_sasl_plain.properties --topic {topic-name}
外部からの SASL 認証
同一インスタンスでなく、別個のインスタンスから Kafka に接続する際、ユーザ名やパスワードが正しいはずなのに次のようなエラーが発生することがあります。
bitnami@ip-10-0-1-114:~/stack/kafka/config$ /home/bitnami/stack/kafka/bin/kafka-topics.sh --bootstrap-server ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:9092 --command-config /home/bitnami/stack/kafka/config/client_plain.properties --list [9999-99-99 99:99:99,999] ERROR [AdminClient clientId=adminclient-1] Connection to node 1001 (localhost/127.0.0.1:9092) failed authentication due to: Authentication failed: Invalid username or password (org.apache.kafka.clients.NetworkClient) [9999-99-99 99:99:99,999] WARN [AdminClient clientId=adminclient-1] Metadata update failed due to authentication error (org.apache.kafka.clients.admin.internals.AdminMetadataManager) org.apache.kafka.common.errors.SaslAuthenticationException: Authentication failed: Invalid username or password Error while executing topic command : Authentication failed: Invalid username or password [9999-99-99 99:99:99,999] ERROR org.apache.kafka.common.errors.SaslAuthenticationException: Authentication failed: Invalid username or password
これは Kafka 側の設定が問題になっている可能性があります。
具体的には server.properties の advertiesed.listener に定義が必要です。
advertised.listeners=PLAINTEXT://:9092
↓
advertised.listeners=PLAINTEXT://{IP}:9092
ここで指定している IP はパブリックなサブネットであればパブリック IP を、プライベートなサブネットであればプライベート IP を指定可能です。
MM2
Topic のクローニング機能です。
↓のサンプルは SCRAM 認証の msk から SASL_PLAIN 認証の bitnami 側へのクローニングです。
clusters = bitnami,msk bitnami.bootstrap.servers = localhost:9092 msk.bootstrap.servers = hostname-1:9096,hostname-2:9096 msk->bitnami.enabled = true msk->bitnami.topics = .* bitnami.security.protocol=SASL_PLAINTEXT bitnami.sasl.mechanism=PLAIN bitnami.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="user" \ password="local-password"; msk.security.protocol=SASL_SSL msk.sasl.mechanism=SCRAM-SHA-512 msk.ssl.truststore.location=/opt/bitnami/java/lib/security/cacerts msk.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \ username="user" \ password="msk-password"; replication.factor=1 checkpoints.topic.replication.factor=1 heartbeats.topic.replication.factor=1 offset-syncs.topic.replication.factor=1 offset.storage.replication.factor=1 status.storage.replication.factor=1 config.storage.replication.factor=1
実行コマンドは次のようになります。
./stack/kafka/bin/connect-mirror-maker.sh ./config/connect-mirror-maker.properties
bitnami
https://docs.bitnami.com/aws/infrastructure/kafka/
サービススクリプト
sudo /opt/bitnami/ctlscript.sh status sudo /opt/bitnami/ctlscript.sh start sudo /opt/bitnami/ctlscript.sh start kafka sudo /opt/bitnami/ctlscript.sh start zookeeper sudo /opt/bitnami/ctlscript.sh restart sudo /opt/bitnami/ctlscript.sh stop
SASL 認証時の kafka_jaas.conf
Path は ~/stack/config/kafka_jaas.conf 固定になります。
stack/scripts/libkafka.sh にて次の記述があるためです。
if [[ ! -f "${KAFKA_CONF_DIR}/kafka_jaas.conf" ]]; then
AWS
Amazon Linux 2 で接続
sudo yum install java-1.8.0 wget https://archive.apache.org/dist/kafka/2.2.1/kafka_2.12-2.2.1.tgz tar -xzf kafka_2.12-2.2.1.tgz
SASL SCRAM 接続の cacerts は /etc/pki/ca-trust/extracted/java/cacerts あたりを利用
server.properties
advertised.listeners 設定
advertised.listeners=INTERNAL://:9092
上記に EC2 のパブリックIPを付与する。
advertised.listeners=INTERNAL://10.0.X.XXX:9092
MSK
ユーザ追加
Secrets Manager を使ってユーザを追加します。
MSKのユーザー情報の Secrets Manager はプレフィックスが「AmazonMSK_」から始まる必要があります。
シークレット情報としては次のように定義します。
{ "username": "nrs", "password": "p@ssword" }
このときの KAFKA_OPTS
export KAFKA_OPTS=-Djava.security.auth.login.config=/home/ec2-user/kafka_2.12-2.2.1/config/kafka_jaas.conf
Amazon Linux による SCRAM-SHA-512 設定
security.protocol=SASL_SSL sasl.mechanism=SCRAM-SHA-512 ssl.truststore.location=/etc/pki/ca-trust/extracted/java/cacerts
SASL SCRAM によるパブリックアクセス
何らかの理由(検証時など)でパブリックアクセスしたい場合にはクラスター構成ファイルで allow.everyone.if.no.acl.found=false の設定が必要です。
この設定を行うとACL設定をしないとアクセスできなくなるため、Kafka Acls の設定が必要になります。
./bin/kafka-acls.sh \ --bootstrap-server {bootstrap-servers} --command-config ./config/client_sasl.properties --list # CN ./bin/kafka-acls.sh \ --bootstrap-server {bootstrap-servers} \ --command-config ./config/client_sasl.properties \ --add \ --allow-principal "User:CN=*{bootstrap-servers-domain}" \ --operation All \ --group=* \ --topic {topic-name} # User ./bin/kafka-acls.sh \ --bootstrap-server {bootstrap-servers} \ --command-config ./config/client_sasl.properties \ --add \ --allow-principal "User:{user-name}" \ --operation All \ --group=* \ --topic {topic-name}
{bootstrap-servers-domain} は bootstrap-servers の後半部分です。
b-6.mytestcluster.67281x.c4.kafka.us-east-1.amazonaws.com なら *.mytestcluster.67281x.c4.kafka.us-east-1.amazonaws.com です。
この設定後、クラスター構成ファイルで allow.everyone.if.no.acl.found=false の設定を追加し、構成の適用を実施します。
その後パブリックアクセスをオンにすると、SASL+SCRAM でアクセスできます。