Migrer des autorisations depuis Hadoop

Ce document explique comment migrer des autorisations depuis Apache Hadoop Distributed File System (HDFS), Ranger HDFS et Apache Hive vers des rôles Identity and Access Management (IAM) dans Cloud Storage ou BigQuery.

Le processus de migration des autorisations comprend les étapes suivantes :

  1. Générez un fichier de mappage des comptes principaux en créant d'abord un fichier de configuration YAML d'ensemble de règles de compte principal. Exécutez ensuite l'outil de migration des autorisations avec le fichier YAML d'ensemble de règles de compte principal et les fichiers de métadonnées HDFS ou Ranger pour générer un fichier de mappage des comptes principaux.
  2. Générez un fichier de mappage des autorisations cibles en créant d'abord un fichier YAML d'ensemble de règles d'autorisations. Exécutez ensuite l' outil de migration des autorisations avec le fichier YAML d'ensemble de règles d'autorisations, les fichiers de configuration de mappage des tables et les fichiers de métadonnées HDFS ou Ranger pour générer un fichier de mappage des autorisations cibles.
  3. Exécutez l'outil de migration des autorisations avec le fichier d'autorisations cibles pour appliquer des autorisations à Cloud Storage ou BigQuery. Vous pouvez également utiliser le script Python fourni pour générer un fichier Terraform que vous pourrez utiliser pour appliquer vous-même des autorisations.

Avant de commencer

Avant de migrer des autorisations, vérifiez que vous avez effectué les opérations suivantes :

Vous trouverez également le script du générateur Terraform dans le fichier terraform.zip du package de version.

Générer un fichier de mappage des comptes principaux

Un fichier de mappage des comptes principaux définit des règles de mappage qui associent les comptes principaux de votre source aux Google Cloud comptes principaux IAM.

Pour générer un fichier de mappage des comptes principaux, vous devez d'abord créer manuellement un fichier YAML d'ensemble de règles de compte principal pour définir comment les comptes principaux sont mappés de votre source aux Google Cloud comptes principaux IAM. Dans le fichier YAML d'ensemble de règles de compte principal, définissez des règles de mappage pour chacune de vos sources, ranger, HDFS ou les deux.

L'exemple suivant montre un fichier YAML d'ensemble de règles de compte principal qui mappe des groupes Apache Ranger à des comptes de service dans 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

L'exemple suivant montre un fichier YAML d'ensemble de règles de compte principal qui mappe des utilisateurs HDFS à des utilisateurs spécifiques Google Cloud :

  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

Pour en savoir plus sur la syntaxe permettant de créer un fichier YAML d'ensemble de règles de compte principal, consultez Fichiers YAML d'ensemble de règles.

Une fois que vous avez créé un fichier YAML d'ensemble de règles de compte principal, importez-le dans un bucket Cloud Storage. Vous devez également inclure le fichier HDFS, le fichier Apache Ranger généré par l'outil dwh-migration-dumper, ou les deux, selon la source à partir de laquelle vous migrez les autorisations. Vous pouvez ensuite exécuter l'outil de migration des autorisations pour générer le fichier de mappage des comptes principaux.

L'exemple suivant montre comment exécuter l'outil de migration des autorisations pour migrer à partir de HDFS et d'Apache Ranger, ce qui génère un fichier de mappage des comptes principaux nommé 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

Remplacez MIGRATION_BUCKET par le nom du bucket Cloud Storage contenant vos fichiers de migration.

Une fois l'outil exécuté, inspectez le fichier généré principals.yaml pour vérifier qu'il contient des comptes principaux de votre source mappés à Google Cloud des comptes principaux IAM. Vous pouvez modifier le fichier manuellement avant de passer aux étapes suivantes.

Générer un fichier d'autorisations cibles

Le fichier d'autorisations cibles contient des informations sur le mappage de l'ensemble d'autorisations sources défini dans le cluster Hadoop aux rôles IAM pour les dossiers gérés BigQuery ou Cloud Storage. Pour générer un fichier d'autorisations cibles, vous devez d'abord créer manuellement un fichier YAML d'ensemble de règles d'autorisations qui spécifie comment les autorisations de Ranger ou HDFS sont mappées à Cloud Storage ou BigQuery.

L'exemple suivant accepte toutes les autorisations Ranger pour Cloud Storage :

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

L'exemple suivant accepte toutes les autorisations HDFS, à l'exception du compte principal hadoop :

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

L'exemple suivant remplace le mappage de rôle par défaut pour la table tab0 et utilise les valeurs par défaut pour toutes les autres autorisations :

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

Pour en savoir plus sur la syntaxe permettant de créer un fichier YAML d'ensemble de règles d'autorisations, consultez Fichiers YAML d'ensemble de règles.

