Os clientes podem se conectar aos clusters do Serviço gerenciado para Apache Kafka usando a API Apache Kafka de código aberto. Todas as conexões precisam ser criptografadas usando TLS. A comunicação em texto simples não é aceita. A autenticação é processada por um de dois mecanismos compatíveis, cada um com um tipo de credencial diferente: SASL ou mTLS.
Neste documento, descrevemos como fazer a autenticação usando o método SASL. Os clientes são autenticados usando as credenciais de um principal autorizado do Identity and Access Management, como uma conta de serviço. O Serviço Gerenciado para Apache Kafka gerencia os certificados de agente do lado do servidor para todas as conexões.
Antes de começar
Saiba mais sobre estes assuntos:
Conceder o papel de cliente do Kafka gerenciado à conta de serviço
Conceda o papel do IAM roles/managedkafka.client no projeto que contém o cluster à conta de serviço que você vai usar para se conectar a ele.
O papel de cliente do Managed Kafka inclui a permissão
managedkafka.clusters.connect necessária para todas as conexões.
Para conceder o papel de cliente do Kafka gerenciado à conta de serviço,
siga estas etapas:
Console
- No console do Google Cloud , acesse a página IAM.
Acessar o IAM - Verifique se o projeto está definido como o projeto do consumidor que o cliente do serviço gerenciado para Apache Kafka acessaria.
- Clique em Conceder acesso.
- Na nova página, em Adicionar principais, insira o endereço de e-mail da conta de serviço que você está usando.
- Em Atribuir papéis, selecione o papel Cliente gerenciado do Kafka.
- Clique em Salvar.
CLI da gcloud
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
-
Execute o comando
gcloud projects add-iam-policy-binding:gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT_EMAIL \ --role roles/managedkafka.client
Substitua:
-
PROJECT_ID é o ID do projeto.
-
SERVICE_ACCOUNT_EMAIL é o endereço de e-mail da conta de serviço.
-
Configure o cliente Kafka para autenticar em Google Cloud
É possível autenticar clientes do Kafka no Google Cloud usando um dos seguintes mecanismos:
OAUTHBEARER (recomendado): esse mecanismo exige o uso de Application Default Credentials (ADC). O ADC é uma estratégia usada pelas bibliotecas de autenticação do Google para encontrar credenciais automaticamente com base no ambiente do aplicativo. Para mais informações sobre onde o ADC procura credenciais e em que ordem, consulte Como o Application Default Credentials funciona.
SASL/PLAIN: esse mecanismo exige o uso de um nome de usuário e uma senha que podem ser derivados de um arquivo JSON de chave de conta de serviço ou de um token de acesso.
Em geral, OAUTHBEARER é a opção recomendada. No entanto, o SASL/PLAIN pode ser um mecanismo mais conveniente para testes.
Autenticação OAuthBearer
Para informações sobre como autenticar na API Kafka de código aberto, consulte a documentação no GitHub.
Autenticação SASL/PLAIN
O Serviço gerenciado para Apache Kafka oferece suporte à autenticação SASL/PLAIN com um arquivo JSON de chave de conta de serviço ou um token de acesso.
Arquivo JSON da chave da conta de serviço
Esse método é aplicável a todos os clientes do Kafka.
Faça o download de um arquivo JSON de chave de conta de serviço para a conta que você pretende usar no cliente.
Codifique o arquivo da conta de serviço usando base64-encode para usar como sua string de autenticação. Suponha que o nome do arquivo seja
my_service_account_key.json.Em sistemas Linux ou macOS, use o comando
base64(geralmente instalado por padrão) da seguinte maneira:base64 -w 0 < my_service_account_key.json > password.txtEsse comando realiza as ações a seguir:
base64 < my_service_account_key.json: lê o conteúdo do arquivo chamadomy_service_account_key.json.Codifica o conteúdo do arquivo usando a codificação base64. A codificação Base64 é uma maneira de representar dados binários (como dados JSON no arquivo da sua conta de serviço) como texto ASCII. Isso geralmente é usado para transmitir dados por canais projetados para texto.
> password.txt: redireciona a saída do comandobase64(a versão codificada em base64 do arquivo da sua conta de serviço) para um novo arquivo chamadopassword.txt.
Use o conteúdo do arquivo de senha para autenticação com os seguintes parâmetros.
security.protocol=SASL_SSL sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="SERVICE_ACCOUNT_EMAIL_ADDRESS" \ password="CONTENTS_OF_BASE64_ENCODED_PASSWORD_FILE";Substitua:
SERVICE_ACCOUNT_EMAIL_ADDRESS: o endereço de e-mail da conta de serviço que você quer usar para autenticação.CONTENTS_OF_BASE64_ENCODED_PASSWORD_FILE: o conteúdo do arquivo de senha codificado em base64 que você recebeu na etapa anterior. Precisa ser uma única linha.
Ao autenticar conexões recebidas para o cluster, o serviço gerenciado para Apache Kafka verifica o seguinte:
O nome de usuário fornecido corresponde à conta de serviço cuja chave é usada na senha.
O principal da conta de serviço fornecida tem a permissão
managedkafka.clusters.connect(incluída no papel do IAMroles/managedkafka.clientno cluster).
Token de acesso
Receba um token de acesso para o principal que você quer usar na autenticação. Por exemplo, receba um token de acesso para o principal atual da CLI gcloud:
gcloud auth print-access-tokenÉ possível usar o token de acesso para autenticação com os seguintes parâmetros.
security.protocol=SASL_SSL sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="PRINCIPAL_EMAIL_ADDRESS" \ password="ACCESS_TOKEN_VALUE";Substitua:
PRINCIPAL_EMAIL_ADDRESS: o endereço de e-mail do principal que você usou para receber o token de acesso.ACCESS_TOKEN_VALUE: o valor do token de acesso que você recebeu na etapa anterior.
Ao autenticar conexões recebidas para o cluster, o serviço gerenciado para Apache Kafka verifica o seguinte:
O token de acesso é válido e não expirou.
O nome de usuário fornecido corresponde ao e-mail principal associado ao token de acesso.
O principal do token de acesso tem a permissão
managedkafka.clusters.connect(incluída no papel do IAMroles/managedkafka.client) no cluster.
Federação de identidade da carga de trabalho para o GKE
O Serviço gerenciado para Apache Kafka é compatível com a autenticação na API de código aberto do Apache Kafka usando a federação de identidade da carga de trabalho para o GKE. A autenticação é compatível com SASL/PLAIN e SASL/OAUTHBEARER.
Para usar a federação de identidade da carga de trabalho do GKE com o Managed Service para Apache Kafka, é necessário atender aos seguintes requisitos:
- Use o GKE na versão
1.31.1-gke.1241000ou mais recente. Anote sua conta de serviço do Kubernetes com
iam.gke.io/return-principal-id-as-email: "true". Exemplo:apiVersion: v1 kind: ServiceAccount metadata: name: kafka-service-account annotations: iam.gke.io/return-principal-id-as-email: "true"Se você usa o servidor de autenticação local, verifique se também usa a versão
2.40.3ou mais recente do pacote google-auth.
Verifique se o principal do GKE tem a permissão
managedkafka.clusters.connect (incluída no papel do IAM
roles/managedkafka.client).
O Serviço gerenciado para Apache Kafka não oferece suporte à autenticação na API Apache Kafka de código aberto usando a identidade da carga de trabalho da frota. Como alternativa, é possível vincular sua conta de serviço do Kubernetes a uma conta de serviço do IAM.
Resolver erros de autenticação
Se um cliente do Serviço gerenciado para Apache Kafka não conseguir se autenticar no Serviço gerenciado para Apache Kafka, uma mensagem de erro semelhante a esta vai aparecer:
Exception in thread "main" java.util.concurrent.ExecutionException:
org.apache.kafka.common.errors.SaslAuthenticationException:
Authentication failed: Invalid username or password
Para resolver o problema, verifique as seguintes causas:
A senha está malformada e não representa um blob JSON de chave de conta de serviço válido quando decodificado em base64 ou um token de acesso válido.
O principal de autenticação não tem a permissão
managedkafka.clusters.connectno cluster.O nome de usuário fornecido não corresponde ao principal da credencial.
Se um cliente tiver desconexões frequentes a cada 30 minutos, isso pode ser
porque ele não oferece suporte à reautenticação periódica.
Os agentes do Serviço Gerenciado para Apache Kafka exigem que os clientes se autentiquem novamente a cada
30 minutos, o que é imposto pela propriedade do agente connections.max.reauth.ms.
Verifique se a versão da biblioteca de cliente do Kafka é 2.2.0 ou mais recente e se ela oferece suporte à
reautenticação.