Autenticación GCS utilizando el proveedor de credenciales Apache Hadoop en Dataproc

Esta publicación proporciona una descripción general y un ejemplo de autenticación GCS utilizando el proveedor de credenciales Apache Hadoop con credenciales de cuenta de servicio en Dataproc. Para las aplicaciones de los usuarios de Hadoop, esta técnica permite la recuperación perfecta de secretos en archivos de credenciales que tienen el acceso requerido a conjuntos de datos en Cloud Storage.

Visión general

El conector GCS proporciona interoperabilidad para aplicaciones Dataproc Hadoop (es decir, Spark, MapReduce, Hive) para acceder a conjuntos de datos almacenados en cubos GCS externos. De manera predeterminada, la autenticación y el acceso a GCS no los realiza el usuario de Hadoop que envía el trabajo, sino a través de la cuenta de servicio de host de las instancias de VM que ejecutan el clúster Dataproc.

El proveedor de credenciales Apache Hadoop habilita el mecanismo para almacenar y recuperar secretos en archivos cifrados (es decir, archivos JCEKS) en un sistema de archivos local o Hadoop. Además, el conector GCS admite poder recuperar y autenticar utilizando una credencial almacenada de forma segura por una aplicación Hadoop al acceder a GCS.

[diagrama 1 - flujo de alto nivel]

El diagrama anterior proporciona dos flujos para distinguir el acceso a datos a GCS solicitado por una aplicación Spark a través de 1) la cuenta de servicio de host predeterminada del clúster y 2) el acceso utilizando los secretos de la cuenta de servicio almacenados en el proveedor de credenciales de Hadoop. En este ejemplo, a la cuenta de servicio predeterminada sa-dataproc-instance no se le otorga un rol de IAM para acceder a data-bucket-a, pero sa-data-access-a sí puede acceder a los datos necesarios para ejecutar el trabajo. El flujo para la secuencia 1 es el flujo predeterminado al enviar trabajos y acceder a conjuntos de datos almacenados en GCS. En la secuencia 2, la aplicación spark define la ruta hadoop.security.credential.provider.path y cuando la aplicación solicita leer datos del Cloud Storage Bucket, el conector GCS recupera las credenciales de la cuenta de servicio utilizando el proveedor de credenciales y se autentica utilizando esas credenciales para acceso a datos-cubo-a.

Más adelante en este blog, veremos los pasos exactos para crear la cuenta del servicio de acceso a datos sa, almacenar las credenciales en un archivo JCEKS cifrado y usarlo para acceder a Google Cloud Storage.

Diseño de seguridad de clúster

Es importante implementar medidas de seguridad para proteger las credenciales que brindan acceso a los datos de GCS. En esta sección, revisamos los principios de alto nivel para bloquear estas credenciales en HDFS.

Los archivos Java KeyStore almacenan credenciales de cuenta de servicio cifradas que se crean utilizando la Utilidad de credenciales de Hadoop. La utilidad puede crear directamente los secretos cifrados y almacenarlos en HDFS con el permiso predeterminado 600. Las ACL de HDFS deben configurarse correctamente en el archivo y en el directorio principal para permitir que los usuarios de Hadoop solo tengan acceso a esta credencial.

Si solo un inquilino usa un clúster Dataproc, se pueden implementar medidas de seguridad del perímetro GCP estándar a nivel del Proyecto GCP y el clúster Dataproc para evitar el acceso injustificado al clúster y los secretos. Esto incluye permitir que solo los usuarios autorizados accedan al proyecto y al clúster de Dataproc que deberían tener acceso a las credenciales. Además, asegúrese de que la API de Dataproc Jobs y las API de Hadoop, como los puntos finales HDFS y YARN, incluidos WebHDFS, HTTP Rest API, etc., solo sean accesibles de manera similar para los usuarios que tienen acceso autorizado a las credenciales subyacentes.

Si un clúster Dataproc tiene múltiples inquilinos, los operadores se aseguran de que OSLogin esté habilitado para administrar el acceso SSH y las restricciones de sudo, pero también se requerirá que habilite el Modo seguro de Hadoop a través de Kerberos para exigir la autenticación de los usuarios de Hadoop. Los usuarios de Hadoop autenticados se aseguran de que solo los usuarios que tienen permiso con las ACL HDFS aplicadas en los archivos JCEKS cifrados tengan acceso. Sin la autenticación Kerberos, los usuarios de Hadoop pueden hacerse pasar por otros usuarios fácilmente y evitar los controles de acceso.

La seguridad de los archivos JCEKS con permisos y propiedad de HDFS garantiza que solo los usuarios autorizados puedan usar las credenciales al acceder a GCS. Otros métodos de autorización, como HDFS ACL y Apache Ranger, también se pueden usar para medidas de protección.

* El directorio HDFS y los permisos / propiedad de archivos se pueden habilitar estableciendo dfs.permissions.enabled en true en hdfs-site.xml.
* Las ACL de HDFS amplían el modelo de permisos / propiedad con la capacidad de aplicar permisos adicionales para que otros usuarios y grupos accedan a los mismos archivos / directorios. Las ACL se pueden habilitar estableciendo dfs.namenode.acls.enabled en true en hdfs-site.xml.

Por último, como una práctica recomendada adicional, las claves de la cuenta de servicio se pueden rotar periódicamente. Esto se puede hacer simplemente creando una nueva clave para la misma cuenta de servicio, generando e implementando un nuevo archivo JCEKS con las credenciales actualizadas, y eliminando la antigua clave de la cuenta de servicio después de que todas las aplicaciones de Hadoop se hayan cambiado para usar el último archivo de credenciales.

Crear y usar credenciales