Une fois que vous avez créé un fichier YAML d'ensemble de règles d'autorisations, importez-le dans un bucket Cloud Storage. Vous devez également inclure le fichier HDFS, le fichier Apache Ranger généré par l'outil dwh-migration-dumper, ou les deux, selon la source à partir de laquelle vous migrez les autorisations. Vous devez également inclure les fichiers YAML de configuration des tables et le fichier de mappage des comptes principaux.

Vous pouvez ensuite exécuter l'outil de migration des autorisations pour générer le fichier d'autorisations cibles.

L'exemple suivant montre comment exécuter l'outil de migration des autorisations pour migrer à partir de HDFS et d'Apache Ranger, avec les fichiers de configuration de mappage des tables et le fichier de mappage des comptes principaux nommé principals.yaml, ce qui génère un fichier de mappage des comptes principaux nommé 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

Remplacez MIGRATION_BUCKET par le nom du bucket Cloud Storage contenant vos fichiers de migration.

Une fois l'outil exécuté, inspectez le fichier permissions.yaml généré pour vérifier qu'il contient des autorisations de votre source mappées à des liaisons IAM Cloud Storage ou BigQuery. Vous pouvez modifier le fichier manuellement avant de passer aux étapes suivantes.

Appliquer des autorisations

Une fois que vous avez généré un fichier d'autorisations cibles, vous pouvez exécuter l'outil de migration des autorisations pour appliquer les autorisations IAM à Cloud Storage ou BigQuery.

Avant d'exécuter l'outil de migration des autorisations, vérifiez que vous avez rempli les conditions préalables suivantes :

  • Vous avez créé les comptes principaux requis (utilisateurs, groupes, comptes de service) dans Google Cloud.
  • Vous avez créé les dossiers gérés ou les tables Cloud Storage qui hébergeront les données migrées.
  • L'utilisateur qui exécute l'outil est autorisé à gérer les rôles pour les dossiers gérés ou les tables Cloud Storage.

Vous pouvez appliquer des autorisations en exécutant la commande suivante :

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

MIGRATION_BUCKET est le nom du bucket Cloud Storage contenant vos fichiers de migration.

Appliquer des autorisations en tant que configuration Terraform

Pour appliquer les autorisations migrées, vous pouvez également convertir le fichier d'autorisations cibles en configuration Terraform Infrastructure-as-Code (IaC) et l'appliquer à Cloud Storage.

  1. Vérifiez que vous disposez de Python 3.7 ou version ultérieure.
  2. Créez un environnement virtuel et activez-le.
  3. Dans le répertoire permissions-migration/terraform, installez les dépendances à partir du fichier requirements.txt à l'aide de la commande suivante :

    python -m pip install -r requirements.txt
  4. Exécutez la commande du générateur :

    python tf_generator PATH LOCATION OUTPUT

    Remplacez les éléments suivants :

    • PATH: chemin d'accès au fichier permissions.yaml généré.
    • LOCATION : emplacement de votre bucket Cloud Storage où le script vérifie et crée des dossiers en fonction de la configuration des autorisations.
    • OUTPUT : chemin d'accès au fichier de sortie, main.tf.

Fichiers YAML d'ensemble de règles

Les fichiers YAML d'ensemble de règles sont utilisés pour mapper les comptes principaux et les rôles lors de la migration des autorisations de HDFS ou Apache Ranger vers Google Cloud. Les fichiers YAML d'ensemble de règles utilisent le CEL (Common Expression Language) pour spécifier des prédicats (où le résultat est booléen) et des expressions (où le résultat est une chaîne).

Les fichiers YAML d'ensemble de règles présentent les caractéristiques suivantes :

  • Les règles de mappage de chaque type sont exécutées de manière séquentielle de haut en bas pour chaque objet d'entrée.
  • Les expressions CEL ont accès aux variables de contexte, et les variables de contexte dépendent de la section de l'ensemble de règles. Par exemple, vous pouvez utiliser la variable user pour mapper des objets utilisateur sources, et la variable group pour mapper des groupes.
  • Vous pouvez utiliser des expressions CEL ou des valeurs statiques pour modifier les valeurs par défaut. Par exemple, lors du mappage d'un groupe, vous pouvez remplacer la valeur de sortie type par une autre valeur que la valeur par défaut group, comme serviceAccount.
  • Il doit y avoir au moins une règle qui correspond à chaque objet d'entrée.

Lors d'une migration d'autorisations HDFS ou Apache Ranger, un fichier YAML d'ensemble de règles peut être utilisé pour définir un fichier de mappage des comptes principaux ou un fichier de mappage des rôles.

Règles de mappage dans les fichiers YAML d'ensemble de règles

