Migrar permisos de Hadoop

En este documento se describe cómo puedes migrar permisos de Apache Hadoop Distributed File System (HDFS), Ranger HDFS y Apache Hive a roles de gestión de identidades y accesos (IAM) en Cloud Storage o BigQuery.

El proceso de migración de permisos consta de los siguientes pasos:

  1. Genera un archivo de asignación de principales creando primero un archivo de configuración YAML de conjunto de reglas de principales. A continuación, ejecuta la herramienta de migración de permisos con el archivo YAML del conjunto de reglas principal y los archivos de metadatos de HDFS o Ranger para generar un archivo de asignación de principales.
  2. Genera un archivo de asignación de permisos de destino creando primero un archivo YAML de conjunto de reglas de permisos. A continuación, ejecuta la herramienta de migración de permisos con el archivo YAML del conjunto de reglas de permisos, los archivos de configuración de asignación de tablas y los archivos de metadatos de HDFS o Ranger para generar un archivo de asignación de permisos de destino.
  3. Ejecuta la herramienta de migración de permisos con el archivo de permisos de destino para aplicar permisos a Cloud Storage o BigQuery. También puedes usar la secuencia de comandos de Python proporcionada para generar un archivo de Terraform que puedes usar para aplicar permisos por tu cuenta.

Antes de empezar

Antes de migrar los permisos, comprueba que has hecho lo siguiente:

También puedes encontrar la secuencia de comandos del generador de Terraform en el archivo terraform.zip del paquete de lanzamiento.

Generar un archivo de asignación de principales

Un archivo de asignación de principales define reglas de asignación que asignan principales de tu fuente a principales de IAM. Google Cloud

Para generar un archivo de asignación de principales, primero debes crear manualmente un archivo YAML de conjunto de reglas de principales para definir cómo se asignan los principales de tu fuente a los principales de Google Cloud IAM. En el archivo YAML del conjunto de reglas de principales, define reglas de asignación para cada una de tus fuentes, ya sea ranger, HDFS o ambas.

En el siguiente ejemplo se muestra un archivo YAML de conjunto de reglas de principales que asigna grupos de Apache Ranger a cuentas de servicio en Google Cloud:

  ranger:
    user_rules:
      - skip: true
    group_rules:
      # Skip internal Ranger groups.
      - skip: true
        when: "group.groupSource == 0"

      # Map all roles to Google Cloud Platform service accounts.
      - map:
          type:
            value: serviceAccount
          email_address:
            expression: "group.name + 'my-service-account@my-project.iam.gserviceaccount.com'"

    role_rules:
      - skip: true

  hdfs:
    user_rules:
      - skip: true
    group_rules:
      - skip: true
    other_rules:
      - skip: true

En el siguiente ejemplo se muestra un archivo YAML de conjunto de reglas de principales que asigna usuarios de HDFS a usuarios de Google Cloud específicos:

  ranger:
    user_rules:
      - skip: true
    group_rules:
      - skip: true
    role_rules:
      - skip: true

  hdfs:
    user_rules:
      # Skip user named 'example'
      - when: "user.name == 'example'"
        skip: true
      # Map all other users to their name at google.com
      - when: "true"
        map:
          type:
            value: user
          email_address:
            expression: "user.name + '@google.com'"

    group_rules:
      - skip: true
    other_rules:
      - skip: true

Para obtener más información sobre la sintaxis para crear un archivo YAML de conjunto de reglas de principales, consulta Archivos YAML de conjuntos de reglas.

Una vez que hayas creado un archivo YAML de conjunto de reglas de principales, súbelo a un segmento de Cloud Storage. También debe incluir el archivo HDFS, el archivo Apache Ranger generado por la herramienta dwh-migration-dumper o ambos, en función de la fuente de la que migre los permisos. A continuación, puedes ejecutar la herramienta de migración de permisos para generar el archivo de asignación de principales.

En el siguiente ejemplo se muestra cómo ejecutar la herramienta de migración de permisos para migrar desde HDFS y Apache Ranger, lo que da como resultado un archivo de asignación de principales llamado principals.yaml.

