Configura la autenticación SASL

Los clientes pueden conectarse a los clústeres de Managed Service para Apache Kafka con la API de Apache Kafka de código abierto. Todas las conexiones deben encriptarse con TLS. No se admite la comunicación de texto sin formato. La autenticación se controla a través de uno de los dos mecanismos compatibles, cada uno con un tipo de credencial diferente: SASL o mTLS.

En este documento, se describe cómo autenticarse con el método SASL. Los clientes se autentican con las credenciales de una principal autorizada de Identity and Access Management, como una cuenta de servicio. Managed Service para Apache Kafka administra los certificados del agente del servidor para todas las conexiones.

Antes de comenzar

Obtén más información sobre los siguientes temas:

Otorga el rol de cliente de Kafka administrado a la cuenta de servicio

Debes otorgar el rol de IAM roles/managedkafka.client en el proyecto que contiene el clúster a la cuenta de servicio que usarás para conectarte al clúster.

El rol de cliente de Kafka administrado incluye el permiso managedkafka.clusters.connect que se requiere para todas las conexiones. Para otorgar el rol de cliente de Kafka administrado a la cuenta de servicio, sigue estos pasos:

Console

  1. En la consola de Google Cloud , dirígete a la página IAM.
    Ir a IAM
  2. Verifica que el proyecto esté configurado como el proyecto de consumidor al que accederá el cliente de Managed Service for Apache Kafka.
  3. Haz clic en Otorgar acceso.
  4. En la página nueva, en Agregar principales, ingresa la dirección de correo electrónico de la cuenta de servicio que estás usando.
  5. En Asignar roles, selecciona el rol Cliente de Kafka administrado.
  6. Haz clic en Guardar.

gcloud CLI

  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. Ejecuta el comando gcloud projects add-iam-policy-binding:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member serviceAccount:SERVICE_ACCOUNT_EMAIL \
      --role roles/managedkafka.client

    Reemplaza lo siguiente:

    • PROJECT_ID es el ID del proyecto.

    • SERVICE_ACCOUNT_EMAIL es la dirección de correo electrónico de la cuenta de servicio.

Configura el cliente de Kafka para la autenticación en Google Cloud

Puedes autenticar clientes de Kafka en Google Cloud con uno de los siguientes mecanismos:

OAUTHBEARER (recomendado): Este mecanismo requiere el uso de credenciales predeterminadas de la aplicación (ADC). ADC es una estrategia que usan las bibliotecas de autenticación para encontrar credenciales automáticamente según el entorno de la aplicación. Para obtener más información sobre dónde ADC busca credenciales y en qué orden, consulta Cómo funcionan las credenciales predeterminadas de la aplicación.

SASL/PLAIN: Este mecanismo requiere el uso de un nombre de usuario y una contraseña que se pueden derivar de un archivo JSON de clave de cuenta de servicio o de un token de acceso.

En general, OAUTHBEARER es la opción recomendada. Sin embargo, SASL/PLAIN podría ser un mecanismo más conveniente para las pruebas.

Autenticación OAuthBearer

Para obtener información sobre cómo autenticarse en la API de Kafka de código abierto, consulta la documentación en GitHub.

Autenticación SASL/PLAIN

Managed Service para Apache Kafka admite la autenticación SASL/PLAIN con un archivo JSON de clave de cuenta de servicio o un token de acceso.

Archivo JSON de la clave de la cuenta de servicio

Este método se aplica a todos los clientes de Kafka.

  1. Descarga un archivo JSON de clave de cuenta de servicio para la cuenta de servicio que deseas usar para tu cliente.

  2. Codifica el archivo de la cuenta de servicio con base64-encode para usarlo como cadena de autenticación. Supón que el nombre del archivo es my_service_account_key.json.

    En sistemas Linux o macOS, usa el comando base64 (a menudo, se instala de forma predeterminada) de la siguiente manera:

    base64 -w 0 < my_service_account_key.json > password.txt
    

    Este comando realiza las siguientes acciones:

    • base64 < my_service_account_key.json: Lee el contenido del archivo llamado my_service_account_key.json.

    • Codifica el contenido del archivo con codificación Base64. La codificación Base64 es una forma de representar datos binarios (como los datos JSON en el archivo de tu cuenta de servicio) como texto ASCII. Esto se suele usar para transmitir datos a través de canales diseñados para texto.

    • > password.txt: Redirige el resultado del comando base64 (la versión codificada en Base64 de tu archivo de cuenta de servicio) a un nuevo archivo llamado password.txt.

  3. Puedes usar el contenido del archivo de contraseñas para la autenticación con los siguientes 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";
    

    Reemplaza lo siguiente:

    • SERVICE_ACCOUNT_EMAIL_ADDRESS: La dirección de correo electrónico de la cuenta de servicio que deseas usar para la autenticación.
    • CONTENTS_OF_BASE64_ENCODED_PASSWORD_FILE: Es el contenido del archivo de contraseña codificado en base64 que obtuviste en el paso anterior. Debe ser una sola línea.

