Je fais face à l'erreur suivante lors de l'activation de SASL sur Zookeeper et l'authentification du courtier.
[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)
La configuration suivante est donnée dans le fichier JAAS, qui est passé comme KAFKA_OPTS pour le prendre comme paramètre 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";
};
le serveur.properties du courtier kafka a les champs supplémentaires suivants définis: -
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
Les propriétés de Zookeeper sont les suivantes: -
authProvider.1=org.Apache.zookeeper.server.auth.DigestAuthenticationProvider
jaasLoginRenew=3600000
requireClientAuthScheme=sasl
J'ai trouvé le problème en augmentant le niveau de journalisation à DEBUG. Suivez les étapes ci-dessous. Je n'utilise pas SSL mais vous l'intégrerez sans aucun problème.
Voici mes fichiers de configuration:
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
producteur.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
Voici maintenant les fichiers les plus importants pour faire démarrer votre serveur sans aucun problème:
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";
};
Après avoir fait toutes ces configurations, sur une première fenêtre de terminal:
Terminal 1
Depuis kafka répertoire racine
$ 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
Terminal 2
Depuis kafka répertoire racine
$ 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
[COMMENCER LA MISE À JOUR]
kafka_client_jaas.conf
KafkaClient {
org.Apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-secret";
};
Terminal
Sur un terminal client, exportez le fichier conf du client jaas et démarrez le consommateur:
$ 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
Terminal 4
Si vous souhaitez également produire, faites-le sur une autre fenêtre de terminal:
$ 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
[FIN DE MISE À JOUR]
Vous devez créer un fichier de configuration JAAS pour Zookeeper et le faire l'utiliser.
Créez un fichier de configuration JAAS pour Zookeeper avec un contenu comme celui-ci:
Server {
org.Apache.zookeeper.server.auth.DigestLoginModule required
user_admin="admin-secret";
};
Où l'utilisateur (admin) et le mot de passe (admin-secret) doivent correspondre au nom d'utilisateur et au mot de passe que vous avez dans la section Client du fichier de configuration JAAS Kafka).
Pour que Zookeeper utilise le fichier de configuration JAAS, passez l'indicateur JVM suivant à Zookeeper pointant vers le fichier créé auparavant.
-Djava.security.auth.login.config=/path/to/server/jaas/file.conf"
Si vous utilisez Zookeeper inclus avec Kafka package, vous pouvez lancer Zookeeper comme ceci, en supposant que votre fichier de configuration Jook Zookeeper se trouve dans ./config/zookeeper_jaas.conf
EXTRA_ARGS=-Djava.security.auth.login.config=./config/zookeeper_jaas.conf ./bin/zookeeper-server-start.sh ./config/zookeeper.properties