./dwh-permissions-migration expand \
    --principal-ruleset gs://MIGRATION_BUCKET/principals-ruleset.yaml \
    --hdfs-dumper-output gs://MIGRATION_BUCKET/hdfs-dumper-output.zip \
    --ranger-dumper-output gs://MIGRATION_BUCKET/ranger-dumper-output.zip \
    --output-principals gs://MIGRATION_BUCKET/principals.yaml

Sustituye MIGRATION_BUCKET por el nombre del segmento de Cloud Storage que contiene los archivos de migración.

Una vez que hayas ejecutado la herramienta, inspecciona el archivo principals.yaml generado para verificar que contiene las principales de tu origen asignadas a las principales de Google CloudIAM. Puedes editar el archivo manualmente antes de seguir con los pasos.

Generar el archivo de permisos de destino

El archivo de permisos de destino contiene información sobre la asignación de los permisos de origen definidos en el clúster de Hadoop a los roles de IAM de las carpetas gestionadas de BigQuery o Cloud Storage. Para generar un archivo de permisos de destino, primero debes crear manualmente un archivo YAML de conjunto de reglas de permisos que especifique cómo se asignan los permisos de Ranger o HDFS a Cloud Storage o BigQuery.

En el siguiente ejemplo se aceptan todos los permisos de Ranger en Cloud Storage:

gcs:
  ranger_hive_rules:
    - map: {}
      log: true

En el siguiente ejemplo se aceptan todos los permisos de HDFS, excepto el principal hadoop:

gcs:
  hdfs_rules:
    - when:
        source_principal.name == 'hadoop'
      skip: true
    - map: {}

En el siguiente ejemplo se anula la asignación de roles predeterminada de la tabla tab0 y se usan los valores predeterminados para todos los demás permisos.

gcs:
  ranger_hive_rules:
    ranger_hive_rules:
      - when: table.name == 'tab0'
        map:
          role:
            value: "roles/customRole"
      - map: {}

Para obtener más información sobre la sintaxis para crear un archivo YAML de conjunto de reglas de permisos, consulta Archivos YAML de conjuntos de reglas.

Una vez que hayas creado un archivo YAML de conjunto de reglas de permisos, súbelo a un segmento de Cloud Storage. También debe incluir el archivo HDFS, el archivo Apache Ranger generado por la herramienta dwh-migration-dumper o ambos, en función de la fuente de la que migre los permisos. También debes incluir los archivos YAML de configuración de las tablas y el archivo de asignación de principales.

A continuación, puedes ejecutar la herramienta de migración de permisos para generar el archivo de permisos de destino.

En el siguiente ejemplo se muestra cómo puedes ejecutar la herramienta de migración de permisos para migrar desde HDFS y Apache Ranger, con los archivos de configuración de asignación de tablas y el archivo de asignación de principales llamado principals.yaml, lo que da como resultado un archivo de asignación de principales llamado permissions.yaml.

./dwh-permissions-migration build \
    --permissions-ruleset gs://MIGRATION_BUCKET/permissions-config.yaml \
    --tables gs://MIGRATION_BUCKET/tables/ \
    --principals gs://MIGRATION_BUCKET/principals.yaml \
    --ranger-dumper-output gs://MIGRATION_BUCKET/ranger-dumper-output.zip \
    --hdfs-dumper-output gs://MIGRATION_BUCKET/hdfs-dumper-output.zip \
    --output-permissions gs://MIGRATION_BUCKET/permissions.yaml

Sustituye MIGRATION_BUCKET por el nombre del segmento de Cloud Storage que contiene los archivos de migración.

Una vez que hayas ejecutado la herramienta, inspecciona el archivo permissions.yaml generado para verificar que contiene los permisos de tu fuente asignados a las vinculaciones de IAM de Cloud Storage o BigQuery. Puedes editarlo manualmente antes de seguir con los pasos siguientes.

Aplicar permisos

Una vez que hayas generado un archivo de permisos de destino, podrás ejecutar la herramienta de migración de permisos para aplicar los permisos de IAM a Cloud Storage o BigQuery.

