Configuración de seguridad de Dataproc

Cuando creas un clúster de Dataproc, puedes habilitar el Modo seguro de Hadoop a través de Kerberos para proporcionar instancias multiusuario mediante autenticación, aislamiento y encriptación de usuarios dentro de un clúster de Dataproc.

Autenticación de usuarios y otros servicios de Google Cloud Platform. La autenticación por usuario a través de Kerberos solo se aplica dentro del clúster. Las interacciones con otros servicios de Google Cloud, como Cloud Storage, se autentican como la cuenta de servicio para el clúster.

Habilita el modo seguro de Hadoop mediante Kerberos

Habilitar el modo seguro de Kerberos y Hadoop para un clúster incluirá una distribución MIT de Kerberos y configurar Apache Hadoop YARN, HDFS, Hive, Spark y los componentes relacionados para usarlos en la autenticación.

Si se habilita Kerberos, se crea un Centro de distribución de claves (KDC) en el clúster, que contiene los principales de servicio y un principal raíz. El principal raíz es la cuenta con permisos de administrador para el KDC en el clúster. También puede contener principales de usuario estándar o estar conectado a través de la confianza entre dominios con otro KDC que contiene los principales del usuario.

Crea un clúster de Kerberos

Puedes usar Google Cloud CLI, la API de Dataproc o Google Cloud Console para habilitar Kerberos en clústeres que usen la versión de la imagen 1.3 de Dataproc o una posterior.

Comando de gcloud

Para configurar automáticamente un nuevo clúster de Dataproc de Kerberos (versión con imágenes 1.3 y posterior), usa el comando gcloud dataproc clusters create.

gcloud dataproc clusters create cluster-name \
    --image-version=2.0 \
    --enable-kerberos

Propiedad de clúster: En lugar de usar la marca --enable-kerberos como se muestra arriba, puedes configurar Kerberos de forma automática pasando la marca --properties "dataproc:kerberos.beta.automatic-config.enable=true" al comando cluster create (consulta las propiedades del servicio de Dataproc).

API de REST

Los clústeres de Kerberos se pueden crear a través de ClusterConfig.SecurityConfig.KerberosConfig como parte de una solicitud clusters.create. Debes configurar enableKerberos como true.

Console

Puedes configurar Kerberos automáticamente en un clúster nuevo si seleccionas “Habilitar” en la sección Modo seguro de Kerberos y Hadoop del panel de administración de seguridad en la página Crear un clúster de Dataproc de la consola de Google Cloud.

Crea un clúster de Kerberos con tu propia contraseña de raíz principal

Sigue los pasos que se indican a continuación para configurar un clúster de Kerberos que use tu contraseña principal de raíz.

Configura tu contraseña principal de raíz de Kerberos

El principal de raíz de Kerberos es la cuenta con permisos de administrador de KDC en el clúster. A fin de proporcionar de forma segura la contraseña para el principal de raíz de Kerberos, los usuarios pueden encriptarla con una clave de servicio de administración de claves (KMS) y, luego, almacenarla en un Depósito de Google Cloud Storage que pueda acceder el clúster de la cuenta de servicio. La cuenta de servicio del clúster debe tener la función de IAM cloudkms.cryptoKeyDecrypter.

  1. Otorga la función de Encriptador/Desencriptador de CryptoKey de Cloud KMS a la cuenta de servicio del clúster:

    gcloud projects add-iam-policy-binding project-id \
        --member serviceAccount:project-number-compute@developer.gserviceaccount.com \
        --role roles/cloudkms.cryptoKeyDecrypter
    

  2. Crea un llavero de claves

    gcloud kms keyrings create my-keyring --location global
    

  3. Crea una clave en el llavero de claves:

    gcloud kms keys create my-key \
        --location global \
        --keyring my-keyring \
        --purpose encryption
    

  4. Encripta tu contraseña principal de raíz de Kerberos:

    echo "my-password" | \
      gcloud kms encrypt \
        --location=global \
        --keyring=my-keyring \
        --key=my-key \
        --plaintext-file=- \
        --ciphertext-file=kerberos-root-principal-password.encrypted
    

    1. Sube la contraseña encriptada a un bucket de Cloud Storage en tu proyecto.
      1. Ejemplo:
        gsutil cp kerberos-root-principal-password.encrypted gs://my-bucket
        

Crea el clúster

Puedes usar el comando gcloud o la API de Dataproc para habilitar Kerberos en clústeres con tu propia contraseña raíz principal.

Comando de gcloud

Para crear un clúster de Dataproc de kerberos (versión de imagen 1.3 y posteriores), usa el comando gcloud dataproc clusters create.

gcloud dataproc clusters create cluster-name \
    --region=region \
    --image-version=2.0 \
    --kerberos-root-principal-password-uri=gs://my-bucket/kerberos-root-principal-password.encrypted \
    --kerberos-kms-key=projects/project-id/locations/global/keyRings/my-keyring/cryptoKeys/my-key

