Не удается настроить Kerberized брокер Kafka: Ошибка при аутентификации с помощью члена кворума Zookeeper: saslToken члена кворума имеет значение null - PullRequest
0 голосов
/ 28 февраля 2020

Итак, я пытался настроить брокер kafka и zookeeper на одном узле с включенным Kerberos.

Большая часть его основана на этом уроке: https://qiita.com/visualskyrim/items/8f48ff107232f0befa5a

Система: Ubuntu 18.04 Настройка: экземпляр zoopeeker и процесс брокера kafka в одной коробке EC2, A KD C в другой коробке EC2. Оба в одной группе безопасности с открытыми портами по UDP 88.

Вот что я сделал до сих пор.

  1. Загрузил брокер kafka отсюда: https://kafka.apache.org/downloads
  2. Создал KD C и правильно сгенерированную таблицу ключей (проверено с помощью kinit -t). Затем определил файл krb5_config и записи хоста для файла kd c в файле / etc / hosts.
  3. Создано два конфига jaas

cat zookeeper_jaas.conf

Server {
  com.sun.security.auth.module.Krb5LoginModule required debug=true
  useKeyTab=true
  keyTab="/etc/kafka/zookeeper.keytab"
  storeKey=true
  useTicketCache=false
  principal="zookeeper";
};

cat kafka_jaas.conf

cat /etc/kafka/kafka_jaas.conf
KafkaServer {
  com.sun.security.auth.module.Krb5LoginModule required debug=true
  useKeyTab=true
  useTicketCache=false
  storeKey=true
  keyTab="/etc/kafka/kafka.keytab"
  principal="kafka";
};

Client {
  com.sun.security.auth.module.Krb5LoginModule required debug=true
  useKeyTab=true
  storeKey=true
  useTicketCache=false
  keyTab="/etc/kafka/kafka.keytab"
  principal="kafka";
};
Добавлены некоторые строки в конфиг брокера kafka.

В файле config / zookeeper добавлены эти дополнительные строки

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
kerberos.removeHostFromPrincipal=true
kerberos.removeRealmFromPrincipal=true

, а в файле config / server.properties (файл конфигурации для брокера) добавлены эти дополнительные строки

listeners=SASL_PLAINTEXT://kafka.com:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.enabled.mechanism=GSSAPI
sasl.kerberos.service.name=kafka

В одном сеансе экрана я делаю

5. export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/etc/kafka/zookeeper_jaas.conf -Dsun.security.krb5.debug=true"

, а затем запускаю

bin/zookeeper-server-start.sh config/zookeeper.properties

И это правильно работает, и Zookeeper запускается.

В другом сеансе экрана я делаю

6. export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/etc/kafka/kafka_jaas.conf -Dsun.security.krb5.debug=true"

, а затем запускаю

bin/kafka-server-start.sh config/server.properties

Но этот сбой, за исключением этого

[2020-02-27 22:56:04,724] ERROR SASL authentication failed using login context 'Client' with 
exception: {} (org.apache.zookeeper.client.ZooKeeperSaslClient)
javax.security.sasl.SaslException: Error in authenticating with a Zookeeper Quorum member: 
the quorum member's saslToken is null.
        at org.apache.zookeeper.client.ZooKeeperSaslClient.createSaslToken(ZooKeeperSaslClient.java:279)
    at org.apache.zookeeper.client.ZooKeeperSaslClient.respondToServer(ZooKeeperSaslClient.java:242)
    at org.apache.zookeeper.ClientCnxn$SendThread.readResponse(ClientCnxn.java:805)
    at org.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:94)
    at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:366)
    at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141)
[2020-02-27 22:56:04,726] ERROR [ZooKeeperClient Kafka server] Auth failed. 
(kafka.zookeeper.ZooKeeperClient)
[2020-02-27 22:56:04,842] ERROR Fatal error during KafkaServer startup. Prepare to shutdown 
(kafka.server.KafkaServer)
org.apache.zookeeper.KeeperException$AuthFailedException: KeeperErrorCode = AuthFailed for 
/consumers
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:126)
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:54)
    at kafka.zookeeper.AsyncResponse.maybeThrow(ZooKeeperClient.scala:560)
    at kafka.zk.KafkaZkClient.createRecursive(KafkaZkClient.scala:1610)
    at kafka.zk.KafkaZkClient.makeSurePersistentPathExists(KafkaZkClient.scala:1532)
    at kafka.zk.KafkaZkClient.$anonfun$createTopLevelPaths$1(KafkaZkClient.scala:1524)
    at kafka.zk.KafkaZkClient.$anonfun$createTopLevelPaths$1$adapted(KafkaZkClient.scala:1524)
    at scala.collection.immutable.List.foreach(List.scala:392)
    at kafka.zk.KafkaZkClient.createTopLevelPaths(KafkaZkClient.scala:1524)
    at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:388)
    at kafka.server.KafkaServer.startup(KafkaServer.scala:207)
    at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38)
    at kafka.Kafka$.main(Kafka.scala:84)
    at kafka.Kafka.main(Kafka.scala)

Я также включил журналы отладки Kerberos

Это был журнал учетных данных для Kerberos

ОТЛАДКА: ---- Учетные данные ----
клиент : kafka@VISUALSKYRIM
сервер: zookeeper / localhost@VISUALSKYRIM
билет: имя: zookeeper / localhost@VISUALSKYRIM
endTime: 1582881662000
---- конец учетных данных ----

Это подразумевает, что клиентский jaas config каким-то образом является проблемой, и проблема возникает из этой строки кода: https://github.com/apache/zookeeper/blob/master/zookeeper-server/src/main/java/org/apache/zookeeper/client/ZooKeeperSaslClient.java#L310, но я не могу на всю жизнь выяснить Почему. Я перекрестно сослался на него со слитными документами и https://docs.confluent.io/2.0.0/kafka/sasl.html, и, похоже, я поступаю правильно. Так что же дает?

Может кто-нибудь помочь мне с этим? Спасибо.

1 Ответ

0 голосов
/ 28 февраля 2020

Хорошо получается, что Кафка неявно полагает, что принципал zookeeper равен

zookeeper/localhost

Чтобы добиться прогресса, я

  1. Создал принципал zookeeper / localhost в KD C.
  2. Создана таблица ключей для этого, которая называется zookeeper-server.keyta
  3. Обновлена ​​конфигурация zakeeper jaas:

    Server {com.sun.security.auth.module .Krb5LoginModule требуется debug = true useKeyTab = true keyTab = "/ etc / kafka / zookeeper-server.keytab" storeKey = true useTicketCache = false Principal = "zookeeper / localhost"; };

Который больше не показывает эту ошибку.

Кажется, что производитель kafka выбирает имена участников-служб на основе моего / etc / hosts config

# Replace there keberos KDC server IP with the appropriate IP addresses
172.31.40.220 kerberos.com
127.0.0.1 localhost
...