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 集群时,您可以通过集群属性指定数据库的根密码。

准备工作

为项目中的 Dataproc VM 服务账号授予 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 服务具有以下政策:

使用提示

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

为了适应在 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 插件获取委托令牌,然后将委托令牌分发给执行器。执行器使用委托令牌对 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 字数统计作业时,作业会失败。

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