Plug-in Ranger do Cloud Storage

O plug-in Dataproc Ranger do Cloud Storage, disponível com As versões de imagem 1.5 e 2.0 do Dataproc ativam um serviço de autorização em cada VM do cluster do Dataproc. O serviço de autorização avalia as solicitações do conector do Cloud Storage em relação às políticas do Ranger e, se a solicitação for permitida, retorna um token de acesso para a conta de serviço da VM do cluster.

O plug-in do Ranger Cloud Storage depende do Kerberos para autenticação e se integra ao suporte do conector do Cloud Storage para tokens de delegação. Os tokens de delegação são armazenados em um banco de dados MySQL no nó mestre do cluster. A senha raiz do banco de dados é especificada pelas propriedades do cluster quando você cria o cluster do Dataproc.

Antes de começar

Conceda Criador de token de conta de serviço e o papel de Administrador de papéis do IAM no Conta de serviço da VM do Dataproc em seu projeto.

Instalar o plug-in do Ranger para Cloud Storage

Execute os comandos a seguir em uma janela de terminal local ou no Cloud Shell para instalar o plug-in do Ranger para o Cloud Storage ao criar um cluster do Dataproc.

Defina as variáveis de ambiente

export CLUSTER_NAME=new-cluster-name \
    export REGION=region \
    export KERBEROS_KMS_KEY_URI=Kerberos-KMS-key-URI \
    export KERBEROS_PASSWORD_URI=Kerberos-password-URI \
    export RANGER_ADMIN_PASSWORD_KMS_KEY_URI=Ranger-admin-password-KMS-key-URI \
    export RANGER_ADMIN_PASSWORD_GCS_URI=Ranger-admin-password-GCS-URI \
    export RANGER_GCS_PLUGIN_MYSQL_KMS_KEY_URI=MySQL-root-password-KMS-key-URI \
    export RANGER_GCS_PLUGIN_MYSQL_PASSWORD_URI=MySQL-root-password-GCS-URI

Observações:

Criar um cluster do Dataproc

Execute o comando a seguir para criar um cluster do Dataproc e instalar o Ranger plug-in do Cloud Storage no cluster.

gcloud dataproc clusters create ${CLUSTER_NAME} \
    --region=${REGION} \
    --scopes cloud-platform \
    --enable-component-gateway \
    --optional-components=SOLR,RANGER \
    --kerberos-kms-key=${KERBEROS_KMS_KEY_URI} \
    --kerberos-root-principal-password-uri=${KERBEROS_PASSWORD_URI} \
    --properties="dataproc:ranger.gcs.plugin.enable=true, \
      dataproc:ranger.kms.key.uri=${RANGER_ADMIN_PASSWORD_KMS_KEY_URI}, \
      dataproc:ranger.admin.password.uri=${RANGER_ADMIN_PASSWORD_GCS_URI}, \
      dataproc:ranger.gcs.plugin.mysql.kms.key.uri=${RANGER_GCS_PLUGIN_MYSQL_KMS_KEY_URI}, \
      dataproc:ranger.gcs.plugin.mysql.password.uri=${RANGER_GCS_PLUGIN_MYSQL_PASSWORD_URI}"

Observações:

  • Versão da imagem 1.5: se você estiver criando um cluster da versão de imagem 1.5 (consulte Seleção de versões), adicione a sinalização --metadata=GCS_CONNECTOR_VERSION="2.2.6" or higher para instalar a versão necessária do conector.

Verificar a instalação do plug-in do Ranger Cloud Storage

Depois que a criação do cluster for concluída, um tipo de serviço GCS, chamado gcs-dataproc, vai aparecer na interface da Web de administrador do Ranger.

Políticas padrão do plug-in Ranger para Cloud Storage

O serviço gcs-dataproc padrão tem as seguintes políticas:

  • Políticas de leitura e gravação no Dataproc buckets temporários e de teste do cluster

  • Uma política all - bucket, object-path, que permite que todos os usuários acessem os metadados de todos os objetos. Esse acesso é necessário para permitir que o conector do Cloud Storage execute operações do HCFS (Hadoop Compatible Filesystem).

Dicas de uso

Acesso de apps às pastas do bucket

Para acomodar apps que criam arquivos intermediários no bucket do Cloud Storage, é possível conceder permissões Modify Objects, List Objects e Delete Objects no caminho do bucket do Cloud Storage e selecionar o modo recursive para estender as permissões aos subcaminhos no caminho especificado.

Medidas de proteção

