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
- En la consola de Google Cloud , dirígete a la página IAM.
Ir a IAM - Verifica que el proyecto esté configurado como el proyecto de consumidor al que accederá el cliente de Managed Service for Apache Kafka.
- Haz clic en Otorgar acceso.
- 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.
- En Asignar roles, selecciona el rol Cliente de Kafka administrado.
- Haz clic en Guardar.
gcloud CLI
-
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.
-
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.
Descarga un archivo JSON de clave de cuenta de servicio para la cuenta de servicio que deseas usar para tu cliente.
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.txtEste comando realiza las siguientes acciones:
base64 < my_service_account_key.json: Lee el contenido del archivo llamadomy_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 comandobase64(la versión codificada en Base64 de tu archivo de cuenta de servicio) a un nuevo archivo llamadopassword.txt.
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:
El nombre de usuario proporcionado coincide con la cuenta de servicio cuya clave se usa en la contraseña.
La principal de la cuenta de servicio proporcionada tiene el permiso
managedkafka.clusters.connect(incluido en el rol de IAMroles/managedkafka.client) en el clúster.
Token de acceso
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-tokenPuedes 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:
El token de acceso es válido y no venció.
El nombre de usuario proporcionado coincide con el correo electrónico principal con el que se asocia el token de acceso.
El principal del token de acceso tiene el permiso
managedkafka.clusters.connect(incluido en el rol de IAMroles/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:
- Usa la versión
1.31.1-gke.1241000de GKE o una posterior. 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"Si usas el servidor de autenticación local, verifica que también uses la versión
2.40.3o 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.connecten 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.