Plug-in do Ranger Cloud Storage

O plugin do Dataproc Ranger Cloud Storage, disponível com as versões 1.5 e 2.0 da imagem do Dataproc, ativa um serviço de autorização em cada VM do cluster do Dataproc. O serviço de autorização avalia os pedidos do conetor do Cloud Storage em função das políticas do Ranger e, se o pedido for permitido, devolve um token de acesso para a conta de serviço da VM do cluster.

O plug-in do Ranger Cloud Storage baseia-se no Kerberos para autenticação e integra-se com o suporte do conetor do Cloud Storage para tokens de delegação. Os tokens de delegação são armazenados numa base de dados MySQL no nó principal do cluster. A palavra-passe de raiz da base de dados é especificada através das propriedades do cluster quando cria o cluster do Dataproc.

Antes de começar

Conceda a função criador de tokens de conta de serviço e a função administrador de funções de IAM na conta de serviço da VM do Dataproc no seu projeto.

Instale o plug-in de armazenamento na nuvem do Ranger

Execute os seguintes comandos numa janela de terminal local ou no Cloud Shell para instalar o plugin do Ranger Cloud Storage quando criar um cluster do Dataproc.

Defina 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

Notas:

Crie um cluster do Dataproc

Execute o seguinte comando para criar um cluster do Dataproc e instalar o plug-in do Ranger 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}"

Notas:

  • Versão de imagem 1.5: se estiver a criar um cluster de versão de imagem 1.5 (consulte a secção Selecionar versões), adicione a flag --metadata=GCS_CONNECTOR_VERSION="2.2.6" or higher para instalar a versão do conetor necessária.

Valide a instalação do plugin Ranger Cloud Storage

Após a conclusão da criação do cluster, é apresentado um tipo de serviço GCSdenominadogcs-dataproc na interface Web de administração do Ranger.

Políticas predefinidas do plug-in do Ranger Cloud Storage

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

  • Políticas para ler e escrever nos buckets de preparação e temporários do cluster do Dataproc

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

Sugestões de utilização

Acesso da app a pastas de contentores

Para acomodar apps que criam ficheiros intermédios no contentor do Cloud Storage, pode conceder autorizações Modify Objects, List Objects e Delete Objects no caminho do contentor do Cloud Storage e, em seguida, selecionar o modo recursive para estender as autorizações a subcaminhos no caminho especificado.

Medidas de proteção

Para ajudar a evitar a circumvenção do plug-in:

  • Conceda à conta de serviço da VM acesso aos recursos nos seus contentores do Cloud Storage para lhe permitir conceder acesso a esses recursos com tokens de acesso com âmbito reduzido (consulte as autorizações do IAM para o Cloud Storage). Além disso, remova o acesso dos utilizadores aos recursos do contentor para evitar o acesso direto dos utilizadores ao contentor.

  • Desative o sudo e outros meios de acesso root nas VMs do cluster, incluindo a atualização do ficheiro sudoer, para impedir a representação ou alterações às definições de autenticação e autorização. Para mais informações, consulte as instruções do Linux para adicionar/remover sudoprivilégios de utilizador.

  • Use iptable para bloquear pedidos de acesso direto ao Cloud Storage de VMs de cluster. Por exemplo, pode 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).

Tarefas Spark, Hive-on-MapReduce e Hive-on-Tez

Para proteger os detalhes de autenticação do utilizador confidenciais e reduzir a carga no centro de distribuição de chaves (KDC), o controlador do Spark não distribui credenciais do Kerberos aos executores. Em vez disso, o controlador do Spark obtém um token de delegação do plug-in do Ranger Cloud Storage e, em seguida, distribui o token de delegação aos executores. Os executores usam o token de delegação para fazer a autenticação no plug-in do Ranger Cloud Storage, trocando-o por um token de acesso Google que permite o acesso ao Cloud Storage.

As tarefas Hive-on-MapReduce e Hive-on-Tez também usam tokens para aceder ao Cloud Storage. Use as seguintes propriedades para obter tokens para aceder a contentores do Cloud Storage especificados quando envia os seguintes tipos de tarefas:

  • Empregos do Spark:

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

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

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

Cenário de tarefa do Spark

Uma tarefa de contagem de palavras do Spark falha quando é executada a partir de uma janela de terminal numa VM de cluster do Dataproc que tem o plug-in do Ranger 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

Notas:

  • FILE_BUCKET: contentor do Cloud Storage para acesso do 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'

Notas:

  • spark.yarn.access.hadoopFileSystems=gs://${FILE_BUCKET} é obrigatório num ambiente com o Kerberos ativado.

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 através do gestor de acesso na interface Web de administração do Ranger para adicionar username à lista de utilizadores que têm List Objects e outras autorizações de contentor temp.

A execução da tarefa 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'

É adicionada uma política para conceder ao utilizador acesso de leitura ao caminho do wordcount.text Cloud Storage.

O trabalho é executado e concluído com êxito.

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