Este tópico descreve como ativar a autenticação LDAP para o EMR Kafka e fornece um exemplo detalhado.
Pré-requisitos
Crie um cluster Dataflow e selecione os services Kafka e OpenLDAP. Para mais informações, consulte Create a Dataflow Kafka cluster.
Limites
Este recurso está disponível para clusters EMR Kafka que executam EMR V3.44.0 ou posterior, ou EMR V5.10.0 ou posterior.
-
Um service EMR OpenLDAP ou um service LDAP externo deve estar disponível no cluster.
Este tópico usa o service EMR OpenLDAP como exemplo.
Precauções
Para usar a autenticação por grupo de usuários, certifique-se de que o recurso memberOf overlay esteja ativado para o service LDAP ou que o atributo memberOf seja compatível com os usuários LDAP.
Ativar a autenticação LDAP
-
Crie um superusuário.
NotaSe você já criou um superusuário, ignore esta etapa.
Um superusuário do Kafka pode acessar todos os recursos do Kafka. O superusuário gerencia a comunicação entre os nós broker e os demais componentes. Este exemplo usa o service EMR OpenLDAP para demonstrar como adicionar um superusuário do Kafka.
Conecte-se ao nó master-1-1 do cluster via SSH. Para mais informações, consulte Log on to a cluster.
-
Crie um arquivo chamado kafka.ldif com o conteúdo a seguir.
Este tópico usa o comando
ldappara adicionar um usuário LDAP com o UIDkafkae a senhakafka-secret.dn: uid=kafka,ou=people,o=emr cn: kafka sn: kafka objectClass: inetOrgPerson userPassword: kafka-secret uid: kafka -
Execute o comando a seguir para adicionar o usuário LDAP.
ldapadd -H ldap://master-1-1:10389 -f kafka.ldif -D ${uid} -w ${rootDnPW}Nota${uid}: O valor do parâmetro admin_dn na página Configure do service OpenLDAP no console do EMR.${rootDnPW}: O valor do parâmetro admin_pwd na página Configure do service OpenLDAP no console do EMR.10389: A porta de escuta do service OpenLDAP.
Após adicionar o usuário, execute o comando a seguir para visualizar suas informações.
ldapsearch -w ${rootDnPW} -D ${uid} -H ldap://master-1-1:10389 -b uid=kafka,ou=people,o=emr
-
Acesse a página de configuração do Kafka.
Acesse o EMR on ECS console.
Na barra de navegação superior, selecione a região necessária e o grupo de recursos.
Na coluna Actions do cluster de destino, clique em Services.
Na página Services, clique em Configure na seção do service Kafka.
-
Modifique e salve a configuração.
Na página Configure, clique na aba server.properties.
Altere o valor do item de configuração kafka.ssl.config.type para CUSTOM.
Altere o valor do item de configuração authorizer.class.name para kafka.security.ldap.authorizer.SimpleLdapAuthorizer.
-
Salve a configuração.
Clique em Save.
Na caixa de diálogo, insira um motivo no campo Execution Reason.
-
Adicione e salve parâmetros personalizados.
Na aba server.properties, clique em Add Configuration Item.
-
Na caixa de diálogo Add Configuration Item, adicione os itens a seguir.
Parameter
Value
Descrição
super.users
User:kafka
kafkaé o nome de usuário que você criou. Substitua conforme necessário.Para mais informações, consulte Step 1.
listener.name.${listener}.sasl.enabled.mechanisms
PLAIN
Substitua ${listener} pelo nome de um listener específico, como
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" ;Substitua ${listener} pelo nome de um listener específico, como
sasl_ssl.Substitua também os seguintes valores de configuração relacionados ao LDAP:
-
username: O superusuário que o service Kafka usa para a comunicação entre os nós. -
emr.kafka.security.ldap.user.name.attribute: O atributo de nome de usuário LDAP usado para obter o nome de usuário. -
emr.kafka.security.ldap.user.base.dn: O distinguished name (DN) base do usuário LDAP. -
emr.kafka.security.ldap.group.name.attribute: O atributo do nome do grupo de usuários LDAP.
-
emr.kafka.security.ldap.group.base.dn: O DN base do grupo de usuários LDAP. -
emr.kafka.security.ldap.admin.name.attribute: O atributo do usuário administrador LDAP. -
emr.kafka.security.ldap.admin.base.dn: O DN base do usuário administrador LDAP. -
emr.kafka.security.ldap.url: A URL do LDAP. -
emr.kafka.security.ldap.bind.user: O nome de usuário do administrador LDAP usado para autenticação de grupo de usuários. -
emr.kafka.security.ldap.bind.user.password: A senha do administrador LDAP. -
emr.kafka.security.ldap.user.member.of.attribute: O atributo que indica os grupos aos quais um usuário pertence. -
emr.kafka.security.ldap.group.authorization.support: Especifica se a autorização por grupo deve ser ativada. Quando este parâmetro é definido comotrue, o usuário herda as permissões dos grupos de usuários aos quais está atribuído.
listener.name.${listener}.plain.sasl.server.callback.handler.class
kafka.security.ldap.authenticator.LdapAuthenticateCallbackHandler
Substitua ${listener} pelo nome de um listener específico, como
sasl_ssl.sasl.mechanism.inter.broker.protocol
PLAIN
Nenhum
sasl.enabled.mechanisms
PLAIN
Nenhum
-
-
Modifique os demais parâmetros.
Ajuste as configurações a seguir conforme suas necessidades.
NotaSubstitua o nome de usuário e a senha no valor do parâmetro kafka.client.jaas.content conforme necessário. Recomenda-se usar o superusuário.
Arquivo de configuração
Parameter
Value
Descrição
kafka_client_jaas.conf
kafka.client.jaas.content
KafkaClient { org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-secret"; };O valor deve terminar com ponto e vírgula (;).
schema-registry.properties
schema_registry_opts
-Djava.security.auth.login.config=/etc/taihao-apps/kafka-conf/kafka-conf/kafka_client_jaas.confSe este parâmetro já tiver um valor, acrescente o novo conteúdo ao final.
kafka-rest.properties
kafkarest_opts
-Djava.security.auth.login.config=/etc/taihao-apps/kafka-conf/kafka-conf/kafka_client_jaas.confSe este parâmetro já tiver um valor, acrescente o novo conteúdo ao final.
-
Reinicie o service Kafka.
Na página Configure do service Kafka, escolha .
Na caixa de diálogo exibida, insira um motivo para a ação e clique em OK.
Na caixa de diálogo Confirm, clique em OK.
Exemplo de uso
As operações deste exemplo aplicam-se ao Kafka open source 2.4.1. Para outras versões do Kafka, consulte Apache Kafka.
-
Crie usuários e grupos de usuários de teste.
-
Se o recurso memberOf overlay não estiver ativado para o OpenLDAP, siga estas etapas para ativá-lo.
NotaO método de configuração a seguir é apenas uma referência. O procedimento para ativar o memberOf overlay varia conforme o service LDAP.
Aplique esta configuração a todos os nós OpenLDAP.
-
Ajuste os parâmetros em todos os arquivos de configuração a seguir conforme necessário. Por exemplo:
olcModulepath: Em sistemas operacionais de 32 bits, o caminho é /usr/lib/openldap.dn: cn=module{0},cn=config: Se o diretório /etc/openldap/slapd.d/cn=config já contiver um arquivo cn=module{0}.ldif, altere o número apósmodulepara 1. Se contiver um arquivo cn=module{1}.ldif, altere o número para 2, e assim por diante.dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config: Configure este valor com base no valor de olcDatabase no diretório /etc/openldap/slapd.d/cn=config. Por exemplo, seolcDatabase={2}hdb.ldifexistir, defina o valor comohdb.
-
Execute o comando
vim memberof_config.ldifpara criar um novo arquivo de configuração memberof_config.ldif. O conteúdo do arquivo é o seguinte.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 -
Execute o comando
vim refint1.ldifpara criar o arquivo de configuração refint1.ldif. O conteúdo do arquivo é o seguinte.dn: cn=module{0},cn=config add: olcmoduleload olcmoduleload: refint -
Execute o comando
vim refint2.ldifpara criar um novo arquivo de configuração refint2.ldif com o seguinte conteúdo.dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config objectClass: olcConfig objectClass: olcOverlayConfig objectClass: olcRefintConfig objectClass: top olcOverlay: refint olcRefintAttribute: memberof member manager owner -
Execute os comandos a seguir para carregar os arquivos de configuração.
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
-
Crie usuários de teste.
Crie um arquivo chamado kafka-users.ldif com o conteúdo a seguir e, em seguida, use o comando ldapadd para adicionar os usuários de teste.
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 -
Crie grupos de usuários de teste.
Crie um arquivo chamado kafka-groups.ldif com o conteúdo a seguir e, em seguida, use o comando ldapadd para adicionar os grupos de usuários de teste.
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 -
No servidor onde o LDAP está em execução, execute o comando a seguir para verificar o atributo
memberOfdos usuários de teste.ldapsearch -Q -Y EXTERNAL -H ldapi:/// -b ou=people,o=emr memberOfO resultado indica que o atributo
memberOfdekafka-user1incluikafka-group1ekafka-group2, e que o atributomemberOfdekafka-user2incluikafka-group1.
-
-
Crie arquivos de configuração do cliente.
-
Crie um arquivo de configuração do cliente chamado client.properties com o seguinte conteúdo.
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"; -
Crie um arquivo de configuração do cliente chamado kafka-user1.properties com o seguinte conteúdo.
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"; -
Crie um arquivo de configuração do cliente chamado kafka-user2.properties com o seguinte conteúdo.
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";
-
-
Crie um tópico de teste chamado test.
kafka-topics.sh --bootstrap-server core-1-1:9092 --command-config client.properties --create --topic test --replication-factor 3 --partitions 2 -
Conceda permissões.
Para mais informações sobre os comandos de autorização, consulte 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 testExecute o comando a seguir para visualizar os resultados da autorização.
kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --list --topic testAs seguintes informações são retornadas:
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: * -
Verifique as permissões.
-
O usuário
kafka-user1consegue gravar no tópicotestpor meio dokafka-group2.kafka-console-producer.sh --broker-list core-1-1:9092 --producer.config ./kafka-user1.properties --topic testInsira mensagens de teste no prompt. A operação de gravação é concluída com sucesso.
#Enter test messages after the prompt. >a >b >c >d -
O usuário
kafka-user1não consegue ler do tópicotest.#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-consumerA autenticação falha e o usuário não consegue acessar o tópico
test. -
O usuário
kafka-user2não consegue gravar no tópicotest.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.A autenticação falha.
-
O usuário
kafka-user2consegue ler do tópicotest.#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.
-