Configurar a autenticação SASL

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

  1. No console do Google Cloud , acesse a página IAM.
    Acessar o IAM
  2. Verifique se o projeto está definido como o projeto do consumidor que o cliente do serviço gerenciado para Apache Kafka acessaria.
  3. Clique em Conceder acesso.
  4. Na nova página, em Adicionar principais, insira o endereço de e-mail da conta de serviço que você está usando.
  5. Em Atribuir papéis, selecione o papel Cliente gerenciado do Kafka.
  6. Clique em Salvar.

CLI da gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    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.

  2. 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.

  1. Faça o download de um arquivo JSON de chave de conta de serviço para a conta que você pretende usar no cliente.

  2. 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.txt
    

    Esse comando realiza as ações a seguir:

    • base64 < my_service_account_key.json: lê o conteúdo do arquivo chamado my_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 comando base64 (a versão codificada em base64 do arquivo da sua conta de serviço) para um novo arquivo chamado password.txt.

  3. 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:

  1. O nome de usuário fornecido corresponde à conta de serviço cuja chave é usada na senha.

  2. O principal da conta de serviço fornecida tem a permissão managedkafka.clusters.connect (incluída no papel do IAM roles/managedkafka.client no cluster).

Token de acesso

  1. 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
    
  2. É 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:

  1. O token de acesso é válido e não expirou.

  2. O nome de usuário fornecido corresponde ao e-mail principal associado ao token de acesso.

  3. O principal do token de acesso tem a permissão managedkafka.clusters.connect (incluída no papel do IAM roles/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:

  1. Use o GKE na versão 1.31.1-gke.1241000 ou mais recente.
  2. 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"
    
  3. Se você usa o servidor de autenticação local, verifique se também usa a versão 2.40.3 ou 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.connect no 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.

A seguir

Apache Kafka® é uma marca registrada da The Apache Software Foundation ou afiliadas nos Estados Unidos e/ou em outros países.