Como migrar permissões do Hadoop

Neste documento, descrevemos como migrar permissões do sistema de arquivos distribuídos do Apache Hadoop (HDFS), do Ranger HDFS e do Apache Hive para papéis do Identity and Access Management (IAM) no Cloud Storage ou no BigQuery.

O processo de migração de permissões consiste nas seguintes etapas:

  1. Gere um arquivo de mapeamento de principais criando primeiro um arquivo de configuração YAML de conjunto de regras de principal. Em seguida, execute a ferramenta de migração de permissões com o arquivo YAML do conjunto de regras de principal com os arquivos de metadados do HDFS ou do Ranger para gerar um arquivo de mapeamento de principais.
  2. Gere um arquivo de mapeamento de permissões de destino criando primeiro um arquivo YAML de conjunto de regras de permissões. Em seguida, execute a ferramenta de migração de permissões com o arquivo YAML do conjunto de regras de permissões, os arquivos de configuração de mapeamento de tabelas e os arquivos de metadados do HDFS ou do Ranger para gerar um arquivo de mapeamento de permissões de destino.
  3. Execute a ferramenta de migração de permissões com o arquivo de permissões de destino para aplicar permissões ao Cloud Storage ou ao BigQuery. Também é possível usar o script Python fornecido para gerar um arquivo do Terraform que pode ser usado para aplicar permissões por conta própria.

Antes de começar

Antes de migrar as permissões, verifique se você fez o seguinte:

Também é possível encontrar o script do gerador do Terraform no arquivo terraform.zip dentro do pacote de lançamento.

Gerar um arquivo de mapeamento de principais

Um arquivo de mapeamento de principais define regras de mapeamento que mapeiam principais da sua origem para principais do IAM do Google Cloud .

Para gerar um arquivo de mapeamento de principais, primeiro crie manualmente um arquivo YAML de conjunto de regras de principal para definir como os principais são mapeados da origem para os principais do IAM do Google Cloud . No arquivo YAML do conjunto de regras de principais, defina regras de mapeamento para cada uma das suas origens, ranger, HDFS ou ambas.

O exemplo a seguir mostra um arquivo YAML de conjunto de regras de principais que mapeia grupos do Apache Ranger para contas de serviço no 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

O exemplo a seguir mostra um arquivo YAML de conjunto de regras de principais que mapeia usuários do HDFS para usuários específicos do 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

Para mais informações sobre a sintaxe para criar um arquivo YAML de conjunto de regras de principais, consulte Arquivos YAML de conjunto de regras.

Depois de criar um arquivo YAML de conjunto de regras de principais, faça upload dele para um bucket do Cloud Storage. Você também precisa incluir o arquivo HDFS, o arquivo Apache Ranger gerado pela ferramenta dwh-migration-dumper ou ambos, dependendo da origem de onde você está migrando as permissões. Em seguida, execute a ferramenta de migração de permissões para gerar o arquivo de mapeamento de principais.

O exemplo a seguir mostra como executar a ferramenta de migração de permissões para migrar do HDFS e do Apache Ranger, resultando em um arquivo de mapeamento de principais chamado 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

Substitua MIGRATION_BUCKET pelo nome do bucket do Cloud Storage que contém os arquivos de migração.

Depois de executar a ferramenta, inspecione o arquivo principals.yaml gerado para verificar se ele contém principais da origem mapeados para principais do IAM do Google Cloud. É possível editar o arquivo manualmente antes das próximas etapas.

Gerar arquivo de permissões de destino

O arquivo de permissões de destino contém informações sobre o mapeamento de conjunto de permissões de origem definidas no cluster do Hadoop para papéis do IAM para pastas gerenciadas do BigQuery ou do Cloud Storage. Para gerar um arquivo de permissões de destino, primeiro é necessário criar manualmente um arquivo YAML de conjunto de regras de permissões que especifique como as permissões do Ranger ou do HDFS são mapeadas para o Cloud Storage ou o BigQuery.

O exemplo a seguir aceita todas as permissões do Ranger para o Cloud Storage:

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

O exemplo a seguir aceita todas as permissões do HDFS, exceto o principal hadoop:

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

O exemplo a seguir substitui o mapeamento de papéis padrão para a tabela tab0 e usa padrões para todas as outras permissões

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

Para mais informações sobre a sintaxe para criar um arquivo YAML de conjunto de regras de permissões, consulte Arquivos YAML de conjunto de regras.

