Configuración de seguridad de Dataproc

Al crear un clúster de Dataproc, puedes habilitar el modo seguro de Hadoop a través de Kerberos para proporcionar multitenencia mediante la autenticación, el aislamiento y el cifrado de usuarios en un clúster de Dataproc.

Autenticación de usuarios y otros servicios de Google Cloud Platform. La autenticación por usuario mediante Kerberos solo se aplica en el clúster. Las interacciones con otros servicios de Google Cloud , como Cloud Storage, se siguen autenticando como la cuenta de servicio del clúster.

Habilitar el modo seguro de Hadoop con Kerberos

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

Al habilitar Kerberos, se crea un centro de distribución de claves (KDC) en el clúster, que contiene principales de servicio y un principal raíz. La entidad de seguridad raíz es la cuenta con permisos de administrador para el KDC del clúster. También puede contener principales de usuario estándar o conectarse mediante una relación de confianza entre dominios a otro KDC que contenga los principales de usuario.

Crear un clúster de Kerberos

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

Comando gcloud

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

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

Propiedad del clúster: en lugar de usar la marca --enable-kerberos como se muestra en el ejemplo anterior, puedes configurar automáticamente Kerberos pasando la marca --properties "dataproc:kerberos.beta.automatic-config.enable=true" al comando de creación de clústeres (consulta las propiedades del servicio Dataproc).

API REST

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

Consola

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

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

Configura la contraseña raíz principal de Kerberos y, a continuación, crea un clúster.

Configurar la contraseña principal raíz de Kerberos

El principal raíz de Kerberos es la cuenta con permisos de administrador para el KDC del clúster. Para proporcionar de forma segura la contraseña de la entidad principal raíz de Kerberos, los usuarios pueden cifrarla con una clave de Key Management Service (KMS) y, a continuación, almacenarla en un segmento de Google Cloud Storage al que pueda acceder la cuenta de servicio del clúster. A la cuenta de servicio del clúster se le debe conceder el cloudkms.cryptoKeyDecrypter rol de gestión de identidades y accesos.

  1. Asigna el rol Encargado del encriptado y desencriptado de claves 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 conjunto de claves:

    gcloud kms keyrings create my-keyring --location global
    

  3. Crea una clave en el conjunto de claves:

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

  4. Cifra la contraseña principal 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 cifrada a un segmento de Cloud Storage de tu proyecto.
      1. Ejemplo:
        gcloud storage cp kerberos-root-principal-password.encrypted gs://my-bucket
        

Crear el clúster

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

Comando gcloud

