Kafka SASL zookeeper аутентификация

Я столкнулся со следующей ошибкой при включении SASL в Zookeeper и аутентификации брокера.

[2017-04-18 15:54:10,476] DEBUG Size of client SASL token: 0 
(org.apache.zookeeper.server.ZooKeeperServer)
[2017-04-18 15:54:10,476] ERROR cnxn.saslServer is null: cnxn object did not initialize its saslServer properly. (org.apache.zookeeper.server.    ZooKeeperServer)
[2017-04-18 15:54:10,478] ERROR SASL authentication failed using login context 'Client'. (org.apache.zookeeper.client.ZooKeeperSaslClient)
[2017-04-18 15:54:10,478] DEBUG Received event: WatchedEvent state:AuthFailed type:None path:null (org.I0Itec.zkclient.ZkClient)
[2017-04-18 15:54:10,478] INFO zookeeper state changed (AuthFailed) (org.I0Itec.zkclient.ZkClient)
[2017-04-18 15:54:10,478] DEBUG Leaving process event (org.I0Itec.zkclient.ZkClient)
[2017-04-18 15:54:10,478] DEBUG Closing ZkClient... (org.I0Itec.zkclient.ZkClient)
[2017-04-18 15:54:10,478] INFO Terminate ZkClient event thread. (org.I0Itec.zkclient.ZkEventThread)
[2017-04-18 15:54:10,478] DEBUG Closing ZooKeeper connected to localhost:2181 (org.I0Itec.zkclient.ZkConnection)
[2017-04-18 15:54:10,478] DEBUG Close called on already closed client (org.apache.zookeeper.ZooKeeper)
[2017-04-18 15:54:10,478] DEBUG Closing ZkClient...done (org.I0Itec.zkclient.ZkClient)
[2017-04-18 15:54:10,480] FATAL Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
org.I0Itec.zkclient.exception.ZkAuthFailedException: Authentication failure
    at org.I0Itec.zkclient.ZkClient.waitForKeeperState(ZkClient.java:947)
    at org.I0Itec.zkclient.ZkClient.waitUntilConnected(ZkClient.java:924)
    at org.I0Itec.zkclient.ZkClient.connect(ZkClient.java:1231)
    at org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:157)
    at org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:131)
    at kafka.utils.ZkUtils$.createZkClientAndConnection(ZkUtils.scala:79)
    at kafka.utils.ZkUtils$.apply(ZkUtils.scala:61)
    at kafka.server.KafkaServer.initZk(KafkaServer.scala:329)
    at kafka.server.KafkaServer.startup(KafkaServer.scala:187)
    at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:39)
    at kafka.Kafka$.main(Kafka.scala:67)
    at kafka.Kafka.main(Kafka.scala)
[2017-04-18 15:54:10,482] INFO shutting down (kafka.server.KafkaServer)

Следующая конфигурация дается в файле JAAS, который передается как KAFKA_OPTS, чтобы принять его как параметр JVM: -

  KafkaServer {
       org.apache.kafka.common.security.plain.PlainLoginModule required
       username="admin"
       password="admin-secret"
       user_admin="admin-secret";
  };

  Client {
      org.apache.kafka.common.security.plain.PlainLoginModule required
      username="admin"
      password="admin-secret";
  };

В server.properties брокера kafka установлены следующие дополнительные поля: -

zookeeper.set.acl=true
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
ssl.client.auth=required
ssl.endpoint.identification.algorithm=HTTPS
ssl.keystore.location=path
ssl.keystore.password=anything
ssl.key.password=anything
ssl.truststore.location=path
ssl.truststore.password=anything

Свойства Zookeeper следующие:

 authProvider.1=org.apache.zookeeper.server.auth.DigestAuthenticationProvider
jaasLoginRenew=3600000
requireClientAuthScheme=sasl