Depois de criar um arquivo YAML de conjunto de regras de permissões, faça upload dele para um bucket do Cloud Storage. Você também precisa incluir o arquivo HDFS, o arquivo Apache Ranger gerado pela ferramenta dwh-migration-dumper ou ambos, dependendo da origem de onde você está migrando as permissões. Também é necessário incluir os arquivos YAML de configuração de tabelas e o arquivo de mapeamento de principais.

Em seguida, execute a ferramenta de migração de permissões para gerar o arquivo de permissões de destino.

O exemplo a seguir mostra como executar a ferramenta de migração de permissões para migrar do HDFS e do Apache Ranger, com os arquivos de configuração de mapeamento de tabelas e o arquivo de mapeamento de principais chamado principals.yaml, resultando em um arquivo de mapeamento de principais chamado 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

Substitua MIGRATION_BUCKET pelo nome do bucket do Cloud Storage que contém os arquivos de migração.

Depois de executar a ferramenta, inspecione o arquivo permissions.yaml gerado para verificar se ele contém permissões da origem mapeadas para as vinculações do IAM do Cloud Storage ou do BigQuery. É possível editar manualmente antes das próximas etapas.

Aplicar permissões

Depois de gerar um arquivo de permissões de destino, execute a ferramenta de migração de permissões para aplicar as permissões do IAM ao Cloud Storage ou ao BigQuery.

Antes de executar a ferramenta de migração de permissões, verifique se você atende aos seguintes pré-requisitos:

  • Você criou os principais necessários (usuários, grupos, contas de serviço) no Google Cloud.
  • Você criou as pastas ou tabelas gerenciadas do Cloud Storage que vão hospedar os dados migrados.
  • O usuário que executa a ferramenta tem permissões para gerenciar papéis para as pastas ou tabelas gerenciadas do Cloud Storage.

Para aplicar permissões, execute o seguinte comando:

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

Em que MIGRATION_BUCKET é o nome do bucket do Cloud Storage que contém os arquivos de migração.

Aplicar permissões como uma configuração do Terraform

Para aplicar as permissões migradas, também é possível converter o arquivo de permissões de destino em uma configuração de infraestrutura como código (IaC) do Terraform e aplicá-la ao Cloud Storage.

  1. Verifique se você tem o Python 3.7 ou uma versão mais recente.
  2. Crie um novo ambiente virtual e ative-o.
  3. No diretório permissions-migration/terraform, instale as dependências do arquivo requirements.txt usando o seguinte comando:

    python -m pip install -r requirements.txt
  4. Execute o comando do gerador:

    python tf_generator PATH LOCATION OUTPUT

    Substitua:

    • PATH: o caminho para o arquivo permissions.yaml gerado.
    • LOCATION: o local do bucket do Cloud Storage em que o script verifica e cria pastas com base na configuração de permissão.
    • OUTPUT: o caminho para o arquivo de saída, main.tf.

Arquivos YAML do conjunto de regras

Os arquivos YAML do conjunto de regras são usados para mapear principais e papéis ao migrar permissões do HDFS ou do Apache Ranger para o Google Cloud. Os arquivos YAML do conjunto de regras usam a Common Expression Language (CEL) para especificar predicados (em que o resultado é booleano) e expressões (em que o resultado é uma string).

Os arquivos YAML do conjunto de regras têm as seguintes características:

  • As regras de mapeamento de cada tipo são executadas sequencialmente de cima para baixo para cada objeto de entrada.
  • As expressões CEL têm acesso a variáveis de contexto, que dependem da seção do conjunto de regras. Por exemplo, é possível usar a variável user para mapear objetos de usuário de origem e a variável group para mapear grupos.
  • É possível usar expressões CEL ou valores estáticos para alterar os valores padrão. Por exemplo, ao mapear um grupo, é possível substituir o valor de saída type do valor padrão group por outro valor, como serviceAccount.
  • É necessário ter pelo menos uma regra que corresponda a cada objeto de entrada.

Em uma migração de permissões do HDFS ou do Apache Ranger, um arquivo YAML de conjunto de regras pode ser usado para definir um arquivo de mapeamento de principal ou de papel.

Regras de mapeamento em arquivos YAML de conjunto de regras