Usa un archivo de configuración YAML (o JSON). En lugar de pasar las marcas kerberos-* al comando de gcloud como se muestra más arriba, puedes colocar la configuración de Kerberos en un archivo de configuración YAML (o JSON) y, luego, hacer referencia al archivo de configuración para crear el clúster de Kerberos.

  1. Crea un archivo de configuración (consulta Certificados SSL, Configuración adicional de Kerberos y Confianza entre dominios para obtener parámetros de configuración adicionales que se puedan incluir en el archivo):
    root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted
    kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key
    
  2. Usa el siguiente comando de gcloud para crear el clúster de kerberos:
    gcloud dataproc clusters create cluster-name \
        --region=region \
        --kerberos-config-file=local path to config-file \
        --image-version=2.0
    

Consideraciones de seguridad. Dataproc descarta el formato desencriptado de la contraseña después de agregar el principal raíz al KDC. Por motivos de seguridad, después de crear el clúster, puedes borrar el archivo de contraseña y la clave que se usa para desencriptar el secreto, además de quitar la cuenta de servicio de la función kmsKeyDecrypter. No hagas esto si planeas escalar el clúster, lo que requiere el archivo y la clave de contraseña, y la función de la cuenta de servicio.

API de REST

Los clústeres de Kerberos se pueden crear a través de ClusterConfig.SecurityConfig.KerberosConfig como parte de una solicitud clusters.create. Configura enableKerberos como verdadero y establece los campos rootPrincipalPasswordUri y kmsKeyUri.

Console

Cuando crees un clúster con la versión de imagen 1.3 o posterior, selecciona “Habilitar” en la sección Modo seguro de Kerberos y Hadoop del panel Administrar seguridad en la página Crear un clúster de Dataproc de la consola de Google Cloud y, luego, completa las opciones de seguridad (que se analizan en las siguientes secciones).

Acceso a SO

La administración de KDC en el clúster se puede realizar con el comando kadmin mediante el principal de usuario raíz de Kerberos o mediante sudo kadmin.local. Habilita el Acceso al SO para controlar quién puede ejecutar comandos de superusuario.

Certificados SSL

Como parte de la habilitación del modo seguro de Hadoop, Dataproc crea un certificado autofirmado para habilitar la encriptación SSL del clúster. Como alternativa, puedes proporcionar un certificado para la encriptación SSL del clúster si agregas la siguiente configuración al archivo de configuración cuando creas un clúster de Kerberos:

  • ssl:keystore_password_uri: Ubicación en Cloud Storage del archivo encriptado por KMS que contiene la contraseña del archivo de almacén de claves
  • ssl:key_password_uri: Ubicación en Cloud Storage del archivo encriptado por KMS que contiene la contraseña de la clave en el archivo de almacén de claves
  • ssl:keystore_uri: Ubicación en Cloud Storage del archivo de almacén de claves que contiene el certificado comodín y la clave privada que usan los nodos del clúster
  • ssl:truststore_password_uri: Ubicación en Cloud Storage del archivo encriptado por KMS que contiene la contraseña del archivo de Truststore
  • ssl:truststore_uri: Ubicación en Cloud Storage del archivo de almacenamiento de confianza que contiene certificados de confianza

Archivo de configuración de muestra:

root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted
kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key
ssl:
  key_password_uri: gs://bucket/key_password.encrypted
  keystore_password_uri: gs://bucket/keystore_password.encrypted
  keystore_uri: gs://bucket/keystore.jks
  truststore_password_uri: gs://bucket/truststore_password.encrypted
  truststore_uri: gs://bucket/truststore.jks

Configuración adicional de Kerberos

Para especificar un dominio de Kerberos, crea un clúster de Kerberos con la siguiente propiedad agregada en el archivo de configuración de Kerberos:

  • realm: El nombre del dominio de Kerberos del clúster

Si no se configura esta propiedad, el dominio de los nombres de host (en mayúscula) será el dominio.

Para especificar la clave de instancia principal de la base de datos de KDC, crea un clúster de kerberos con la siguiente propiedad agregada en el archivo de configuración de Kerberos:

  • kdc_db_key_uri: Ubicación en Cloud Storage del archivo encriptado de KMS que contiene la clave de instancia principal de la base de datos de KDC.

Si no se establece esta propiedad, Dataproc generará la clave de instancia principal.

Para especificar el ticket con el otorgamiento del ciclo de vida máximo del ticket (en horas), crea un clúster de kerberos con la siguiente propiedad agregada en el archivo de configuración de Kerberos:

  • tgt_lifetime_hours: Tiempo máximo de vida del ticket que otorga el ticket en horas.

Si no se configura esta propiedad, Dataproc establecerá el tiempo de vida de otorgamiento del ticket en 10 horas.

Confianza entre dominios

En un principio, el KDC del clúster solo contiene los principales del administrador raíz y principales de servicio. Puede agregar los principales de usuario de forma manual o establecer una confianza entre dominios con un KDC externo o un servidor de Active Directory que contenga los principales de usuario. Se recomienda Cloud VPN o Cloud Interconnect para conectarse a un KDC local o Active Directory.

