kafka SASL/SCRAM Неудачная аутентификация

Я попытался добавить безопасность в свой кластер kafka, следовал документации:

Я добавляю пользователя, используя это:

kafka-configs.sh --zookeeper zookeeper1:2181 --alter --add-config 'SCRAM-SHA-256=[password=admin-secret],SCRAM-SHA-512=[password=admin-secret]' --entity-type users --entity-name admin

Я изменяю server.properties:

broker.id=1
listeners=SASL_PLAINTEXT://kafka1:9092
advertised.listeners=SASL_PLAINTEXT://kafka1:9092
sasl.enabled.mechanisms=SCRAM-SHA-256
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
security.inter.broker.protocol=SASL_PLAINTEXT
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
default.replication.factor=3
min.insync.replicas=2
log.dirs=/var/lib/kafka
num.partitions=3
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181/kafka
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0

Создал файл jaas:

KafkaServer {
    org.apache.kafka.common.security.scram.ScramLoginModule required
    username="admin"
    password="admin-secret"
};

Создал файл kafka_opts.sh в /etc/profile.d:

export KAFKA_OPTS=-Djava.security.auth.login.config=/opt/kafka_2.12-2.5.0/config/kafka_server_jaas.conf

Но когда я запускаю kafka, он выдает следующую ошибку:

[2020-05-04 10:54:08,782] INFO [Controller id=1, targetBrokerId=1] Failed authentication with kafka1/kafka1 (Authentication failed during authentication due to invalid credentials with SASL mechanism SCRAM-SHA-256) (org.apache.kafka.common.network.Selector)

Я использую вместо kafka1,kafka2,kafka3,zookeeper1,zookeeper2 и zookeeper3 соответственно ip каждого сервера. Может ли кто-нибудь помочь мне с моей проблемой?

1 ответ

Решение

Моя основная проблема заключалась в такой конфигурации:

zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181/kafka

Эта конфигурация в server.properties была необходима, чтобы иметь порядок в том, как zookeeper создает информацию kafka, но это влияет на то, как мне нужно выполнить команду kafka-configs.sh, поэтому я объясню шаги, которые мне нужно было выполнить

  1. Сначала измените zookeeper.

Я скачал zookeeper с официального сайта https://zookeeper.apache.org/releases.html

Я изменил файл zoo.cfg и добавил конфигурацию безопасности:

tickTime=2000
dataDir=/var/lib/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl

Создаю файл jaas для zookeeper:

Server {
    org.apache.zookeeper.server.auth.DigestLoginModule required
    user_admin="admin_secret";
};

Я создаю файл java.env в / conf / и добавляю следующее:

SERVER_JVMFLAGS="-Djava.security.auth.login.config=/opt/apache-zookeeper-3.6.0-bin/conf/zookeeper_jaas.conf"

С помощью этих файлов вы говорите zookeeper использовать файл jaas, чтобы позволить kafka аутентифицироваться в zookeeper, чтобы убедиться, что zookeeper принимает файл, который вам нужно только запустить:

zkServer.sh print-cmd

он ответит:

/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
"java"  -Dzookeeper.log.dir="/opt/apache-zookeeper-3.6.0-bin/bin/../logs" ........-Djava.security.auth.login.config=/opt/apache-zookeeper-3.6.0-bin/conf/zookeeper_jaas.conf....... "/opt/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg" > "/opt/apache-zookeeper-3.6.0-bin/bin/../logs/zookeeper.out" 2>&1 < /dev/null
  1. Изменить кафку

Скачал кафку с официального сайта https://www.apache.org/dyn/closer.cgi?path=/kafka/2.5.0/kafka_2.12-2.5.0.tgz

Я изменил / добавил в файл server.properties следующую конфигурацию:

listeners=SASL_PLAINTEXT://kafka1:9092
advertised.listeners=SASL_PLAINTEXT://kafka1:9092
sasl.enabled.mechanisms=SCRAM-SHA-256
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
security.inter.broker.protocol=SASL_PLAINTEXT
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
allow.everyone.if.no.acl.found=false
super.users=User:admin

Я создал файл jaas для кафки:

KafkaServer {
    org.apache.kafka.common.security.scram.ScramLoginModule required
    username="admin"
    password="admin_secret";
};
Client {
   org.apache.zookeeper.server.auth.DigestLoginModule required
   username="admin"
   password="admin_secret";
};

Вам необходимо понять одну важную вещь: клиентская часть должна быть такой же, как jaas-файл в zookeeper, а часть KafkaServer предназначена для связи между брокерами.

Также мне нужно сказать kafka, чтобы он использовал файл jaas, это можно сделать, установив переменную KAFKA_OPTS:

export KAFKA_OPTS=-Djava.security.auth.login.config=/opt/kafka_2.12-2.5.0/config/kafka_server_jaas.conf
  1. Создайте пользователя admin для брокеров kafka

Выполните следующую команду:

kafka-configs.sh --zookeeper zookeeper:2181/kafka --alter --add-config 'SCRAM-SHA-256=[password=admin_secret]' --entity-type users --entity-name admin

Как я упоминал ранее, моя ошибка заключалась в том, что я не добавлял часть / kafka в ip zookeeper (обратите внимание, что все, что использует zookeeper, должно будет добавить часть / kafka в конце ip), теперь, если вы запустите zookeeper и кафка все будет отлично работать.

Другие вопросы по тегам