Ranger Cloud Storage 插件

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

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

准备工作

授予 Service Account Token Creator 以及适用于服务账号的 IAM Role Admin 角色 Dataproc 虚拟机服务账号

安装 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 服务具有以下政策:

使用提示

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

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

保护措施

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

  • VM 服务账号授予对 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 插件,用其来换取 Google 访问令牌, 允许访问 Cloud Storage。

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 字数统计作业时,作业会失败。

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 管理控制台网页中的 Access Manager 修改政策,将 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