Complemento Ranger Cloud Storage

El complemento de Cloud Storage de Dataproc Ranger, disponible en las versiones de imagen 1.5 y 2.0 de Dataproc, activa un servicio de autorización en cada VM de clúster de Dataproc. El servicio de autorización evalúa las solicitudes del conector de Cloud Storage en función de las políticas de Ranger y, si se permite la solicitud, devuelve un token de acceso para la cuenta de servicio de la máquina virtual del clúster.

El complemento de Ranger Cloud Storage se basa en Kerberos para la autenticación y se integra con la compatibilidad del conector de Cloud Storage con los tokens de delegación. Los tokens de delegación se almacenan en una base de datos MySQL en el nodo maestro del clúster. La contraseña raíz de la base de datos se especifica mediante las propiedades del clúster al crear el clúster de Dataproc.

Antes de empezar

Asigna los roles Creador de tokens de cuenta de servicio y Administrador de roles de gestión de identidades y accesos a la cuenta de servicio de la VM de Dataproc de tu proyecto.

Instalar el complemento Ranger Cloud Storage

Ejecuta los siguientes comandos en una ventana de terminal local o en Cloud Shell para instalar el complemento Ranger Cloud Storage al crear un clúster de Dataproc.

Establece variables de entorno:

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:

Crear una agrupación Dataproc

Ejecuta el siguiente comando para crear un clúster de Dataproc e instalar el complemento Ranger Cloud Storage en el clúster.

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:

  • Versión de imagen 1.5: si vas a crear un clúster de versión de imagen 1.5 (consulta Seleccionar versiones), añade la marca --metadata=GCS_CONNECTOR_VERSION="2.2.6" or higher para instalar la versión del conector necesaria.

Verificar la instalación del complemento Ranger Cloud Storage

Una vez que se haya creado el clúster, aparecerá un tipo de servicio GCS llamado gcs-dataproc en la interfaz web de administración de Ranger.

Políticas predeterminadas del complemento Ranger Cloud Storage

El servicio gcs-dataproc predeterminado tiene las siguientes políticas:

Consejos de uso

Acceso de las aplicaciones a las carpetas de los segmentos

Para dar cabida a las aplicaciones que crean archivos intermedios en un segmento de Cloud Storage, puedes conceder los permisos Modify Objects, List Objects y Delete Objects en la ruta del segmento de Cloud Storage y, a continuación, seleccionar el modo recursive para ampliar los permisos a las subrutas de la ruta especificada.

Medidas de protección

Para evitar que se eluda el complemento, sigue estos pasos:

  • Concede a la cuenta de servicio de la VM acceso a los recursos de tus segmentos de Cloud Storage para que pueda conceder acceso a esos recursos con tokens de acceso de ámbito reducido (consulta los permisos de gestión de identidades y accesos de Cloud Storage). Además, elimina el acceso de los usuarios a los recursos del contenedor para evitar que accedan directamente a él.

  • Inhabilita sudo y otros medios de acceso raíz en las VMs del clúster, incluida la actualización del archivo sudoer, para evitar la suplantación de identidad o los cambios en la configuración de autenticación y autorización. Para obtener más información, consulta las instrucciones de Linux para añadir o quitar privilegios de usuario de sudo.

  • Usa iptable para bloquear las solicitudes de acceso directo a Cloud Storage desde las VMs del clúster. Por ejemplo, puedes bloquear el acceso al servidor de metadatos de la VM para impedir el acceso a la credencial o al token de acceso de la cuenta de servicio de la VM que se usa para autenticar y autorizar el acceso a Cloud Storage (consulta block_vm_metadata_server.sh, un script de inicialización que usa reglas de iptable para bloquear el acceso al servidor de metadatos de la VM).

Tareas de Spark, Hive en MapReduce y Hive en Tez

Para proteger los detalles de autenticación de los usuarios sensibles y reducir la carga del centro de distribución de claves (KDC), el controlador de Spark no distribuye las credenciales de Kerberos a los ejecutores. En su lugar, el controlador de Spark obtiene un token de delegación del complemento de Ranger Cloud Storage y, a continuación, distribuye el token de delegación a los ejecutores. Los ejecutores usan el token de delegación para autenticarse en el complemento Ranger Cloud Storage, que lo cambia por un token de acceso de Google que permite acceder a Cloud Storage.

Los trabajos de Hive en MapReduce y Hive en Tez también usan tokens para acceder a Cloud Storage. Usa las siguientes propiedades para obtener tokens con los que acceder a los segmentos de Cloud Storage especificados al enviar los siguientes tipos de trabajos:

  • Tareas de Spark:

    --conf spark.yarn.access.hadoopFileSystems=gs://bucket-name,gs://bucket-name,...
    
  • Tareas de Hive en MapReduce:

    --hiveconf "mapreduce.job.hdfs-servers=gs://bucket-name,gs://bucket-name,..."
    
  • Tareas de Hive en Tez:

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

Situación de una tarea de Spark

Una tarea de recuento de palabras de Spark falla cuando se ejecuta desde una ventana de terminal en una VM de un clúster de Dataproc que tiene instalado el complemento Ranger Cloud Storage.

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: segmento de Cloud Storage para el acceso de Spark.

Error:

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} es obligatorio en un entorno habilitado para Kerberos.

Error:

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)

Una política se edita mediante el Gestor de acceso en la interfaz web de administración de Ranger para añadir username a la lista de usuarios que tienen List Objects y otros permisos de temp de los contenedores.

Al ejecutar el trabajo, se genera un nuevo error.

Error:

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'

Se añade una política para conceder al usuario acceso de lectura a la ruta de wordcount.text Cloud Storage.

La tarea se ejecuta y se completa correctamente.

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