person sunder    schedule 18.04.2017    source источник
comment
Хорошо, я полагаю, вы не используете SSL?   -  person Maximilien Belinga    schedule 18.04.2017
comment
да, мне не нужен ssl между zookeeper и брокером. но ssl настроен для взаимодействия с клиентом kafka.   -  person sunder    schedule 18.04.2017
comment
@ M. Ситуация Я добавил конфигурации ssl, которые я использую для клиента kafka и брокера kafka   -  person sunder    schedule 18.04.2017
comment
Ok. позволь мне увидеть это   -  person Maximilien Belinga    schedule 18.04.2017
comment
@ M. Ситуация любая идея, если мне не хватает какой-то конфигурации. Моя основная цель - защитить связь zookeeper и брокера kafka, а также защитить клиента zookeeper для аутентификации сервера zookeeper.   -  person sunder    schedule 18.04.2017
comment
Можете ли вы повысить уровень лога?   -  person Maximilien Belinga    schedule 18.04.2017
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Maximilien Belinga    schedule 18.04.2017
comment
Я нашел проблему. Позвольте мне опубликовать это.   -  person Maximilien Belinga    schedule 18.04.2017


Ответы (2)


Я обнаружил проблему, увеличив уровень журнала до DEBUG. В основном следуйте инструкциям ниже. Я не использую SSL, но вы без проблем интегрируете его.

Ниже приведены мои файлы конфигурации:

server.properties

security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN

authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
allow.everyone.if.no.acl.found=true
auto.create.topics.enable=false
broker.id=0
listeners=SASL_PLAINTEXT://localhost:9092
advertised.listeners=SASL_PLAINTEXT://localhost:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600

advertised.host.name=localhost
num.partitions=1
num.recovery.threads.per.data.dir=1
log.flush.interval.messages=30000000
log.flush.interval.ms=1800000
log.retention.minutes=30
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
delete.topic.enable=true
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=6000
super.users=User:admin

zookeeper.properties

dataDir=/tmp/zookeeper
clientPort=2181
maxClientCnxns=0
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000

Producer.properties

security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
bootstrap.servers=localhost:9092
compression.type=none

consumer.properties

security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=6000
group.id=test-consumer-group

Теперь самые важные файлы для того, чтобы ваш сервер запускался без каких-либо проблем:

zookeeper_jaas.conf

Server {
   org.apache.kafka.common.security.plain.PlainLoginModule required
   username="admin"
   password="admin-secret"
   user_admin="admin-secret";
};

kafka_server_jaas.conf

KafkaServer {
   org.apache.kafka.common.security.plain.PlainLoginModule required
   username="admin"
   password="admin-secret"
   user_admin="admin-secret";
};

Client {
   org.apache.kafka.common.security.plain.PlainLoginModule required
   username="admin"
   password="admin-secret";
};

После выполнения всех этих настроек в первом окне терминала:

Терминал 1 (запуск сервера Zookeeper)

Из корневого каталога kafka

$ export KAFKA_OPTS="-Djava.security.auth.login.config=/home/usename/Documents/kafka_2.11-0.10.1.0/config/zookeeper_jaas.conf"
$ bin/zookeeper-server-start.sh config/zookeeper.properties

Терминал 2 (запуск сервера Kafka)

Из корневого каталога kafka

$ export KAFKA_OPTS="-Djava.security.auth.login.config=/home/usename/Documents/kafka_2.11-0.10.1.0/config/kafka_server_jaas.conf"
$ bin/kafka-server-start.sh config/server.properties

[НАЧАТЬ ОБНОВЛЕНИЕ]

kafka_client_jaas.conf

KafkaClient {
  org.apache.kafka.common.security.plain.PlainLoginModule required
  username="admin"
  password="admin-secret";
};

Терминал 3 (запуск потребителя Kafka)

В клиентском терминале экспортируйте клиентский jaas conf файл и запустите клиента:

$ export KAFKA_OPTS="-Djava.security.auth.login.config=/home/username/Documents/kafka_2.11-0.10.1.0/kafka_client_jaas.conf"
$ ./bin/kafka-console-consumer.sh --new-consumer --zookeeper localhost:2181 --topic test-topic --from-beginning --consumer.config=config/consumer.properties  --bootstrap-server=localhost:9092

Терминал 4 (запуск продюсера Kafka)

Если вы также хотите производить, сделайте это в другом окне терминала:

$ export KAFKA_OPTS="-Djava.security.auth.login.config=/home/username/Documents/kafka_2.11-0.10.1.0/kafka_client_jaas.conf"
$ ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic --producer.config=config/producer.properties

[КОНЕЦ ОБНОВЛЕНИЯ]

