Como migrar permissões do Hadoop

Neste documento, descrevemos como migrar permissões do Apache Hadoop Distributed File System (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 primeiro criando um arquivo de configuração YAML de conjunto de regras principal. Em seguida, execute a ferramenta de migração de permissões com o arquivo YAML do conjunto de regras principal e 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 e os arquivos de configuração de mapeamento de tabelas, além dos 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. Você também pode 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 que mapeiam principais da sua origem para principais do IAM Trusted Cloud .

Para gerar um arquivo de mapeamento de principais, primeiro crie manualmente um arquivo YAML de conjunto de regras principais para definir como os principais são mapeados da sua origem para os principais do IAM Trusted Cloud . No arquivo YAML do conjunto de regras de principais, defina regras de mapeamento para cada uma das suas fontes, 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 em Trusted Cloud by S3NS:

  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.s3ns-system.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 Trusted 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 de criação de 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 do Apache Ranger gerado pela ferramenta dwh-migration-dumper ou ambos, dependendo da origem de migração das 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 seus arquivos de migração.

Depois de executar a ferramenta, inspecione o arquivo principals.yaml gerado para verificar se ele contém principais da sua origem mapeados para principais do IAM Trusted Cloud. Você pode 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 do conjunto de permissões de origem no cluster do Hadoop para papéis do IAM em pastas gerenciadas do BigQuery ou do Cloud Storage. Para gerar um arquivo de permissões de destino, primeiro crie 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 função padrão da tabela tab0 e usa os 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 de criação de 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 do Apache Ranger gerado pela ferramenta dwh-migration-dumper ou ambos, dependendo da origem de migração das permissões. Você também precisa 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 sua origem mapeadas para vinculações do IAM do Cloud Storage ou do BigQuery. Você pode editar o 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) em Trusted 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 nas 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 e ative um ambiente virtual.
  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 seu 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 Trusted Cloud. Os arquivos YAML de conjunto de regras usam a Common Expression Language (CEL) para especificar predicados (em que o resultado é booleano) e expressões (em que o resultado é 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, use 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 mudar 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 haver pelo menos uma regra que corresponda a todos os objetos 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 principal ou de mapeamento de função.

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 representa uma expressão booleana CEL. Os valores podem ser true ou false.
    • A regra só se aplica 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 representa uma expressão booleana 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 principais é usado para gerar identificadores principais fornecendo um valor para email_address e type.

  • Use email_address para especificar o e-mail do principal Trusted Cloud .
  • Use type para especificar a natureza do principal em Trusted 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 Trusted Cloudcom 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 função padrão

Para usar principais não padrão, pule ou modifique os mapeamentos de função padrão usando os arquivos de conjunto de regras.

O exemplo a seguir mostra como ignorar 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 arquivo YAML de conjunto de regras de permissões para mapear permissões do HDFS ou do Apache Ranger para papéis do Cloud Storage ou do BigQuery.

Mapeamento de função padrão

As funções de arquivo do HDFS são determinadas pelas permissões do arquivo de origem:

  • Se o bit w estiver definido, a função padrão será writer.
  • Se o bit r estiver definido, a função padrão será reader.
  • Se nenhum dos bits estiver definido, a função vai ficar vazia.

HDFS do Ranger:

  • Se o conjunto de acesso contiver write, a função padrão será writer.
  • Se o conjunto de acesso contiver read, a função padrão será reader.
  • Se o conjunto de acesso não contiver nenhum dos dois, a função vai ficar vazia.

Patrulheiro:

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

Cloud Storage:

  • roles/storage.objectUser: Writer
  • roles/storage.objectViewer: leitor

BigQuery:

  • roles/bigquery.dataOwner: Writer
  • roles/bigquery.dataViewer: leitor

O exemplo a seguir mostra como aceitar mapeamentos padrão sem fazer mudanças no arquivo YAML do conjunto de regras:

ranger_hdfs_rules:
  - map: {}

Substituir o mapeamento de função padrão

Para usar funções não padrão, pule ou modifique os mapeamentos de função padrão usando os arquivos de conjunto de regras.

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

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

Como mesclar mapeamentos de permissões

Se vários mapeamentos de permissões 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.

Como usar aspas em expressões CEL

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

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