Le fichier YAML d'ensemble de règles se compose de règles de mappage qui spécifient comment les objets correspondent de votre source à votre cible lors d'une migration d'autorisations. Une règle de mappage peut contenir les sections ou clauses suivantes :

  • when: clause de prédicat qui limite l'applicabilité de la règle
    • Une chaîne représente une expression CEL booléenne. Les valeurs peuvent être true ou false.
    • La règle ne s'applique que si la clause when est évaluée sur true.
    • La valeur par défaut est true.
  • map : clause qui spécifie le contenu d'un champ de résultat. La valeur de cette clause dépend du type d'objet traité et peut être définie comme suit :
    • expression à évaluer en tant que chaîne
    • value pour une chaîne constante
  • skip: spécifie que l'objet d'entrée ne doit pas être mappé
    • Peut être true ou false
  • log: clause de prédicat qui permet de déboguer ou de développer des règles
    • Une chaîne représente une expression CEL booléenne. Les valeurs peuvent être true ou false.
    • La valeur par défaut est false.
    • Si la valeur est définie sur true, la sortie contient un journal d'exécution qui peut être utilisé pour surveiller ou diagnostiquer les problèmes d'exécution.

Créer un fichier YAML d'ensemble de règles de compte principal

Un fichier de mappage des comptes principaux est utilisé pour générer identifiants de compte principal en fournissant une valeur pour email_address et type.

  • Utilisez email_address pour spécifier l'e-mail du Google Cloud compte principal.
  • Utilisez type pour spécifier la nature du compte principal dans Google Cloud. La valeur de type peut être user, group ou serviceAccount.

Toute expression CEL utilisée dans les règles a accès aux variables qui représentent l'objet traité. Les champs des variables sont basés sur le contenu des fichiers de métadonnées HDFS ou Apache Ranger. Les variables disponibles dépendent de la section de l'ensemble de règles :

  • Pour user_rules, utilisez la variable user.
  • Pour group_rules, utilisez la variable group.
  • Pour other_rules, utilisez la variable other.
  • Pour role_rules, utilisez la variable role.

L'exemple suivant mappe les utilisateurs de HDFS aux utilisateurs de la Google Cloud avec leur nom d'utilisateur, suivi de @google.com comme adresse e-mail :

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'"

Remplacer le mappage de rôle par défaut

Pour utiliser des comptes principaux non par défaut, vous pouvez ignorer ou modifier les mappages de rôle par défaut à l'aide des fichiers d'ensemble de règles.

L'exemple suivant montre comment ignorer une section de règles :

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

Créer un fichier YAML d'ensemble de règles d'autorisations

Un fichier YAML d'ensemble de règles d'autorisations est utilisé pour générer un fichier de mappage des autorisations cibles. Pour créer un fichier YAML d'ensemble de règles d'autorisations, utilisez des expressions CEL dans votre fichier YAML d'ensemble de règles d'autorisations pour mapper les autorisations HDFS ou Apache Ranger aux rôles Cloud Storage ou BigQuery.

Mappage de rôle par défaut

Les rôles de fichier HDFS sont déterminés par les autorisations de fichier source :

  • Si le bit w est défini, le rôle par défaut est writer
  • Si le bit r est défini, le rôle par défaut est reader
  • Si aucun des bits n'est défini, le rôle est vide.

Ranger HDFS:

  • Si l'ensemble d'accès contient write, le rôle par défaut est writer
  • Si l'ensemble d'accès contient read, le rôle par défaut est reader
  • Si l'ensemble d'accès ne contient aucun des deux, le rôle est vide.

Ranger:

  • Si l'ensemble d'accès contient update, create, drop, alter, index, lock, all, write ou refresh, le rôle par défaut est writer
  • Si l'ensemble d'accès contient select ou read, le rôle par défaut est reader
  • Si l'ensemble d'accès ne contient aucune des autorisations précédentes, le rôle est vide.

Cloud Storage:

  • roles/storage.objectUser : rédacteur
  • roles/storage.objectViewer : lecteur

BigQuery:

  • roles/bigquery.dataOwner : rédacteur
  • roles/bigquery.dataViewer : lecteur

L'exemple suivant montre comment accepter les mappages par défaut sans aucune modification dans le fichier YAML d'ensemble de règles :

ranger_hdfs_rules:
  - map: {}

Remplacer le mappage de rôle par défaut

Pour utiliser des rôles non par défaut, vous pouvez ignorer ou modifier les mappages de rôle par défaut à l'aide des fichiers d'ensemble de règles.

L'exemple suivant montre comment remplacer un mappage de rôle par défaut à l'aide d'une clause de mappage avec le champ de rôle à l'aide d'une clause de valeur :

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

Fusionner des mappages d'autorisations

Si plusieurs mappages d'autorisations sont générés pour la même ressource cible, le mappage avec l'accès le plus large est utilisé. Par exemple, si une règle HDFS attribue un rôle de lecteur au compte principal pa1 sur un emplacement HDFS, et qu'une règle Ranger attribue un rôle de rédacteur au même compte principal au même emplacement, le rôle de rédacteur est attribué.

Guillemets dans les expressions CEL

Utilisez des guillemets doubles "" pour délimiter l'ensemble de l'expression CEL en YAML. Dans l'expression CEL, utilisez des guillemets simples '' pour délimiter les chaînes. Exemple :

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