Para crear un clúster de Dataproc con 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 kerberos-*flags al comando gcloud como se muestra arriba, puedes colocar los ajustes de Kerberos en un archivo de configuración YAML (o JSON) y, a continuación, hacer referencia al archivo de configuración para crear el clúster de Kerberos.

  1. Crea un archivo de configuración (consulta las secciones Certificados SSL, Configuración adicional de Kerberos y Confianza entre dominios para ver más opciones de configuración que se pueden 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 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 la forma descifrada de la contraseña después de añadir el principal raíz al KDC. Por motivos de seguridad, después de crear el clúster, puedes eliminar el archivo de contraseña y la clave utilizada para descifrar el secreto, así como quitar la cuenta de servicio del rol kmsKeyDecrypter. No lo hagas si tienes previsto ampliar el clúster, ya que se necesitan el archivo de contraseñas, la clave y el rol de cuenta de servicio.

API REST

Los clústeres de Kerberos se pueden crear a través de ClusterConfig.SecurityConfig.KerberosConfig como parte de una solicitud clusters.create. Asigna el valor "true" a enableKerberos y configura los campos rootPrincipalPasswordUri y kmsKeyUri.

Consola

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 Gestionar seguridad de la página de Dataproc Crear un clúster de la consola de Google Cloud . A continuación, completa las opciones de seguridad (que se explican en las secciones siguientes).

Inicio de sesión en el SO

La gestión del 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 Inicio de sesión del 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 el cifrado SSL del clúster. Como alternativa, puedes proporcionar un certificado para el cifrado SSL del clúster añadiendo los siguientes ajustes al archivo de configuración al crear un clúster de Kerberos:

  • ssl:keystore_password_uri: ubicación en Cloud Storage del archivo cifrado con 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 con KMS que contiene la contraseña de la clave del 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 utilizan los nodos del clúster.
  • ssl:truststore_password_uri: ubicación en Cloud Storage del archivo encriptado con KMS que contiene la contraseña del archivo del almacén de confianza.
  • ssl:truststore_uri: ubicación en Cloud Storage del archivo del almacén de confianza que contiene los certificados de confianza.

Archivo de configuración de ejemplo:

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 añadida en el archivo de configuración de Kerberos:

  • realm: nombre del dominio Kerberos en el clúster.

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

Para especificar la clave maestra de la base de datos KDC, crea un clúster de Kerberos con la siguiente propiedad añadida en el archivo de configuración de Kerberos:

  • kdc_db_key_uri: ubicación en Cloud Storage del archivo cifrado con KMS que contiene la clave maestra de la base de datos KDC.

Si no se define esta propiedad, Dataproc generará la clave maestra.

Para especificar la duración máxima del ticket de concesión de tickets (en horas), crea un clúster de Kerberos con la siguiente propiedad añadida en el archivo de configuración de Kerberos:

  • tgt_lifetime_hours: tiempo de vida máximo del vale de concesión de vales en horas.

Si no se define esta propiedad, Dataproc asignará al ticket de concesión de tickets una validez de 10 horas.

Relaciones de confianza entre dominios

Inicialmente, el KDC del clúster solo contiene el principal del administrador raíz y los principales de servicio. Puedes añadir principales de usuario manualmente o establecer una relación de confianza entre dominios mediante un centro de distribución de claves externo o un servidor de Active Directory con principales de usuario. Se recomienda utilizar Cloud VPN o Cloud Interconnect para conectarse a un KDC o a Active Directory on-premise.

Para crear un clúster de Kerberos que admita la confianza entre reinos, añade los siguientes ajustes 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 segmento de Cloud Storage al que pueda acceder la cuenta de servicio del clúster.

  • cross_realm_trust:admin_server: nombre de host o dirección del servidor de administración remoto
  • cross_realm_trust:kdc: nombre de host o dirección del centro de distribución de claves remoto
  • cross_realm_trust:realm: nombre del dominio remoto de confianza
  • cross_realm_trust:shared_password_uri: ubicación en Cloud Storage de la contraseña compartida cifrada con KMS

Archivo de configuración de ejemplo:

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. Añade lo siguiente al archivo /etc/krb5.conf del 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. Cuando se te solicite, introduce la contraseña del usuario. La contraseña debe coincidir con el contenido del archivo de contraseña compartida cifrado.

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. Crea una relación de 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 de contraseña compartida cifrado.

dataproc principal

Cuando envías una tarea mediante la API jobs de Dataproc a un clúster Kerberos de Dataproc, se ejecuta como el principal dataproc de Kerberos del dominio de Kerberos del clúster.

Se admite la arquitectura multiinquilino en un clúster Kerberos de Dataproc si envías una tarea directamente al clúster, por ejemplo, mediante 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 archivos de configuración. Dataproc define valores predeterminados para estas propiedades.

Puedes anular las propiedades predeterminadas al crear el clúster con la marca gcloud dataproc clusters create --properties o llamando a la API clusters.create y configurando las propiedades de SoftwareConfig (consulta los ejemplos de propiedades de clúster).

Modo de alta disponibilidad

En el modo de alta disponibilidad, un clúster de Kerberos tendrá tres KDCs: uno en cada nodo maestro. El KDC que se ejecute en el primer maestro ($CLUSTER_NAME-m-0) será el KDC maestro y también actuará como servidor de administración. La base de datos del KDC principal se sincronizará con los dos KDCs de réplica cada 5 minutos mediante una tarea cron, y los tres KDCs servirá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 no funciona. Para realizar una conmutación por error manual, sigue estos pasos:

  1. En todos los equipos KDC, en /etc/krb5.conf, cambia admin_server por el nombre de dominio completo del nuevo maestro. Elimina el antiguo principal de la lista de KDCs.
  2. En el nuevo KDC maestro, configura un trabajo cron para propagar la base de datos.
  3. En el nuevo KDC principal, reinicia el proceso admin_server (krb5-admin-server).
  4. En todos los equipos KDC, reinicia el proceso KDC (krb5-kdc).

Configuración de red

Para asegurarte de que los nodos de trabajo puedan comunicarse con el KDC y el servidor de administración de Kerberos que se ejecutan en el nodo maestro, comprueba que las reglas del cortafuegos de la VPC permitan el tráfico TCP y UDP de entrada en el puerto 88 y el tráfico TCP de entrada en el puerto 749 del nodo maestro. En el modo de alta disponibilidad, asegúrate de que las reglas de cortafuegos de VPC permitan el tráfico TCP de entrada en el puerto 754 de los maestros para permitir la propagación de los cambios realizados en el KDC maestro. Kerberos requiere que el DNS inverso esté configurado correctamente. Además, para la canonicalización del principal de servicio basado en host, asegúrate de que el DNS inverso esté configurado correctamente para la red del clúster.

Siguientes pasos