Antes de ejecutar la herramienta de migración de permisos, comprueba que cumples los siguientes requisitos previos:

  • Ha creado las entidades principales necesarias (usuarios, grupos y cuentas de servicio) en Google Cloud.
  • Ha creado las carpetas o tablas gestionadas de Cloud Storage que alojarán los datos migrados.
  • El usuario que ejecuta la herramienta tiene permisos para gestionar los roles de las carpetas o tablas gestionadas de Cloud Storage.

Para aplicar permisos, ejecuta el siguiente comando:

./dwh-permissions-migration apply \
--permissions gs://MIGRATION_BUCKET/permissions.yaml

Donde MIGRATION_BUCKET es el nombre del segmento de Cloud Storage que contiene los archivos de migración.

Aplicar permisos como configuración de Terraform

Para aplicar los permisos migrados, también puedes convertir el archivo de permisos de destino en una configuración de infraestructura como código (IaC) de Terraform y aplicarla a Cloud Storage.

  1. Comprueba que tengas Python 3.7 o una versión posterior.
  2. Crea un entorno virtual y actívalo.
  3. En el directorio permissions-migration/terraform, instala las dependencias del archivo requirements.txt con el siguiente comando:

    python -m pip install -r requirements.txt
  4. Ejecuta el comando del generador:

    python tf_generator PATH LOCATION OUTPUT

    Haz los cambios siguientes:

    • PATH: la ruta al archivo permissions.yaml generado.
    • LOCATION: la ubicación de tu segmento de Cloud Storage donde la secuencia de comandos comprueba y crea carpetas en función de la configuración de permisos.
    • OUTPUT: la ruta al archivo de salida, main.tf.

Archivos YAML de conjuntos de reglas

Los archivos YAML de conjuntos de reglas se usan para asignar principales y roles al migrar permisos de HDFS o Apache Ranger aGoogle Cloud. Los archivos YAML de conjuntos de reglas usan el lenguaje de expresión común (CEL) para especificar predicados (donde el resultado es booleano) y expresiones (donde el resultado es una cadena).

Los archivos YAML de conjuntos de reglas tienen las siguientes características:

  • Las reglas de asignación de cada tipo se ejecutan secuencialmente de arriba abajo para cada objeto de entrada.
  • Las expresiones CEL tienen acceso a variables de contexto, y estas dependen de la sección del conjunto de reglas. Por ejemplo, puede usar la variable user para asignar objetos de usuario de origen y la variable group para asignar grupos.
  • Puede usar expresiones CEL o valores estáticos para cambiar los valores predeterminados. Por ejemplo, al asignar un grupo, puede sustituir el valor de salida type del valor predeterminado group por otro valor, como serviceAccount.
  • Debe haber al menos una regla que coincida con todos los objetos de entrada.

En una migración de permisos de HDFS o Apache Ranger, se puede usar un archivo YAML de conjunto de reglas para definir un archivo de asignación de principales o un archivo de asignación de roles.

Reglas de asignación en archivos YAML de conjuntos de reglas

El archivo YAML del conjunto de reglas consta de reglas de asignación que especifican cómo se emparejan los objetos de la fuente con los del destino durante una migración de permisos. Una regla de asignación puede contener las siguientes secciones o cláusulas:

  • when: una cláusula de predicado que limita la aplicabilidad de la regla
    • Una cadena representa una expresión CEL booleana. Los valores pueden ser true o false.
    • La regla solo se aplica si la cláusula when se evalúa como true.
    • El valor predeterminado es true.
  • map: cláusula que especifica el contenido de un campo de resultado. El valor de esta cláusula depende del tipo de objeto procesado y se puede definir de la siguiente manera:
    • expression para evaluar como una cadena
    • value para una cadena constante
  • skip: especifica que el objeto de entrada no se debe asignar.
    • Puede ser true o false.
  • log: una cláusula de predicado que ayuda a depurar o desarrollar reglas
    • Una cadena representa una expresión CEL booleana. Los valores pueden ser true o false.
    • El valor predeterminado es false.
    • Si se define como true, el resultado contiene un registro de ejecución que se puede usar para monitorizar o diagnosticar problemas en la ejecución.

Crear un archivo YAML de conjunto de reglas de principales

Un archivo de asignación de principales se usa para generar identificadores de principales proporcionando un valor para email_address y type.

  • Usa email_address para especificar el correo del Google Cloud principal.
  • Usa type para especificar la naturaleza de la entidad de seguridad en Google Cloud. El valor de type puede ser user, group o serviceAccount.

