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. También consulta las Reglas de firewall para tus servicios.

    • Un secreto de Secret Manager que posea el contenido de un archivo keytab.

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

      Este archivo keytab debe contener la entrada para el principal del servicio creado para un almacén de metadatos de Hive. El secreto de Secret Manager proporcionado debe fijarse a una versión de secreto específica. No se admite la versión más reciente.

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

      Se requieren un archivo keytab y un principal de Kerberos válidos 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, como 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 a tu 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 depósitos de Cloud Storage que se encuentren en la misma región que tu servicio Dataproc Metastore. Aunque Dataproc Metastore no aplica restricciones de región, los recursos coubicados y los recursos globales tienen un mejor rendimiento. Por ejemplo, un bucket global es adecuado para cualquier región de servicio, pero un bucket multirregión 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 tener una función de IAM que contenga el permiso de IAM metastore.services.create. Las funciones específicas roles/metastore.admin y roles/metastore.editor de Dataproc Metastore incluyen permisos de creación.

  • Puedes otorgar permiso para crear 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.

Habilita 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 intercambiará tráfico 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' en el comando gcloud de creación de clústeres 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 el REALM y reemplaza el elemento principal y segmentos de instancia. Un nombre principal de ejemplo 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 tabla 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. Determinar la dirección IP interna principal de la instancia principal del clúster de Dataproc (desde la IU de Compute Engine o mediantegcloud compute instances list ) y propagarlo como el dominio del clústerkdc yadmin_server en/etc/krb5.conf ,

      Por ejemplo (por ejemplo, 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 de la VM principal de Dataproc a Cloud Storage. Toma nota de la ruta de Cloud Storage que usarás durante la creación del servicio de Dataproc Metastore.

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

       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 servicio nuevo de Dataproc Metastore o actualiza uno existente con el nombre principal anterior, la versión del secreto del administrador de secretos y Cloud krb5.conf. URI de objeto de almacenamiento Asegúrate de especificar la misma red de VPC que usaste durante la creación del clúster de Dataproc.

    En la operación de creación o actualización del servicio de Dataproc Metastore, se probará que el acceso se realiza de forma correcta mediante el archivo principal, keytab y krb5.conf que se proporcionó. Si la prueba falla, la operación fallará.

  7. Una vez creado el servicio de Dataproc Metastore, toma nota de su URI de 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 tiene el aspecto 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. Obtener el ticket de kerberos antes de conectarse 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?