Esta sección explica los siguientes pasos:

  1. Crear cuenta de servicio sa-data-access-a
    * Autorizar el acceso a través de IAM a GCS data-bucket-a
  2. Cree un archivo cifrado JCEKS con credenciales de cuenta de servicio utilizando la Utilidad de credenciales Hadoop
    * Archivo JCEKS seguro en HDFS
  3. Use las credenciales de JCEKS para acceder a GCS con el comando Hadoop fs, MapReduce, Spark o Hive.

1. Crear cuenta de servicio y autorizar acceso

En este primer paso, creamos una cuenta de servicio y aplicamos un rol de IAM para que acceda al bucket de datos GCS-bucket-a.

Crear cuenta de servicio y clave JSON

 PROJECT_ID = jh-data-sandbox 
SERVICE_ACCOUNT=sa-data-access-a@${PROJECT_ID}.iam.gserviceaccount.com
 Las cuentas de servicio gcloud iam crean $ {SERVICE_ACCOUNT} \ 
--description = "sa-data-access-a description" \
--display-name = $ {SERVICE_ACCOUNT}
 claves de cuentas de servicio gcloud iam \ 
crear ~ / $ {SERVICE_ACCOUNT} -key.json \
--iam-account ${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

Autorizar acceso mediante la aplicación de permisos IAM

Autorice el permiso de la cuenta de servicio storage.buckets.get para el depósito GCS de los clústeres de Dataproc:

 BUCKET = `gcloud dataproc clusters describe dataproc-015 --format =" value (config.configBucket) "` 
 gsutil iam ch serviceAccount: $ {SERVICE_ACCOUNT}: roles / storage.legacyBucketReader gs: // $ {BUCKET} 

Autorice el permiso de la cuenta de servicio para otros depósitos de GCS necesarios para el acceso a datos:

 gsutil iam ch serviceAccount: $ {SERVICE_ACCOUNT}: roles / storage.legacyBucketWriter gs: // data-bucket-a 

2. Crear archivo JCEKS de credenciales de Hadoop

 credencial hadoop create fs.gs.auth.service.account.email \ 
-proveedor jceks: //hdfs/app/client-app-a/sa-data-access-a.jceks \
-value "sa-data-access-a@jh-data-sandbox.iam.gserviceaccount.com"
 credencial de hadoop create fs.gs.auth.service.account.private.key.id \ 
-proveedor jceks: //hdfs/app/client-app-a/sa-data-access-a.jceks \
-valor "0a4e5cb521e2b7c75d082d7069f1cff75071f814"
 credencial hadoop create fs.gs.auth.service.account.private.key \ 
-proveedor jceks: //hdfs/app/client-app-a/sa-data-access-a.jceks \
-value "----- BEGIN PRIVATE KEY ----- \ n redacted \ n ----- END PRIVATE KEY ----- \ n"
 # aplica la propiedad HDFS a los usuarios y grupos apropiados que requieren acceso 
hadoop fs -chown -R $ {USER}: $ {USER} / app / client-app-a
hadoop fs -chmod 500 / app / client-app-a
hadoop fs -chmod 400 /app/client-app-a/sa-data-access-a.jceks
 # aplique ACL de HDFS (acls extendidos para configuración avanzada) para permiso de lectura para usuarios y grupos que requieren acceso 

3. Uso de secretos del proveedor de credenciales con el conector GCS

Cliente de Hadoop

 hadoop fs -Dhadoop.security.credential.provider.path = jceks: //hdfs/app/client-app-a/sa-data-access-a.jceks -ls gs: // data-bucket-a / 

MapReduce Job

 hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar teragen -Dhadoop.security.credential.provider.path = jceks: // hdfs / app / client-app-a / sa-data-access- a.jceks 100000 gs: // data-bucket-a / write-data-test / 

Chispa - chispear

 spark-submit --class org.apache.spark.examples.DFSReadWriteTest \ 
- hilo maestro \
- cluster de modo de despliegue \
--num-ejecutores 3 \
--conf spark.hadoop.hadoop.security.credential.provider.path = jceks: //hdfs/app/client-app-a/sa-data-access-a.jceks \
/usr/lib/spark/examples/jars/spark-examples.jar \
/var/log/google-dataproc-agent.0.log \
gs: // data-bucket-a / test-dfs-read-write /

Colmena

 # hive - table x es una tabla externa almacenada en gs: // data-bucket-a / x 
colmena --hiveconf hadoop.security.credential.provider.path = jceks: //hdfs/app/client-app-a/sa-data-access-a.jceks -e 'select count (1) from x;'
 # beeline 
beeline -u "jdbc: hive2: // dataproc-015-m: 10000 / default; principal=hive/dataproc-015-m@DATAPROC-015.ACME.COM" --hiveconf hadoop.security.credential.provider.path = jceks: //hdfs/app/client-app-a/sa-data-access-a.jceks -e 'seleccionar cuenta (1) de x;'

Resumen

En conclusión, proporcionamos un ejemplo para demostrar el uso del proveedor de credenciales Apache Hadoop para acceder sin problemas a las credenciales de cuentas de servicio cifradas almacenadas en archivos Java KeyStore al ejecutar aplicaciones Hadoop. Al proteger los archivos JCEKS en HDFS con permisos y aplicar la autenticación a través de Kerberos, solo las aplicaciones y los usuarios que pueden usar los secretos podrán usarlos para acceder a conjuntos de datos en Cloud Storage. Esta técnica proporciona un mecanismo y una opción adicional para usar diferentes credenciales para autenticar y acceder a los datos almacenados en GCS.

Recursos


La autenticación GCS con el proveedor de credenciales Apache Hadoop en Dataproc se publicó originalmente en Google Cloud - Community on Medium, donde las personas continúan la conversación resaltando y respondiendo a esta historia.