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
注意:
- CLUSTER_NAME:新集群的名称。
- REGION:将在其中创建集群的区域,例如
us-west1
。 - KERBEROS_KMS_KEY_URI 和 KERBEROS_PASSWORD_URI:请参阅设置 Kerberos root 主账号密码。
- RANGER_ADMIN_PASSWORD_KMS_KEY_URI 和 RANGER_ADMIN_PASSWORD_GCS_URI:请参阅 设置您的 Ranger 管理员密码。
- RANGER_GCS_PLUGIN_MYSQL_KMS_KEY_URI 和 RANGER_GCS_PLUGIN_MYSQL_PASSWORD_URI:按照设置 Ranger 管理员密码时所用的相同步骤设置 MySQL 密码。
创建 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-dataproc
的 GCS
服务类型。
Ranger Cloud Storage 插件默认政策
默认的 gcs-dataproc
服务具有以下政策:
对 Dataproc 执行读写操作的政策 集群暂存存储分区和临时存储分区
all - bucket, object-path
政策,允许所有用户访问所有对象的元数据。必须具备此访问权限,才能允许 Cloud Storage 连接器 运行 HCFS (Hadoop 兼容文件系统) 操作。
使用提示
应用对存储桶文件夹的访问权限
为了适应在 Cloud Storage 存储桶中创建中间文件的应用,您可以授予对 Cloud Storage 存储桶路径的 Modify Objects
、List Objects
和 Delete 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