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 criando primeiro um arquivo de configuração YAML do conjunto de regras principais. Em seguida, execute a ferramenta de migração de permissões com o arquivo YAML do conjunto de regras principais 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 do 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 fonte para Google Cloud principais do IAM.

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

O exemplo a seguir mostra um arquivo YAML do conjunto de regras principais que mapeia grupos do Apache Ranger para contas de serviço em 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 do conjunto de regras principais que mapeia usuários do HDFS para usuários específicos 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 do conjunto de regras principais, consulte Arquivos YAML do conjunto de regras.

Depois de criar um arquivo YAML do conjunto de regras 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 fonte de que 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 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 fonte mapeados para Google Cloud principais do IAM. É 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 do conjunto de permissões de origem no cluster 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 crie manualmente um arquivo YAML do conjunto de regras de permissões que especifica 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 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 para criar um arquivo YAML do conjunto de regras de permissões, consulte Arquivos YAML do conjunto de regras.

Depois de criar um arquivo YAML do 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 fonte de que você está migrando as 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 seus 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 fonte mapeadas para vinculações do IAM do Cloud Storage ou do BigQuery. É possível editar o arquivo 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ê atendeu aos seguintes pré-requisitos:

  • Você criou os principais necessários (usuários, grupos, contas de serviço) em Google Cloud.
  • Você criou as tabelas ou pastas 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 tabelas ou pastas gerenciadas do Cloud Storage.

É possível aplicar permissões executando 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 seus 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á-lo ao Cloud Storage.

  1. Verifique se você tem o Python 3.7 ou 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 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 é 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, e as variáveis de contexto 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 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 que haja 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 do conjunto de regras pode ser usado para definir um arquivo de mapeamento principal ou um arquivo de mapeamento de papéis.

Regras de mapeamento em arquivos YAML do 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 CEL booleana. 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 representa uma expressão CEL booleana. Os valores podem ser true ou false
    • O valor padrão é false
    • Se definido como true, a saída conterá um registro de execução que pode ser usado para monitorar ou diagnosticar problemas na execução

Criar um arquivo YAML do conjunto de regras principais

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

  • Use email_address para especificar o e-mail do Google Cloud principal.
  • 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, é possível pular ou modificar os mapeamentos de papéis padrão usando os arquivos do 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

Criar um arquivo YAML do conjunto de regras de permissões

Um arquivo YAML do conjunto de regras de permissões é usado para gerar um arquivo de mapeamento de permissões de destino. Para criar um arquivo YAML do conjunto de regras de permissões, use expressões CEL no arquivo YAML do 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 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 dos bits estiver definido, o papel estará vazio

Ranger HDFS:

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

Patrulheiro:

  • Se o conjunto de acesso contiver update, create, drop, alter, index, lock, all, write, ou refresh, o papel 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 contiver nenhuma das permissões anteriores, o papel estará vazio

Cloud Storage:

  • roles/storage.objectUser - gravador
  • roles/storage.objectViewer - leitor

BigQuery:

  • roles/bigquery.dataOwner - gravador
  • 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, é possível pular ou modificar os mapeamentos de papéis padrão usando os arquivos do conjunto de regras.

O exemplo a seguir mostra como substituir um mapeamento de papéis 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"

Mesclar mapeamentos de permissões

Se vários mapeamentos de permissões forem gerados para o mesmo recurso de destino, o mapeamento com o acesso mais amplo será usado. 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.

Citação de strings em expressões CEL

Use aspas duplas "" 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'"