Cette rubrique explique comment activer l'authentification LDAP pour EMR Kafka et fournit un exemple détaillé.
Prérequis
Vous avez créé un cluster Dataflow et sélectionné les services Kafka et OpenLDAP. Pour plus d'informations, consultez la rubrique Créer un cluster Dataflow Kafka.
Limites
Cette fonctionnalité est disponible pour les clusters EMR Kafka exécutant EMR V3.44.0 ou version ultérieure, ou EMR V5.10.0 ou version ultérieure.
-
Un service EMR OpenLDAP ou un service LDAP externe est disponible dans le cluster.
Cette rubrique utilise le service EMR OpenLDAP à titre d'exemple.
Précautions
Si vous souhaitez utiliser l'authentification par groupe d'utilisateurs, assurez-vous que la fonctionnalité de superposition memberOf est activée pour le service LDAP ou que l'attribut memberOf est pris en charge pour les utilisateurs LDAP.
Activer l'authentification LDAP
-
Créez un superutilisateur.
RemarqueSi vous avez déjà créé un superutilisateur, ignorez cette étape.
Un superutilisateur Kafka peut accéder à toutes les ressources Kafka. Le superutilisateur gère la communication entre les nœuds broker et les autres composants. Cet exemple utilise le service EMR OpenLDAP pour montrer comment ajouter un superutilisateur Kafka.
Connectez-vous au nœud master-1-1 du cluster via SSH. Pour plus d'informations, consultez la rubrique Se connecter à un cluster.
-
Créez un fichier nommé kafka.ldif avec le contenu suivant.
Cette rubrique utilise la commande
ldappour ajouter un utilisateur LDAP avec l'UIDkafkaet le mot de passekafka-secret.dn: uid=kafka,ou=people,o=emr cn: kafka sn: kafka objectClass: inetOrgPerson userPassword: kafka-secret uid: kafka -
Exécutez la commande suivante pour ajouter l'utilisateur LDAP.
ldapadd -H ldap://master-1-1:10389 -f kafka.ldif -D ${uid} -w ${rootDnPW}Remarque${uid}: valeur du paramètre admin_dn sur la page Configure du service OpenLDAP dans la console EMR.${rootDnPW}: valeur du paramètre admin_pwd sur la page Configure du service OpenLDAP dans la console EMR.10389: port d'écoute du service OpenLDAP.
Après avoir ajouté l'utilisateur, exécutez la commande suivante pour afficher ses informations.
ldapsearch -w ${rootDnPW} -D ${uid} -H ldap://master-1-1:10389 -b uid=kafka,ou=people,o=emr
-
Accédez à la page de configuration de Kafka.
Connectez-vous à la console EMR on ECS.
Dans la barre de navigation supérieure, sélectionnez la région requise et le groupe de ressources.
Dans la colonne Actions du cluster cible, cliquez sur Services.
Sur la page Services, cliquez sur Configure dans la section du service Kafka.
-
Modifiez et enregistrez la configuration.
Sur la page Configure, cliquez sur l'onglet server.properties.
Remplacez la valeur de l'élément de configuration kafka.ssl.config.type par CUSTOM.
Remplacez la valeur de l'élément de configuration authorizer.class.name par kafka.security.ldap.authorizer.SimpleLdapAuthorizer.
-
Enregistrez la configuration.
Cliquez sur Save.
Dans la boîte de dialogue, saisissez une raison dans le champ Execution Reason.
-
Ajoutez et enregistrez des paramètres personnalisés.
Sur l'onglet server.properties, cliquez sur Add Configuration Item.
-
Dans la boîte de dialogue Add Configuration Item, ajoutez les éléments suivants.
Paramètre
Valeur
Description
super.users
User:kafka
kafkaest le nom d'utilisateur que vous avez créé. Remplacez-le si nécessaire.Pour plus d'informations, consultez l'étape 1.
listener.name.${listener}.sasl.enabled.mechanisms
PLAIN
Remplacez ${listener} par le nom d'un écouteur spécifique, tel que
sasl_ssl.listener.name.${listener}.plain.sasl.jaas.config
org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-secret" emr.kafka.security.ldap.user.name.attribute="uid" emr.kafka.security.ldap.user.base.dn="ou=people,o=emr" emr.kafka.security.ldap.group.name.attribute="cn" emr.kafka.security.ldap.group.base.dn="ou=groups,o=emr" emr.kafka.security.ldap.admin.name.attribute="uid" emr.kafka.security.ldap.admin.base.dn="o=emr" emr.kafka.security.ldap.url="ldaps://master-1-1:10636" emr.kafka.security.ldap.bind.user="admin" emr.kafka.security.ldap.bind.user.password="WMMuhh3P" emr.kafka.security.ldap.user.member.of.attribute="memberOf" emr.kafka.security.ldap.group.authorization.support="true" ;Remplacez ${listener} par le nom d'un écouteur spécifique, tel que
sasl_ssl.Vous devez également remplacer les valeurs de configuration LDAP suivantes :
-
username: le superutilisateur utilisé par le service Kafka pour la communication entre les nœuds. -
emr.kafka.security.ldap.user.name.attribute: l'attribut de nom d'utilisateur LDAP utilisé pour obtenir le nom d'utilisateur. -
emr.kafka.security.ldap.user.base.dn: le nom distinctif de base (DN) de l'utilisateur LDAP. -
emr.kafka.security.ldap.group.name.attribute : l'attribut du nom de groupe d'utilisateurs LDAP.
-
emr.kafka.security.ldap.group.base.dn: le DN de base du groupe d'utilisateurs LDAP. -
emr.kafka.security.ldap.admin.name.attribute: l'attribut de l'utilisateur administrateur LDAP. -
emr.kafka.security.ldap.admin.base.dn: le DN de base de l'utilisateur administrateur LDAP. -
emr.kafka.security.ldap.url: l'URL LDAP. -
emr.kafka.security.ldap.bind.user: le nom d'utilisateur de l'administrateur LDAP utilisé pour l'authentification par groupe d'utilisateurs. -
emr.kafka.security.ldap.bind.user.password: le mot de passe de l'administrateur LDAP. -
emr.kafka.security.ldap.user.member.of.attribute: l'attribut indiquant les groupes auxquels appartient un utilisateur. -
emr.kafka.security.ldap.group.authorization.support: indique s'il faut activer l'autorisation de groupe. Si ce paramètre est défini surtrue, un utilisateur hérite des autorisations de ses groupes d'utilisateurs assignés.
listener.name.${listener}.plain.sasl.server.callback.handler.class
kafka.security.ldap.authenticator.LdapAuthenticateCallbackHandler
Remplacez ${listener} par le nom d'un écouteur spécifique, tel que
sasl_ssl.sasl.mechanism.inter.broker.protocol
PLAIN
Aucun
sasl.enabled.mechanisms
PLAIN
Aucun
-
-
Modifiez d'autres paramètres.
Modifiez les configurations suivantes selon vos besoins.
RemarqueVous devez remplacer le nom d'utilisateur et le mot de passe dans la valeur du paramètre kafka.client.jaas.content si nécessaire. Nous vous recommandons d'utiliser le superutilisateur.
Fichier de configuration
Paramètre
Valeur
Description
kafka_client_jaas.conf
kafka.client.jaas.content
KafkaClient { org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-secret"; };La valeur doit se terminer par un point-virgule (;).
schema-registry.properties
schema_registry_opts
-Djava.security.auth.login.config=/etc/taihao-apps/kafka-conf/kafka-conf/kafka_client_jaas.confSi ce paramètre possède déjà une valeur, ajoutez le nouveau contenu.
kafka-rest.properties
kafkarest_opts
-Djava.security.auth.login.config=/etc/taihao-apps/kafka-conf/kafka-conf/kafka_client_jaas.confSi ce paramètre possède déjà une valeur, ajoutez le nouveau contenu.
-
Redémarrez le service Kafka.
Sur la page Configure du service Kafka, choisissez .
Dans la boîte de dialogue qui s'affiche, saisissez une raison pour l'action et cliquez sur OK.
Dans la boîte de dialogue Confirm, cliquez sur OK.
Exemple d'utilisation
Les opérations de cet exemple s'appliquent à Kafka open source 2.4.1. Pour les autres versions de Kafka, consultez la documentation Apache Kafka.
-
Créez des utilisateurs et des groupes d'utilisateurs de test.
-
Si la fonctionnalité de superposition memberOf n'est pas activée pour OpenLDAP, suivez ces étapes pour l'activer.
RemarqueLa méthode de configuration suivante est fournie à titre indicatif uniquement. La méthode d'activation de la superposition memberOf varie selon le service LDAP.
Appliquez cette configuration à tous les nœuds OpenLDAP.
-
Modifiez les paramètres dans tous les fichiers de configuration suivants si nécessaire. Par exemple :
olcModulepath: pour un système d'exploitation 32 bits, le chemin est /usr/lib/openldap.dn: cn=module{0},cn=config: si le répertoire /etc/openldap/slapd.d/cn=config contient déjà un fichier cn=module{0}.ldif, remplacez le numéro aprèsmodulepar 1. S'il contient un fichier cn=module{1}.ldif, remplacez le numéro par 2, et ainsi de suite.dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config: configurez cette valeur en fonction de la valeur olcDatabase dans le répertoire /etc/openldap/slapd.d/cn=config. Par exemple, siolcDatabase={2}hdb.ldifexiste, définissez la valeur surhdb.
-
Exécutez la commande
vim memberof_config.ldifpour créer un nouveau fichier de configuration memberof_config.ldif. Le contenu du fichier est le suivant.dn: cn=module{0},cn=config cn: module{0} objectClass: olcModuleList objectclass: top olcModuleload: memberof.la olcModulePath: /usr/lib64/openldap dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config objectClass: olcConfig objectClass: olcMemberOf objectClass: olcOverlayConfig objectClass: top olcOverlay: memberof olcMemberOfDangling: ignore olcMemberOfRefInt: TRUE olcMemberOfGroupOC: groupOfNames olcMemberOfMemberAD: member olcMemberOfMemberOfAD: memberOf -
Exécutez la commande
vim refint1.ldifpour créer le fichier de configuration refint1.ldif. Le contenu du fichier est le suivant.dn: cn=module{0},cn=config add: olcmoduleload olcmoduleload: refint -
Exécutez la commande
vim refint2.ldifpour créer un nouveau fichier de configuration refint2.ldif avec le contenu suivant.dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config objectClass: olcConfig objectClass: olcOverlayConfig objectClass: olcRefintConfig objectClass: top olcOverlay: refint olcRefintAttribute: memberof member manager owner -
Exécutez les commandes suivantes pour charger les fichiers de configuration.
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f memberof_config.ldif ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif
-
Créez des utilisateurs de test.
Créez un fichier nommé kafka-users.ldif avec le contenu suivant, puis utilisez la commande ldapadd pour ajouter les utilisateurs de test.
dn: uid=kafka-user1,ou=people,o=emr cn: kafka-user1 sn: kafka-user1 uid: kafka-user1 objectClass: inetOrgPerson userPassword: kafka-secret dn: uid=kafka-user2,ou=people,o=emr cn: kafka-user2 sn: kafka-user2 uid: kafka-user2 objectClass: inetOrgPerson userPassword: kafka-secret -
Créez des groupes d'utilisateurs de test.
Créez un fichier nommé kafka-groups.ldif avec le contenu suivant, puis utilisez la commande ldapadd pour ajouter les groupes d'utilisateurs de test.
dn: cn=kafka-group1,ou=groups,o=emr cn: kafka-group1 objectClass: groupOfNames member: uid=kafka-user1,ou=people,o=emr member: uid=kafka-user2,ou=people,o=emr dn: cn=kafka-group2,ou=groups,o=emr cn: kafka-group2 objectClass: groupOfNames member: uid=kafka-user1,ou=people,o=emr -
Sur le serveur où LDAP est en cours d'exécution, exécutez la commande suivante pour vérifier l'attribut
memberOfdes utilisateurs de test.ldapsearch -Q -Y EXTERNAL -H ldapi:/// -b ou=people,o=emr memberOfLa sortie indique que l'attribut
memberOfdekafka-user1inclutkafka-group1etkafka-group2, et que l'attributmemberOfdekafka-user2inclutkafka-group1.
-
-
Créez des fichiers de configuration client.
-
Créez un fichier de configuration client nommé client.properties avec le contenu suivant.
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN #Replace the username and password based on the client identity. sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-secret"; -
Créez un fichier de configuration client nommé kafka-user1.properties avec le contenu suivant.
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN #Replace the username and password based on the client identity. sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka-user1" password="kafka-secret"; -
Créez un fichier de configuration client nommé kafka-user2.properties avec le contenu suivant.
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN #Replace the username and password based on the client identity. sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka-user2" password="kafka-secret";
-
-
Créez un sujet de test nommé test.
kafka-topics.sh --bootstrap-server core-1-1:9092 --command-config client.properties --create --topic test --replication-factor 3 --partitions 2 -
Accordez des autorisations.
Pour plus d'informations sur les commandes d'autorisation, consultez la documentation Authorization and ACLs.
#Permissions for kafka-group2 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-group2 --allow-host "*" --operation All --cluster kafka-cluster kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-group2 --allow-host "*" --operation All --topic test #Permissions for kafka-group1 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --deny-principal User:kafka-group1 --deny-host "*" --operation All --topic test #Permissions for kafka-user1 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --deny-principal User:kafka-user1 --deny-host "*" --operation Read --topic test #Permissions for kafka-user2 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-user2 --allow-host "*" --operation Read --topic testExécutez la commande suivante pour afficher les résultats d'autorisation.
kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --list --topic testLes informations suivantes sont renvoyées :
Current ACLs for resource `Topic:LITERAL:test`: User:kafka-group2 has Allow permission for operations: All from hosts: * User:kafka-user2 has Allow permission for operations: Read from hosts: * User:kafka-user1 has Deny permission for operations: Read from hosts: * User:kafka-group1 has Deny permission for operations: All from hosts: * -
Vérifiez les autorisations.
-
L'utilisateur
kafka-user1peut écrire dans le sujettestviakafka-group2.kafka-console-producer.sh --broker-list core-1-1:9092 --producer.config ./kafka-user1.properties --topic testSaisissez des messages de test à l'invite. L'opération d'écriture réussit.
#Enter test messages after the prompt. >a >b >c >d -
L'utilisateur
kafka-user1ne peut pas lire depuis le sujettest.#Grant permission to the consumer group. kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-user1 --allow-host "*" --operation All --group kka-user1-consumer kafka-console-consumer.sh --bootstrap-server core-1-1:9092 --consumer.config ./kafka-user1.properties --topic test --group kafka-user1-consumerL'authentification échoue et l'utilisateur ne peut pas accéder au sujet
test. -
L'utilisateur
kafka-user2ne peut pas écrire dans le sujettest.kafka-console-producer.sh --broker-list core-1-1:9092 --producer.config ./kafka-user2.properties --topic test #Enter a test message after the prompt. >a #Authentication fails.L'authentification échoue.
-
L'utilisateur
kafka-user2peut lire depuis le sujettest.#Grant permission to the consumer group. kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-user2 --allow-host "*" --operation All --group kafka-user2-consumer kafka-console-consumer.sh --bootstrap-server core-1-1:9092 --consumer.config ./kafka-user2.properties --topic test --group kafka-user2-consumer --from-beginning #Data is consumed as expected.
-