Plug-in Ranger Cloud Storage

Le plug-in Managed Service pour Apache Spark Ranger Cloud Storage, disponible avec les versions d'image 1.5 et 2.0 de Managed Service pour Apache Spark, active un service d'autorisation sur chaque VM de cluster Managed Service pour Apache Spark. Le service d'autorisation évalue les requêtes du connecteur Cloud Storage par rapport aux règles Ranger et, si la requête est autorisée, renvoie un jeton d'accès pour le compte de service de la VM de cluster.

Le plug-in Ranger Cloud Storage s'appuie sur Kerberos pour l'authentification, et s'intègre à la prise en charge des jetons de délégation du connecteur Cloud Storage. Les jetons de délégation sont stockés dans une MySQL sur le nœud maître du cluster. Le mot de passe racine de la base de données est spécifié via les propriétés du cluster lorsque vous créez le cluster Managed Service pour Apache Spark.

Avant de commencer

Attribuez le rôle Créateur de jetons du compte de service et le rôle Administrateur de rôle IAM au compte de service de la VM Managed Service pour Apache Spark dans votre projet.

Installer le plug-in Ranger Cloud Storage

Exécutez les commandes suivantes dans une fenêtre de terminal locale ou dans Cloud Shell pour installer le plug-in Ranger Cloud Storage lorsque vous créez un cluster Managed Service for Apache Spark.

Définir des variables d'environnement

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

Remarques :

Créer un cluster Managed Service pour Apache Spark

Exécutez la commande suivante pour créer un cluster Managed Service pour Apache Spark et installer le plug-in Ranger Cloud Storage sur le 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}"

Remarques :

  • Version d'image 1.5 : si vous créez un cluster de version d'image 1.5 (voir Sélectionner des versions), ajoutez l'indicateur --metadata=GCS_CONNECTOR_VERSION="2.2.6" or higher pour installer la version requise du connecteur.

Vérifier l'installation du plug-in Ranger Cloud Storage

Une fois la création du cluster terminée, un type de service GCS, nommégcs-dataproc, s'affiche dans l'interface Web d'administration Ranger.

Règles par défaut du plug-in Ranger Cloud Storage

Le service gcs-dataproc par défaut comporte les règles suivantes :

  • Règles de lecture et d'écriture dans les buckets de préproduction et les buckets temporaires du cluster Managed Service pour Apache Spark

  • Une règle all - bucket, object-path, qui permet à tous les utilisateurs d'accéder aux métadonnées de tous les objets. Cet accès est requis pour permettre au connecteur Cloud Storage d'effectuer des opérations HCFS (Hadoop Compatible Filesystem) .

Conseils d'utilisation

Accès des applications aux dossiers de bucket

Pour prendre en charge les applications qui créent des fichiers intermédiaires dans un bucket Cloud Storage, vous pouvez accorder les autorisations Modify Objects, List Objects et Delete Objects sur le chemin d'accès au bucket Cloud Storage, puis sélectionner le mode recursive pour étendre les autorisations aux sous-chemins d'accès du chemin spécifié.

Mesures de protection

Pour éviter le contournement du plug-in :

  • Accordez au compte de service de la VM l'accès aux ressources de vos buckets Cloud Storage pour lui permettre d'accorder l'accès à ces ressources avec des jetons d'accès à portée limitée (voir Autorisations IAM pour Cloud Storage). Supprimez également l'accès des utilisateurs aux ressources de bucket pour éviter qu'ils n'y accèdent directement.

  • Désactivez sudo et les autres moyens d'accès racine sur les VM de cluster, y compris la mise à jour du sudoer fichier, pour éviter l'emprunt d'identité ou les modifications des paramètres d'authentification et d'autorisation. Pour en savoir plus, consultez les instructions Linux pour ajouter/supprimer des droits d'utilisateur sudo.

  • Utilisez iptable pour bloquer les requêtes d'accès direct à Cloud Storage à partir des VM de cluster. Par exemple, vous pouvez bloquer l'accès au serveur de métadonnées de la VM pour empêcher l'accès aux identifiants ou au jeton d'accès du compte de service de la VM utilisés pour authentifier et autoriser l'accès à Cloud Storage (voir block_vm_metadata_server.sh, un script d'initialisation qui utilise des règles iptable pour bloquer l'accès au serveur de métadonnées de la VM).

Tâches Spark, Hive-on-MapReduce et Hive-on-Tez

Pour protéger les informations d'authentification sensibles des utilisateurs et réduire la charge sur le centre de distribution de clés (KDC), le pilote Spark ne distribue pas les identifiants Kerberos aux exécutants. Au lieu de cela, le pilote Spark obtient un jeton de délégation à partir du plug-in Ranger Cloud Storage, puis le distribue aux exécutants. Les exécutants utilisent le jeton de délégation pour s'authentifier auprès du plug-in Ranger Cloud Storage, en l'échange d'un jeton d'accès Google qui permet d'accéder à Cloud Storage.

Les tâches Hive-on-MapReduce et Hive-on-Tez utilisent également des jetons pour accéder à Cloud Storage. Utilisez les propriétés suivantes pour obtenir des jetons permettant d'accéder aux buckets Cloud Storage spécifiés lorsque vous envoyez les types de tâches suivants :

  • Tâches Spark :

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

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

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

Scénario de tâche Spark

Une tâche Spark wordcount échoue lorsqu'elle est exécutée à partir de une fenêtre de terminal sur une VM de cluster Managed Service pour Apache Spark sur laquelle le plug-in Ranger Cloud Storage est installé.

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

Remarques :

  • FILE_BUCKET : bucket Cloud Storage pour l'accès Spark.

Erreur : .

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'

Remarques :

  • spark.yarn.access.hadoopFileSystems=gs://${FILE_BUCKET} est requis dans un environnement compatible avec Kerberos.

Erreur : .

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)

Une règle est modifiée à l'aide du Gestionnaire d'accès dans l'interface Web d'administration Ranger pour ajouter username à la liste des utilisateurs disposant de List Objects et d'autres autorisations de bucket temp.

L'exécution de la tâche génère une nouvelle erreur.

Erreur : .

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'

Une règle est ajoutée pour accorder à l'utilisateur un accès en lecture au chemin d'accès Cloud Storage wordcount.text.

La tâche s'exécute et se termine correctement.

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