隨 Dataproc 1.5 與 2.0 映像檔版本提供的 Dataproc Ranger Cloud Storage 外掛程式,會在每個 Dataproc 叢集 VM 上啟動一項授權服務。該授權服務會根據 Ranger 政策評估 Cloud Storage 連接器的要求,若要求獲准,則會為叢集 VM 服務帳戶傳回存取權杖。
Ranger Cloud Storage 外掛程式會使用 Kerberos 進行驗證,並整合 Cloud Storage 連接器支援的委派權杖。委派權杖會儲存在叢集主要執行個體節點的 MySQL 資料庫中。建立 Dataproc 叢集時,可透過叢集屬性指定資料庫的根密碼。
事前準備
請在專案中,將服務帳戶權杖建立者角色與 IAM 角色管理員角色授予Dataproc VM 服務帳戶。
安裝 Ranger Cloud Storage 外掛程式
在本機終端機視窗或 Cloud Shell 中執行下列指令,藉此在建立 Dataproc 叢集時安裝 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 根主體密碼」。
- 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 叢集暫存及臨時 bucket 資料的讀寫政策
一項
all - bucket, object-path政策,允許所有使用者存取全部物件的中繼資料。Cloud Storage 連接器必須有此存取權限,才能執行 HCFS (Hadoop 相容檔案系統) 作業。
使用提示
為應用程式設定 bucket 資料夾的存取權限
為支援特定應用程式在 Cloud Storage bucket 建立中繼檔案,請針對 Cloud Storage bucket 路徑授予 Modify Objects、List Objects 和 Delete Objects 權限,然後選取 recursive 模式,將權限擴展至指定路徑下的子路徑。
保護措施
為避免外掛程式的存取控管機制遭到規避:
請為 VM 服務帳戶授予 Cloud Storage bucket 資源的存取權限,以允許其使用縮減範圍的存取權杖來授予相關資源的存取權 (請參閱「Cloud Storage 的 IAM 權限」)。同時,也請移除使用者對 bucket 資源的存取權,避免使用者直接存取 bucket。
在叢集 VM 上停用
sudo和其他根層級存取方式,包括更新sudoer檔案,防止他人冒用身分或變更驗證和授權設定。詳情請參閱 Linux 操作說明,瞭解如何新增/移除sudo使用者權限。使用
iptable來封鎖叢集 VM 對 Cloud Storage 的直接存取要求。例如,可以禁止存取 VM 中繼資料伺服器,防止他人取得 VM 服務帳戶憑證或存取權杖,將其用於驗證和授予 Cloud Storage 的存取權 (請參閱block_vm_metadata_server.sh,這項初始化指令碼正是使用iptable規則,來封鎖對 VM 中繼資料伺服器的存取)。
Spark、Hive-on-MapReduce 和 Hive-on-Tez 工作
為保護機密的使用者驗證詳細資料,並減輕 Key Distribution Center (KDC) 的負擔,Spark 驅動程式不會將 Kerberos 憑證分配給執行器,而是從 Ranger Cloud Storage 外掛程式取得委派權杖,再將委派權杖分配給執行器;執行器則用此委派權杖向 Ranger Cloud Storage 外掛程式驗證身分,據以換取 Google 存取權杖,用於存取 Cloud Storage。
Hive-on-MapReduce 和 Hive-on-Tez 工作也需使用權杖來存取 Cloud Storage。在提交以下類型的工作時,請按照列出的屬性取得相關權杖,以存取指定的 Cloud Storage bucket:
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 叢集 VM 上,透過終端機視窗執行的一件 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 bucket。
錯誤輸出內容:
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'
新增一項政策,授予使用者對 Cloud Storage 中 wordcount.text 路徑的讀取權限。
工作順利執行完成。
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