Plug-in do Ranger Cloud Storage

O plug-in do Ranger Cloud Storage do Serviço Gerenciado para Apache Spark, disponível nas versões 1.5 e 2.0 da imagem do Serviço Gerenciado para Apache Spark, ativa um serviço de autorização em cada VM do cluster do Serviço Gerenciado para Apache Spark. O serviço de autorização avalia 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 de 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 MySQL banco de dados no nó mestre do cluster. A senha raiz do banco de dados é especificada pelas propriedades do cluster ao criar o cluster do Serviço Gerenciado para Apache Spark.

Antes de começar

Conceda o papel de Criador de token da conta de serviço e o papel de administrador do IAM na conta de serviço da VM do Serviço Gerenciado para Apache Spark no seu projeto.

Instalar o plug-in do Ranger Cloud Storage

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

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 Serviço Gerenciado para Apache Spark

Execute o comando a seguir para criar um cluster do Serviço Gerenciado para Apache Spark 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}"

Observações:

  • Versão da imagem 1.5: se você estiver criando um cluster da versão 1.5 da imagem (consulte Selecionar versões), adicione a flag --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

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

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

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

  • Políticas para ler e gravar nos buckets temporários e de preparo do cluster do Serviço Gerenciado para Apache Spark

  • Uma política all - bucket, object-path, que permite que todos os usuários acessem 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 do app a pastas de bucket

Para acomodar apps que criam arquivos intermediários no bucket do Cloud Storage, conceda 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 aos subcaminhos no caminho especificado.

Medidas de proteção

Para ajudar a evitar a burla do plug-in:

  • Conceda à conta de serviço da VM acesso aos recursos nos buckets do Cloud Storage para permitir que ela conceda 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 ao bucket pelos usuários.

  • Desative sudo e outros meios de acesso raiz em VMs de cluster, incluindo a atualização do arquivo sudoer, para evitar a 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 de VMs de 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 iptable regras para bloquear o acesso ao servidor de metadados da VM).

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

Para proteger detalhes confidenciais de autenticação do usuário e reduzir a carga no centro de distribuição de chaves (KDC, na sigla em inglês), o driver do Spark não distribui credenciais do Kerberos para executores. Em vez disso, o driver do Spark recebe um token de delegação do plug-in do Ranger Cloud Storage e o distribui para executores. Os executores usam o token de delegação para autenticar o plug-in do Ranger Cloud Storage, trocando-o por um token de acesso do Google que permite o acesso ao Cloud Storage.

Os jobs do Hive-on-MapReduce e do Hive-on-Tez também usam tokens para acessar o Cloud Storage. Use as propriedades a seguir para receber tokens para 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 :

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

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

Cenário de job do Spark

Um job de contagem de palavras do Spark falha quando executado em uma janela de terminal em uma VM do cluster do Serviço Gerenciado para Apache Spark 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

Observações:

  • FILE_BUCKET: bucket 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'

Observações:

  • 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 usando o Gerenciador de acesso na interface da Web de administração do Ranger para adicionar username à lista de usuários que têm 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 do Cloud Storage wordcount.text.

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