Kafka 情報まとめ

NO IMAGE

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 でアクセスできます。

未分類カテゴリの最新記事