Configurar Kerberos para un servicio

Kerberos es un protocolo de autenticación de red diseñado para proporcionar autenticación sólida para aplicaciones cliente/servidor mediante criptografía de clave secreta. Por lo general, se usa entre la pila de Hadoop para la autenticación en todo el ecosistema de software.

Dataproc Metastore admite Kerberos a través de un centro de distribución de claves (KDC) alojado por el cliente. Los requisitos de API para admitir Kerberos son un archivo keytab, un principal y un archivo krb5.conf.

En esta página, se explica cómo habilitar y configurar Kerberos para el servicio de almacén de metadatos de Hive de Dataproc Metastore.

Antes de comenzar

  • Si deseas habilitar Kerberos en tu instancia de almacén de metadatos de Hive, debes configurar lo siguiente:

    • Tu propio KDC de Kerberos alojado.

      KDC es una aplicación que emite tickets de Kerberos. Es responsable de autenticar a los usuarios cuando se utiliza Kerberos.

    • Conectividad IP entre la red de VPC y tu KDC para realizar la autenticación inicial.

    • Reglas de firewall en tu KDC para permitir el tráfico desde Dataproc Metastore. Además, consulta Reglas de firewall para tus servicios.

    • Un secreto de Google Cloud Secret Manager que contiene el contenido de un archivo de pestañas de claves. Para obtener más información sobre cómo crear un secreto de Secret Manager, consulta Habilita claves de encriptación administradas por el cliente (CMEK) para Secret Manager.

      Un archivo keytab contiene pares de principales y claves encriptadas de Kerberos que se pueden usar para autenticar una principal de servicio con un KDC de Kerberos. Debes generar un archivo de tabtab con el KDC de clúster de Dataproc y usarlo para configurar el servicio de Dataproc Metastore.

      Este archivo de keytab debe contener la entrada del principal del servicio creado para un almacén de metadatos de Hive. El Secret de Secret Manager que se proporciona debe fijarse a una versión del Secret específica. La versión más reciente no es compatible.

    • Un principal que esté en el KDC y en el archivo keytab.

      Se requieren un archivo keytab y un principal de Kerberos para iniciar el almacén de metadatos de Hive. El principal existe en el KDC y en el archivo keytab. El principal debe contener tres partes: primary/instance@REALM. La instancia \_HOST no es compatible.

    • Un archivo krb5.conf en un bucket de Cloud Storage

      Un archivo krb5.conf válido contiene información de configuración de Kerberos (por ejemplo, la entrada del usuario), como la IP de KDC, el puerto y el nombre del dominio. Debes especificar la IP del KDC y no el FQDN del KDC.

      Dataproc Metastore toma todo krb5.conf como un objeto de Cloud Storage. Debes proporcionar el URI de Cloud Storage que especifique la ruta al archivo krb5.conf durante la creación del servicio. Un URI típico tiene el formato gs://{bucket_name}/path/to/krb5.conf.

    • Para obtener mejores resultados, usa buckets de Cloud Storage que se encuentren en la misma región que tu servicio de Dataproc Metastore. Si bien Dataproc Metastore no aplica restricciones de región, los recursos ubicados en el mismo lugar tienen un mejor rendimiento. Por ejemplo, un bucket multirregional de la UE no funciona bien con un servicio us-central1. El acceso entre regiones da como resultado una latencia más alta, falta de aislamiento de fallas regionales y cargos por ancho de banda de red entre regiones.

Control de acceso

  • Para crear un servicio, debes solicitar una función de IAM que contenga el permiso metastore.services.create de IAM. Las funciones específicas de Dataproc Metastore roles/metastore.admin y roles/metastore.editor incluyen el permiso de creación.

  • Puedes otorgar permiso de creación a usuarios o grupos mediante las funciones heredadas roles/owner y roles/editor.

  • Si usas Controles del servicio de VPC, el secreto de Secret Manager y el objeto krb5.conf de Cloud Storage deben pertenecer a un proyecto que resida en el mismo perímetro de servicio que el servicio de Dataproc Metastore.

Para obtener más información, consulta la IAM y el control de acceso de Dataproc Metastore.

Habilitar Kerberos para un servicio

