Ranger Cloud Storage 插件

Dataproc Ranger Cloud Storage 插件(适用于 Dataproc 映像版本 1.5 和 2.0)可在每个 Dataproc 集群虚拟机上激活授权服务。授权服务根据 Ranger 政策评估来自 Cloud Storage 连接器的请求,如果允许请求,则返回集群虚拟机服务帐号的访问令牌。

Ranger Cloud Storage 插件依赖 Kerberos 进行身份验证,并与 Cloud Storage 连接器对委托令牌的支持进行了集成。委派令牌存储在集群主服务器节点上的 MySQL 数据库中。数据库的根密码是在创建 Dataproc 集群时通过集群属性指定的。

准备工作

在项目中为 Dataproc 虚拟机服务帐号授予 Service Account Token Creator 角色和 IAM Role Admin 角色。

安装 Ranger Cloud Storage 插件

创建 Dataproc 集群时,在本地终端窗口或 Cloud Shell 中运行以下命令,以安装 Ranger Cloud Storage 插件。

设置环境变量

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

备注:

创建 Dataproc 集群

运行以下命令以创建 Dataproc 集群,并在该集群上安装 Ranger Cloud Storage 插件。

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}"

备注:

  • 1.5 映像版本:如果您要创建 1.5 映像版本的集群(请参阅选择版本),请添加 --metadata=GCS_CONNECTOR_VERSION="2.2.6" or higher 标志以安装所需的连接器版本。

验证 Ranger Cloud Storage 插件安装

集群创建完成后,Ranger 管理网页界面中会显示名为 gcs-dataprocGCS 服务类型。

Ranger Cloud Storage 插件默认政策

默认 gcs-dataproc 服务具有以下政策:

  • 要读取和写入 Dataproc 集群暂存和临时存储分区的政策

  • all - bucket, object-path 政策:允许所有用户访问所有对象的元数据。必须具备此访问权限,Cloud Storage 连接器才能执行 HCFS(Hadoop 兼容文件系统)操作。

使用提示

应用对存储桶文件夹的访问权限

为了适应在 Cloud Storage 存储桶中创建中间文件的应用,您可以授予 Cloud Storage 存储桶路径的 Modify ObjectsList ObjectsDelete Objects 权限,然后选择 recursive 模式以将权限扩展到指定路径上的子路径。

保护措施

为帮助防止插件被规避,请执行以下操作:

  • 您可以向虚拟机服务帐号授予对 Cloud Storage 存储分区中资源的访问权限,以便其使用缩小范围的访问令牌授予对这些资源的访问权限(请参阅 Cloud Storage 的 IAM 权限)。此外,请移除用户对存储桶资源的访问权限,以避免用户直接访问存储桶。

  • 停用集群虚拟机上的 sudo 和其他根访问权限(包括更新 sudoer 文件),以防止冒充别人或更改身份验证和授权设置。如需了解详情,请参阅有关添加/移除 sudo 用户权限的 Linux 说明。

  • 使用 iptable 阻止集群虚拟机对 Cloud Storage 的直接访问请求。例如,您可以阻止对虚拟机元数据服务器的访问,以防止访问用于对 Cloud Storage 进行身份验证和授权访问的虚拟机服务帐号凭据或访问令牌(请参阅 block_vm_metadata_server.sh,这是一个使用 iptable 规则阻止访问虚拟机元数据服务器的初始化脚本)。

Spark、Hive-on-MapReduce 和 Hive-on-Tez 作业

为了保护敏感的用户身份验证详细信息并减少密钥分发中心 (KDC) 上的负载,Spark 驱动程序不会将 Kerberos 凭据分发给执行程序。相反,Spark 驱动程序从 Ranger Cloud Storage 插件获取委托令牌,然后将委托令牌分发给执行程序。执行器使用委托令牌向 Ranger Cloud Storage 插件进行身份验证,以换取允许访问 Cloud Storage 的 Google 访问令牌。

Hive-on-MapReduce 和 Hive-on-Tez 作业也使用令牌访问 Cloud Storage。在提交以下作业类型时,请使用以下属性获取用于访问指定 Cloud Storage 存储分区的令牌:

  • Spark 作业

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

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

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

Spark 作业场景

从安装了 Ranger Cloud Storage 插件的 Dataproc 集群虚拟机上的终端窗口运行时,Spark Wordcount 作业会失败。

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

备注:

  • FILE_BUCKET:用于 Spark 访问的 Cloud Storage 存储桶。

错误输出:

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'

备注:

  • 在已启用 Kerberos 的环境中,需要使用 spark.yarn.access.hadoopFileSystems=gs://${FILE_BUCKET}

错误输出:

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)

使用 Ranger 管理员网页界面中的访问管理器修改政策,将 username 添加到具有 List Objects 和其他 temp 存储桶权限的用户列表中。

运行作业会生成新错误。

错误输出:

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'

添加了一项政策,以向用户授予对 wordcount.text Cloud Storage 路径的读取权限。

作业运行并成功完成。

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