Para crear un clúster de kerberos compatible con la confianza entre dominios, agrega la configuración que se indica a continuación al archivo de configuración de Kerberos cuando crees un clúster de kerberos. Encripta la contraseña compartida con KMS y almacénala en un depósito de Cloud Storage al que pueda acceder la cuenta de servicio del clúster.

  • cross_realm_trust:admin_server: Nombre de host/dirección del servidor de administración remoto
  • cross_realm_trust:kdc: Nombre de host/dirección del KDC remoto
  • cross_realm_trust:realm: Nombre del dominio remoto en el que se confiará
  • cross_realm_trust:shared_password_uri: ubicación en Cloud Storage de la contraseña compartida encriptada en KMS

Archivo de configuración de muestra:

root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted
kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key
cross_realm_trust:
  admin_server: admin.remote.realm
  kdc: kdc.remote.realm
  realm: REMOTE.REALM
  shared_password_uri: gs://bucket/shared_password.encrypted

Para habilitar la confianza entre dominios en un KDC remoto sigue estos pasos:

  1. Agrega lo siguiente al archivo /etc/krb5.conf en el KDC remoto:

    [realms]
    DATAPROC.REALM = {
      kdc = MASTER-NAME-OR-ADDRESS
      admin_server = MASTER-NAME-OR-ADDRESS
    }
    

  2. Crea el usuario de confianza:

    kadmin -q "addprinc krbtgt/DATAPROC.REALM@REMOTE.REALM"
    

  3. Ingresa la contraseña del usuario cuando se te solicite. La contraseña debe coincidir con el contenido del archivo de contraseña encriptada que se compartió

Para habilitar la confianza entre dominios con Active Directory, ejecuta los siguientes comandos en PowerShell como administrador:

  1. Crea una definición de KDC en Active Directory.

    ksetup /addkdc DATAPROC.REALM DATAPROC-CLUSTER-MASTER-NAME-OR-ADDRESS
    

  2. Crear confianza en Active Directory.

    netdom trust DATAPROC.REALM /Domain AD.REALM /add /realm /passwordt:TRUST-PASSWORD
    
    La contraseña debe coincidir con el contenido del archivo encriptado de contraseñas compartidas.

dataproc principal

Cuando envías un trabajo a través de la API de trabajos de Dataproc a un clúster de Kerberos de Dataproc, se ejecuta como el principal de kerberos de dataproc del dominio de kerberos del clúster.

Un clúster de Dataproc admite el uso de multiusuario si envías un trabajo directamente al clúster, por ejemplo, a través de SSH. Sin embargo, si el trabajo lee o escribe en otros servicios de Google Cloud, como Cloud Storage, el trabajo actúa como la cuenta de servicio del clúster.

Propiedades de clúster predeterminadas y personalizadas

El modo seguro de Hadoop se configura con propiedades en los archivos de configuración. Dataproc establece valores predeterminados para estas propiedades.

Puedes anular las propiedades predeterminadas cuando creas el clúster con la marca gcloud dataproc clusters create --properties o si llamas a la API de clusters.create y configuras las propiedades de SoftwareConfig (consulta los ejemplos de propiedades del clúster).

Modo de alta disponibilidad

En el modo de alta disponibilidad (HA), un clúster de Kerberos tendrá 3 KDC, uno en cada instancia principal. El KDC que se ejecuta en la "primera" instancia principal ($CLUSTER_NAME-m-0) será el KDC principal y también servirá como servidor de administración. La base de datos principal del KDC se sincronizará con las dos réplicas de KDC en intervalos de 5 minutos a través de un trabajo cron, y los 3 KDC entregarán tráfico de lectura.

Kerberos no admite de forma nativa la replicación en tiempo real ni la conmutación por error automática si el KDC principal está inactivo. Para realizar una conmutación por error manual, haz lo siguiente:

  1. En todos los equipos de KDC, en /etc/krb5.conf, cambia admin_server al nuevo FQDN de la instancia principal (nombre de dominio completamente calificado). Quita la instancia principal vieja de la lista de KDC.
  2. En el nuevo KDC de la instancia principal, configura un trabajo cron para propagar la base de datos.
  3. En el nuevo KDC de la instancia principal, reinicia el proceso admin_server (krb5-admin-server).
  4. En todas las máquinas de KDC, reinicia el proceso de KDC (krb5-kdc).

Configuración de red

Para asegurarte de que los nodos trabajadores puedan comunicarse con el KDC y el servidor de administración de Kerberos ejecute las instancias principales, verifica que las reglas de firewall de VPC permitan la entrada de tráfico de TCP y UDP en el puerto 88 y la entrada de tráfico de TCP en el puerto 749 en las instancias principales. En el modo de alta disponibilidad, asegúrate de que las reglas de firewall de VPC permitan el tráfico de TCP de entrada en el puerto 754 en las instancias principales para permitir la propagación de los cambios en el KDC principal. Kerberos requiere que se configure correctamente el DNS inverso. Además, para la canonicalización principal del servicio basado en host, asegúrate de que el DNS inverso esté configurado de forma correcta en la red del clúster.

Más información

Consulta la Documentación de MIT de Kerberos.