person Maximilien Belinga    schedule 18.04.2017
comment
Ага!! все работало нормально. Большое спасибо за вашу помощь, я боролся с прошлыми 2 днями - person sunder; 18.04.2017
comment
Просто любопытно узнать настоящую причину неудачи. Неужели zookeeper ожидает конфигурации сервера {}? - person sunder; 18.04.2017
comment
Точно. Это была недостающая часть - person Maximilien Belinga; 18.04.2017
comment
любая идея, требуется ли какая-то особая конфигурация для связи производителя и потребителя. Я сталкиваюсь с брокером Bootstrap localhost: ‹port› отключено (org.apache.kafka.clients.NetworkClient) для производителя - person sunder; 20.04.2017
comment
Вы добавили client jaas? Вероятно, это недостающий элемент в ваших вещах. Перед производством или потреблением вам необходимо экспортировать client jaas. - person Maximilien Belinga; 20.04.2017
comment
Где именно должен быть предоставлен этот файл. Вам не кажется, что в kafka_server.jaas есть раздел Client, и экспорта его в параметре java.security.auth.login.config в JVM будет достаточно? В вашем ответе я запускаю производителя в терминале 2, поэтому файл конфигурации уже импортирован. - person sunder; 20.04.2017
comment
Поправьте меня, если я ошибаюсь, но я почувствовал из конфигурации производителя, что он подключается к брокеру kafka, а не напрямую к zookeeper. Итак, в таком случае, зачем производителю этот файл конфигурации? - person sunder; 20.04.2017
comment
Производители / потребители должны пройти аутентификацию, прежде чем пытаться производить / потреблять. Для этого используется клиент jaas. Позвольте мне обновить свой пост, и вы поймете, что я имею в виду - person Maximilien Belinga; 20.04.2017
comment
У вас есть опечатка в вашем файле zookeeper_jaas.conf. Отсутствует точка с запятой в конце user_admin = admin-secret; - person user2687486; 01.08.2017
comment
опечатка kafka_server.jaas - ›kafka_server_jaas.conf - person prehistoricpenguin; 08.11.2018
comment
Спасибо за замечание. Обновлено - person Maximilien Belinga; 12.11.2018
comment
Я сделал это, но получаю одну ошибку: Ошибка аутентификации SASL с использованием контекста входа «Клиент» с исключением: {} (org.apache.zookeeper.client.ZooKeeperSaslClient) javax.security.sasl.SaslException: Ошибка аутентификации с член кворума Zookeeper: saslToken члена кворума имеет значение NULL. Любая помощь? - person Tushar H; 30.01.2019
comment
@ M.Situation Эта конфигурация, которую вы указали, предназначена для zookeeper в пакете kafka, какой должна быть конфигурация для автономного zookeeper? - person Tushar H; 15.02.2019
comment
Я думаю, что ему нужны обновления, я пробовал это и столкнулся с ошибкой, поскольку zookeeper не поддерживает - PlainLoginModule, он использует DigestLoginModule. поэтому изменения заключаются в замене org.apache.kafka.common.security.plain.PlainLoginModule, требуемого org.apache.zookeeper.server.auth.DigestLoginModule, необходимого в zookeeper_jaas.conf и разделе Client в kafka_server_jaas.conf - person Tushar H; 15.02.2019

Вам нужно создать файл конфигурации JAAS для Zookeeper и заставить его использовать его.

Создайте файл конфигурации JAAS для Zookeeper с таким содержимым:

Server {
    org.apache.zookeeper.server.auth.DigestLoginModule required
    user_admin="admin-secret";
};

Где пользователь (admin) и пароль (admin-secret) должны совпадать с именем пользователя и паролем, которые у вас есть в разделе «Клиент» конфигурационного файла Kafka JAAS.

Чтобы Zookeeper использовал конфигурационный файл JAAS, передайте Zookeeper следующий флаг JVM, указывающий на файл, созданный ранее.

-Djava.security.auth.login.config=/path/to/server/jaas/file.conf"

Если вы используете Zookeeper, включенный в пакет Kafka, вы можете запустить Zookeeper следующим образом, предполагая, что ваш файл конфигурации Zookeeper JAAS находится в ./config/zookeeper_jaas.conf

EXTRA_ARGS=-Djava.security.auth.login.config=./config/zookeeper_jaas.conf ./bin/zookeeper-server-start.sh ./config/zookeeper.properties 
person Luciano Afranllie    schedule 18.04.2017
comment
По состоянию на ноябрь 2019 года это самый актуальный и краткий ответ! - person geekQ; 14.11.2019