Plug-in Ranger do Cloud Storage

O plug-in do Cloud Storage do Dataproc Ranger, disponível nas versões de imagem 1.5 e 2.0 do Dataproc, ativa um serviço de autorização em cada VM de 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 de VM do cluster.

O plug-in do Ranger Cloud Storage depende do Kerberos para autenticação e se integra ao suporte ao 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 nas propriedades do cluster quando você cria o cluster do Dataproc.

Antes de começar

Conceda os papéis de Criador de token da conta de serviço e de Administrador de papéis do IAM na conta de serviço da VM do Dataproc no projeto.

Instalar o plug-in do Cloud Storage do Ranger

Execute os comandos a seguir em uma janela do terminal local ou no Cloud Shell para instalar o plug-in Ranger do 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:

Crie um cluster do Dataproc:

Execute o comando a seguir para criar um cluster do Dataproc e instalar o plug-in Ranger 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 Como selecionar 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 Cloud Storage do Ranger

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

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

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

Dicas de uso

Acesso de app a pastas do bucket

Para acomodar apps que criam arquivos intermediários no bucket do Cloud Storage, conceda as permissões Modify Objects, List Objects e Delete Objects no caminho do bucket do Cloud Storage e selecione o modo recursive para estender as permissões a subcaminhos no caminho especificado.

Medidas de proteção

Para ajudar a evitar a evasão do plug-in:

  • Conceda à conta de serviço de VM acesso aos recursos nos buckets do Cloud Storage. Assim, ela pode conceder acesso a esses recursos com tokens de acesso com 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 dos usuários ao bucket.

  • Desative sudo e outros meios de acesso raiz em VMs de cluster, incluindo a atualização do arquivo sudoer, para evitar falsificação de identidade ou alterações nas configurações de autenticação e 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 pelas 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 Spark, Hive-on-MapReduce e Hive-on-Tez

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

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

  • Jobs do Spark:

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

    --hiveconf "mapreduce.job.hdfs-servers=gs://bucket-name,gs://bucket-name,..."
    
  • Vagas da 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 em uma janela de terminal em uma VM de cluster do Dataproc que tem o plug-in Ranger do 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:

  • spark.yarn.access.hadoopFileSystems=gs://${FILE_BUCKET} é necessário em um ambiente ativado para 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 de administrador do Ranger para adicionar username à lista de usuários com List Objects e outras permissões de bucket temp.

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 caminho wordcount.text do Cloud Storage.

O job é executado e concluído com sucesso.

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