O arquivo YAML do conjunto de regras consiste em regras de mapeamento que especificam como os objetos correspondem da origem ao destino durante uma migração de permissões. Uma regra de mapeamento pode conter as seguintes seções ou cláusulas:

  • when: uma cláusula de predicado que limita a aplicabilidade da regra
    • Uma string que representa uma expressão booleana de CEL. Os valores podem ser true ou false.
    • A regra só será aplicada se a cláusula when for avaliada como true.
    • O valor padrão é true.
  • map: uma cláusula que especifica o conteúdo de um campo de resultado. O valor dessa cláusula depende do tipo de objeto processado e pode ser definido como:
    • expression para avaliar como uma string
    • value para uma string constante
  • skip: especifica que o objeto de entrada não deve ser mapeado.
    • Pode ser true ou false.
  • log: uma cláusula de predicado que ajuda a depurar ou desenvolver regras
    • Uma string que representa uma expressão booleana de CEL. Os valores podem ser true ou false.
    • O valor padrão é false.
    • Se definido como true, a saída vai conter um registro de execução que pode ser usado para monitorar ou diagnosticar problemas na execução.

Como criar um arquivo YAML de conjunto de regras principal

Um arquivo de mapeamento de principal é usado para gerar identificadores de principal fornecendo um valor para email_address e type.

  • Use email_address para especificar o e-mail do principal do Google Cloud .
  • Use type para especificar a natureza do principal em Google Cloud. O valor de type pode ser user, group ou serviceAccount.

Qualquer expressão CEL usada nas regras tem acesso a variáveis que representam o objeto processado. Os campos nas variáveis são baseados no conteúdo dos arquivos de metadados do HDFS ou do Apache Ranger. As variáveis disponíveis dependem da seção do conjunto de regras:

  • Para user_rules, use a variável user.
  • Para group_rules, use a variável group.
  • Para other_rules, use a variável other.
  • Para role_rules, use a variável role.

O exemplo a seguir mapeia usuários do HDFS para usuários no Google Cloud com o nome de usuário, seguido por @google.com como endereço de 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'"

Substituir o mapeamento de papéis padrão

Para usar principais não padrão, pule ou modifique os mapeamentos de papéis padrão usando os arquivos de conjunto de regras.

O exemplo a seguir mostra como pular uma seção de regras:

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

Como criar um arquivo YAML de conjunto de regras de permissões

Um arquivo YAML de conjunto de regras de permissões é usado para gerar um arquivo de mapeamento de permissões de destino. Para criar um arquivo YAML de conjunto de regras de permissões, use expressões CEL no YAML do conjunto de regras de permissões para mapear as permissões do HDFS ou do Apache Ranger para os papéis do Cloud Storage ou do BigQuery.

Mapeamento de papéis padrão

Os papéis de arquivo do HDFS são determinados pelas permissões do arquivo de origem:

  • Se o bit w estiver definido, o papel padrão será writer.
  • Se o bit r estiver definido, o papel padrão será reader.
  • Se nenhum bit estiver definido, o papel estará vazio.

Ranger HDFS:

  • Se o conjunto de acesso tiver write, o papel padrão será writer.
  • Se o conjunto de acesso tiver read, o papel padrão será reader.
  • Se o conjunto de acesso não tiver nenhum dos dois, o papel estará vazio.

Ranger:

  • Se o conjunto de acesso tiver update, create, drop, alter, index, lock, all, write ou refresh, o papel padrão será writer.
  • Se o conjunto de acesso tiver select ou read, o papel padrão será reader.
  • Se o conjunto de acesso não tiver nenhuma das permissões anteriores, o papel estará vazio.

Cloud Storage:

  • roles/storage.objectUser - Escritor
  • roles/storage.objectViewer: leitor

BigQuery:

  • roles/bigquery.dataOwner - Escritor
  • roles/bigquery.dataViewer: leitor

O exemplo a seguir mostra como aceitar mapeamentos padrão sem alterações no arquivo YAML do conjunto de regras:

ranger_hdfs_rules:
  - map: {}

Substituir o mapeamento de papéis padrão

Para usar papéis não padrão, pule ou modifique os mapeamentos de papéis padrão usando os arquivos de conjunto de regras.

O exemplo a seguir mostra como substituir um mapeamento de papel padrão usando uma cláusula de mapa com o campo de papel usando uma cláusula de valor:

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

Como mesclar mapeamentos de permissões

Se vários mapeamentos de permissão forem gerados para o mesmo recurso de destino, será usado o mapeamento com o acesso mais amplo. Por exemplo, se uma regra do HDFS conceder um papel de leitor ao principal pa1 em um local do HDFS, e uma regra do Ranger conceder um papel de gravador ao mesmo principal no mesmo local, o papel de gravador será atribuído.

Aspas de string em expressões CEL

Use aspas "" para envolver toda a expressão CEL em YAML. Na expressão CEL, use aspas simples '' para strings de aspas. Exemplo:

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