Cualquier expresión CEL utilizada en las reglas tiene acceso a variables que representan el objeto procesado. Los campos de las variables se basan en el contenido de los archivos de metadatos de HDFS o Apache Ranger. Las variables disponibles dependen de la sección del conjunto de reglas:

  • Para user_rules, usa la variable user
  • Para group_rules, usa la variable group
  • Para other_rules, usa la variable other
  • Para role_rules, usa la variable role

En el siguiente ejemplo se asignan usuarios de HDFS a usuarios de Google Cloud con su nombre de usuario, seguido de @google.com como dirección de correo electrónico:

hdfs:
  user_rules:
    # Skip user named 'example'
    - when: "user.name == 'example'"
      skip: true
    # Map all other users to their name at google.com
    - when: "true"
      map:
        type:
          value: user
        email_address:
          expression: "user.name + '@google.com'"

Anular la asignación de roles predeterminada

Para usar principales no predeterminados, puedes omitir o modificar las asignaciones de roles predeterminadas mediante los archivos de conjunto de reglas.

En el siguiente ejemplo se muestra cómo puedes omitir una sección de reglas:

hdfs:
  user_rules:
    - skip: true
  group_rules:
    - skip: true
  other_rules:
    - skip: true

Crear un archivo YAML de conjunto de reglas de permisos

Se usa un archivo YAML de conjunto de reglas de permisos para generar un archivo de asignación de permisos de destino. Para crear un archivo YAML de conjunto de reglas de permisos, usa expresiones CEL en el archivo YAML de conjunto de reglas de permisos para asignar permisos de HDFS o Apache Ranger a roles de Cloud Storage o BigQuery.

Asignación de roles predeterminada

Los roles de los archivos de HDFS se determinan en función de los permisos de los archivos de origen:

  • Si se define el bit w, el rol predeterminado es writer.
  • Si se define el bit r, el rol predeterminado es reader.
  • Si no se define ninguno de los bits, el rol estará vacío.

HDFS de Ranger:

  • Si el conjunto de acceso contiene write, el rol predeterminado es writer.
  • Si el conjunto de acceso contiene read, el rol predeterminado es reader.
  • Si el conjunto de acceso no contiene ninguno de los dos, el rol estará vacío.

Guarda del parque:

  • Si el conjunto de acceso contiene update, create, drop, alter, index, lock, all, write o refresh, el rol predeterminado es writer.
  • Si el conjunto de acceso contiene select o read, el rol predeterminado es reader.
  • Si el conjunto de acceso no contiene ninguno de los permisos anteriores, el rol estará vacío.

Cloud Storage:

  • roles/storage.objectUser - Writer
  • roles/storage.objectViewer - Reader

BigQuery:

  • roles/bigquery.dataOwner - Writer
  • roles/bigquery.dataViewer - Reader

En el siguiente ejemplo se muestra cómo aceptar las asignaciones predeterminadas sin hacer ningún cambio en el archivo YAML del conjunto de reglas:

ranger_hdfs_rules:
  - map: {}

Anular la asignación de roles predeterminada

Para usar roles no predeterminados, puedes omitir o modificar las asignaciones de roles predeterminadas mediante los archivos de conjunto de reglas.

En el siguiente ejemplo se muestra cómo puede anular una asignación de roles predeterminada mediante una cláusula map con el campo role usando una causa de valor:

ranger_hdfs_rules:
  - map:
    role:
      value: "roles/customRole"

Combinar asignaciones de permisos

Si se generan varias asignaciones de permisos para el mismo recurso de destino, se usará la asignación con el acceso más amplio. Por ejemplo, si una regla de HDFS asigna el rol de lector al principal pa1 en una ubicación de HDFS y una regla de Ranger asigna el rol de escritor al mismo principal en la misma ubicación, se asignará el rol de escritor.

Uso de comillas en cadenas en expresiones CEL

Usa comillas "" para envolver toda la expresión CEL en YAML. En la expresión CEL, usa comillas simples '' para las cadenas. Por ejemplo:

"'permissions-migration-' + group.name + '@google.com'"