Para ajudar a evitar a fraude do plug-in:

  • Conceda à conta de serviço da VM acesso aos recursos nos seus buckets do Cloud Storage para permitir que ela conceda acesso a esses recursos com tokens de acesso de escopo reduzido. Consulte Permissões do IAM para o Cloud Storage. Além disso, remova o acesso dos usuários aos recursos do bucket para evitar o acesso direto.

  • Desativar sudo e outros meios de acesso raiz nas VMs do cluster, incluindo atualização o arquivo sudoer, para evitar falsificação de identidade ou alterações nas autenticações e as configurações de autorização. Para mais informações, consulte as instruções do Linux para adicionar/remover privilégios de usuário sudo.

  • Use iptable para bloquear solicitações de acesso direto ao Cloud Storage das VMs do cluster. Por exemplo, é possível bloquear o acesso ao servidor de metadados da VM para impedir o acesso à credencial da conta de serviço da VM ou ao token de acesso usado para autenticar e autorizar o acesso ao Cloud Storage (consulte block_vm_metadata_server.sh, um script de inicialização que usa regras iptable para bloquear o acesso ao servidor de metadados da VM).

Jobs do Spark, Hive-on-MapReduce e Hive-on-Tez

Para proteger os detalhes confidenciais de autenticação do usuário e reduzir a carga da Key Distribution Center (KDC), o driver do Spark não distribui Kerberos credenciais aos executores. Em vez disso, o driver do Spark recebe uma permissão token do plug-in Ranger do Cloud Storage e, em seguida, distribui a token para os executores. Os executores usam o token de delegação para se autenticar no plug-in do Ranger Cloud Storage, trocando-o por um token de acesso do Google que permite o acesso ao Cloud Storage.

Os jobs Hive-on-MapReduce e Hive-on-Tez também usam tokens para acessar Cloud Storage. Use as propriedades a seguir para receber tokens e acessar buckets do Cloud Storage especificados ao enviar os seguintes tipos de jobs:

  • Jobs do Spark:

    --conf spark.yarn.access.hadoopFileSystems=gs://bucket-name,gs://bucket-name,...
    
  • Jobs do Hive-on-MapReduce:

    --hiveconf "mapreduce.job.hdfs-servers=gs://bucket-name,gs://bucket-name,..."
    
  • Jobs Hive-on-Tez:

    --hiveconf "tez.job.fs-servers=gs://bucket-name,gs://bucket-name,..."
    

Cenário do job do Spark

Um job de contagem de palavras do Spark falha quando executado uma janela do terminal em uma VM de cluster do Dataproc o plug-in Ranger para Cloud Storage instalado.

spark-submit \
    --conf spark.yarn.access.hadoopFileSystems=gs://${FILE_BUCKET} \
    --class org.apache.spark.examples.JavaWordCount \
    /usr/lib/spark/examples/jars/spark-examples.jar \
    gs://bucket-name/wordcount.txt

Observações:

  • FILE_BUCKET: bucket do Cloud Storage para acesso ao Spark.

Saída de erro:

Caused by: com.google.gcs.ranger.client.shaded.io.grpc.StatusRuntimeException: PERMISSION_DENIED:
Access denied by Ranger policy: User: '<USER>', Bucket: '<dataproc_temp_bucket>',
Object Path: 'a97127cf-f543-40c3-9851-32f172acc53b/spark-job-history/', Action: 'LIST_OBJECTS'

Observações:

  • O spark.yarn.access.hadoopFileSystems=gs://${FILE_BUCKET} é necessário em um ambiente ativado pelo Kerberos.

Saída de erro:

Caused by: java.lang.RuntimeException: Failed creating a SPNEGO token.
Make sure that you have run `kinit` and that your Kerberos configuration is correct.
See the full Kerberos error message: No valid credentials provided
(Mechanism level: No valid credentials provided)

Uma política é editada com o Gerenciador de acesso na interface da Web do administrador do Ranger. para adicionar username à lista de usuários que têm List Objects e outro bucket temp permissões.

A execução do job gera um novo erro.

Saída de erro:

com.google.gcs.ranger.client.shaded.io.grpc.StatusRuntimeException: PERMISSION_DENIED:
Access denied by Ranger policy: User: <USER>, Bucket: '<file-bucket>',
Object Path: 'wordcount.txt', Action: 'READ_OBJECTS'

Uma política é adicionada para conceder ao usuário acesso de leitura ao wordcount.text. Caminho do Cloud Storage.

O job é executado e concluído.

INFO com.google.cloud.hadoop.fs.gcs.auth.GcsDelegationTokens:
Using delegation token RangerGCSAuthorizationServerSessionToken
owner=<USER>, renewer=yarn, realUser=, issueDate=1654116824281,
maxDate=0, sequenceNumber=0, masterKeyId=0
this: 1
is: 1
a: 1
text: 1
file: 1
22/06/01 20:54:13 INFO org.sparkproject.jetty.server.AbstractConnector: Stopped