Cuando se autentican las conexiones entrantes al clúster, Managed Service para Apache Kafka verifica lo siguiente:

  1. El nombre de usuario proporcionado coincide con la cuenta de servicio cuya clave se usa en la contraseña.

  2. La principal de la cuenta de servicio proporcionada tiene el permiso managedkafka.clusters.connect (incluido en el rol de IAM roles/managedkafka.client) en el clúster.

Token de acceso

  1. Obtén un token de acceso para el principal que deseas usar para la autenticación. Por ejemplo, obtén un token de acceso para la entidad principal actual de gcloud CLI:

    gcloud auth print-access-token
    
  2. Puedes usar el token de acceso para la autenticación con los siguientes 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";
    
    

    Reemplaza lo siguiente:

    • PRINCIPAL_EMAIL_ADDRESS: Es la dirección de correo electrónico del principal que usaste para obtener el token de acceso.
    • ACCESS_TOKEN_VALUE: Es el valor del token de acceso que obtuviste en el paso anterior.

Cuando se autentican las conexiones entrantes al clúster, Managed Service para Apache Kafka verifica lo siguiente:

  1. El token de acceso es válido y no venció.

  2. El nombre de usuario proporcionado coincide con el correo electrónico principal con el que se asocia el token de acceso.

  3. El principal del token de acceso tiene el permiso managedkafka.clusters.connect (incluido en el rol de IAM roles/managedkafka.client) en el clúster.

Federación de identidades para cargas de trabajo para GKE

Managed Service para Apache Kafka admite la autenticación en la API de Apache Kafka de código abierto con la federación de identidades para cargas de trabajo para GKE. Se admite la autenticación para SASL/PLAIN y SASL/OAUTHBEARER.

Para usar la federación de identidades para cargas de trabajo para GKE con el servicio administrado de Apache Kafka, debes cumplir con los siguientes requisitos:

  1. Usa la versión 1.31.1-gke.1241000 de GKE o una posterior.
  2. Anota tu cuenta de servicio de Kubernetes con iam.gke.io/return-principal-id-as-email: "true". Por ejemplo:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: kafka-service-account
      annotations:
        iam.gke.io/return-principal-id-as-email: "true"
    
  3. Si usas el servidor de autenticación local, verifica que también uses la versión 2.40.3 o posterior del paquete google-auth.

Verifica que la principal de GKE tenga el permiso managedkafka.clusters.connect (incluido en el rol de IAM roles/managedkafka.client).

Managed Service para Apache Kafka no admite la autenticación en la API de Apache Kafka de código abierto con la identidad de cargas de trabajo de flota. Como alternativa, puedes vincular tu cuenta de servicio de Kubernetes a una cuenta de servicio de IAM.

Soluciona problemas de errores de autenticación

Si un cliente de Managed Service para Apache Kafka no puede autenticarse en Managed Service para Apache Kafka, verás un mensaje de error similar al siguiente:

Exception in thread "main" java.util.concurrent.ExecutionException:
org.apache.kafka.common.errors.SaslAuthenticationException:
Authentication failed: Invalid username or password

Para resolver el problema, verifica las siguientes causas:

  • La contraseña tiene un formato incorrecto y no representa un objeto JSON de clave de cuenta de servicio válido cuando se decodifica en Base64, ni un token de acceso válido.

  • La entidad principal de autenticación no tiene el permiso managedkafka.clusters.connect en el clúster.

  • El nombre de usuario proporcionado no coincide con la entidad principal de la credencial.

Si un cliente experimenta desconexiones frecuentes cada 30 minutos, esto puede deberse a que el cliente no admite la reautenticación periódica. Los agentes de Managed Service para Apache Kafka requieren que los clientes se vuelvan a autenticar cada 30 minutos, lo que se aplica con la propiedad del agente connections.max.reauth.ms. Verifica que la versión de tu biblioteca cliente de Kafka sea 2.2.0 o posterior, y que admita la reautenticación.

¿Qué sigue?

Apache Kafka® es una marca registrada de The Apache Software Foundation o sus afiliados en Estados Unidos y otros países.