En las siguientes instrucciones, se demuestra cómo habilitar Kerberos para un servicio de Dataproc Metastore que está integrado en Dataproc.

  1. Configura un clúster de Dataproc con Kerberos habilitado en la misma red de VPC que se intercambiará con el servicio de Dataproc Metastore.

    1. Habilita el acceso al proyecto cuando crees el clúster de Dataproc para permitir el acceso a la API a todos los servicios de Google Cloud en el mismo proyecto. Para ello, se debe pasar --scopes 'https://www.googleapis.com/auth/cloud-platform' al comando de creación gcloud del clúster de Dataproc.
  2. Establece una conexión SSH a la instancia principal del clúster de Dataproc. Puedes hacerlo desde un navegador o desde la línea de comandos. Ejecuta los siguientes comandos en la instancia principal:

    1. Modifica /etc/hive/conf/hive-site.xml en el clúster de Dataproc. Selecciona un nombre principal (debe tener el formato primary/instance@REALM). Busca el hive.metastore.keberos.principal preexistente en /etc/hive/conf/hive-site.xml para encontrar REALM y reemplazar los segmentos principal y de instancia. Un ejemplo de nombre principal es hive/test@C.MY-PROJECT.INTERNAL.

      Toma nota del nombre principal para usar durante la creación del servicio de Dataproc Metastore:

      <property>
        <name>hive.metastore.kerberos.principal</name>
        <!-- Update this value. -->
        <value>PRINCIPAL_NAME</value>
      </property>
      <property>
        <name>hive.metastore.kerberos.keytab.file</name>
        <!-- Update to this value. -->
        <value>/etc/security/keytab/metastore.service.keytab</value>
      </property>
      
    2. Crea la combinación de keytab/principal en la VM principal del clúster de Dataproc:

      sudo kadmin.local -q "addprinc -randkey PRINCIPAL_NAME"
      sudo kadmin.local -q "ktadd -k /etc/security/keytab/metastore.service.keytab PRINCIPAL_NAME"
      
    3. Sube la pestaña de claves a Secret Manager desde la VM principal del clúster de Dataproc. Esto requiere que la identidad que ejecuta la VM de Dataproc tenga la función de administrador de Secret Manager para crear secretos. Toma nota de la versión del secreto creada para usar durante la creación del servicio de Dataproc Metastore.

        gcloud secrets create SECRET_NAME --replication-policy automatic
        sudo gcloud secrets versions add SECRET_NAME --data-file /etc/security/keytab/metastore.service.keytab
        

    4. Determina la dirección IP interna principal de la instancia principal del clúster de Dataproc (desde la IU de Compute Engine o mediante gcloud compute instances list) y propágala como kdc y admin_server del dominio del clúster en /etc/krb5.conf.

      Por ejemplo (si la dirección IP interna de la instancia principal es 192.0.2.2):

      [realms]
        US-CENTRAL1-A.C.MY-PROJECT.INTERNAL = {
          kdc = 192.0.2.2
          admin_server = 192.0.2.2
        }
      
    5. Sube el archivo /etc/krb5.conf desde la VM principal de Dataproc a Cloud Storage. Toma nota de la ruta de acceso de Cloud Storage para usar durante la creación del servicio de Dataproc Metastore.

      gsutil cp /etc/krb5.conf gs://bucket-name/path/to/krb5.conf
      
  3. Para proporcionar la cuenta de servicio de Dataproc Metastore (esta cuenta está administrada por Google y aparece en la página de la IU de permisos de IAM, selecciona Incluir permisos de funciones proporcionadas por Google) con permiso para acceder a la pestaña de claves:

       gcloud projects add-iam-policy-binding PROJECT_ID \
           --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-metastore.iam.gserviceaccount.com \
           --role roles/secretmanager.secretAccessor
       

  4. Proporciona la cuenta de servicio de Dataproc Metastore con permiso para acceder al archivo krb5.conf.

       gcloud projects add-iam-policy-binding PROJECT_ID \
           --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-metastore.iam.gserviceaccount.com \
           --role roles/storage.objectViewer
       

  5. Asegúrate de haber configurado las reglas de firewall de entrada para el KDC. Estas reglas de firewall deben configurarse en la red de VPC que se usa para crear el clúster de Dataproc a fin de permitir la entrada de tráfico de TCP/UDP.

  6. Crea un nuevo servicio de Dataproc Metastore o actualiza uno existente con el principal anterior, la versión del secreto de Secret Manager y el URI del objeto de Cloud Storage de krb5.conf. Asegúrate de especificar la misma red de VPC que usaste durante la creación del clúster de Dataproc.

    La operación de creación o actualización del servicio de Dataproc Metastore probará que se produzca un acceso exitoso con el archivo principal, keytab y krb5.conf. Si la prueba falla, la operación fallará.

  7. Una vez que se crea el servicio de Dataproc Metastore, toma nota del URI del extremo de Thrift y del directorio del almacén. El URI del extremo de Thrift se parece a thrift://10.1.2.3:9083, y el directorio del almacén se ve como gs://gcs-bucket-service-name-deadbeef/hive-warehouse. Vuelve a establecer una conexión SSH con la instancia principal del clúster de Dataproc y realiza lo siguiente:

    1. Modifica /etc/hive/conf/hive-site.xml en el clúster de Dataproc:

      <property>
        <name>hive.metastore.uris</name>
        <!-- Update this value. -->
        <value>ENDPOINT_URI</value>
      </property>
      <!-- Add this property entry. -->
      <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>WAREHOUSE_DIR</value>
      </property>
      
    2. Reinicia HiveServer2:

      sudo systemctl restart hive-server2.service
      
    3. Modifica /etc/hadoop/conf/container-executor.cfg para agregar la siguiente línea en cada nodo de Dataproc.

       allowed.system.users=hive
      
    4. Obtén el ticket de Kerberos antes de conectarte a la instancia de Dataproc Metastore.

      sudo klist -kte /etc/security/keytab/metastore.service.keytab
      sudo kinit -kt /etc/security/keytab/metastore.service.keytab PRINCIPAL_NAME
      sudo klist # gets the ticket information.
      

¿Qué sigue?