建立 Dataproc 叢集時,可以透過 Kerberos 啟用 Hadoop 安全模式,在 Dataproc 叢集中提供使用者驗證、隔離和加密功能,實現多租戶架構。
使用者驗證和其他 Google Cloud Platform 服務。使用 Kerberos 進行使用者驗證時,只會套用至叢集內。與其他服務 (例如 Cloud Storage) 互動時,系統仍會以叢集的服務帳戶進行驗證。 Google Cloud
使用 Kerberos 啟用 Hadoop 安全模式
為叢集啟用 Kerberos 和 Hadoop 安全模式時,系統會包含 Kerberos 的 MIT 分布,並設定 Apache Hadoop YARN、HDFS、Hive、Spark 和相關元件,以使用其進行驗證。
啟用 Kerberos 會建立叢集上的金鑰發布中心 (KDC),其中包含服務主體和根主體。根主體為具有叢集上 KDC 的管理員權限帳戶。它也可包含標準使用者主體,或經由跨領域信任連接至另一個包含使用者主體的 KDC。
建立 Kerberos 叢集
您可以使用 Google Cloud CLI、Dataproc API 或Google Cloud 控制台,在採用 Dataproc 1.3 以上版本映像檔的叢集上啟用 Kerberos。
gcloud 指令
如要自動設定新的 Kerberos Dataproc 叢集 (映像檔版本 1.3 以上),請使用 gcloud dataproc clusters create
指令。
gcloud dataproc clusters create cluster-name \ --image-version=2.0 \ --enable-kerberos
叢集屬性: 您可以使用 --properties "dataproc:kerberos.beta.automatic-config.enable=true"
標記,將叢集建立指令傳遞至叢集建立指令,自動設定 Kerberos,而不必使用上例中的 --enable-kerberos
標記 (請參閱「Dataproc 服務屬性」)。
REST API
您可以透過 ClusterConfig.SecurityConfig.KerberosConfig,在 clusters.create 要求中建立 Kerberos 叢集。您必須將 enableKerberos
設為 true
。
控制台
如要在新叢集上自動設定 Kerberos,請前往 Google Cloud 控制台的 Dataproc「建立叢集」頁面,然後在「管理安全性」面板的「Kerberos 和 Hadoop 安全模式」部分選取「啟用」。
使用自己的根主體密碼建立 Kerberos 叢集
設定 Kerberos 根主體密碼,然後建立叢集。
設定 Kerberos 根主體密碼
Kerberos 根主體為具有叢集上 KDC 管理員權限的帳戶。如要安全地提供 Kerberos 根主體的密碼,使用者可以透過 Key Management Service (KMS) 金鑰加密密碼,然後將密碼儲存在叢集服務帳戶可存取的 Google Cloud Storage 值區中。叢集服務帳戶必須被授予 cloudkms.cryptoKeyDecrypter
IAM 角色。
將 Cloud KMS CryptoKey Encrypter/Decrypter 角色授予叢集服務帳戶:
gcloud projects add-iam-policy-binding project-id \ --member serviceAccount:project-number-compute@developer.gserviceaccount.com \ --role roles/cloudkms.cryptoKeyDecrypter
建立金鑰環:
gcloud kms keyrings create my-keyring --location global
在金鑰環中建立金鑰:
gcloud kms keys create my-key \ --location global \ --keyring my-keyring \ --purpose encryption
加密 Kerberos 根主體密碼:
echo "my-password" | \ gcloud kms encrypt \ --location=global \ --keyring=my-keyring \ --key=my-key \ --plaintext-file=- \ --ciphertext-file=kerberos-root-principal-password.encrypted
- 將加密密碼上傳至專案中的 Cloud Storage bucket。
- 範例:
gcloud storage cp kerberos-root-principal-password.encrypted gs://my-bucket
- 範例:
- 將加密密碼上傳至專案中的 Cloud Storage bucket。
建立叢集
您可以使用 gcloud
指令或 Dataproc API,在叢集上啟用 Kerberos,並使用自己的根主體密碼。
gcloud 指令
如要建立 Kerberos Dataproc 叢集 (使用 1.3 以上版本的映像檔),請使用 gcloud dataproc clusters create
指令。
gcloud dataproc clusters create cluster-name \ --region=region \ --image-version=2.0 \ --kerberos-root-principal-password-uri=gs://my-bucket/kerberos-root-principal-password.encrypted \ --kerberos-kms-key=projects/project-id/locations/global/keyRings/my-keyring/cryptoKeys/my-key
使用 YAML (或 JSON) 設定檔。您可以將 Kerberos 設定放在 YAML (或 JSON) 設定檔中,然後參照該設定檔建立 Kerberos 叢集,而不必如上所示將 kerberos-*
標記傳遞至 gcloud
指令。
- 建立設定檔 (請參閱安全資料傳輸層 (SSL) 憑證、其他 Kerberos 設定和跨領域信任,瞭解可加入檔案的其他設定):
root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key
- 使用下列
gcloud
指令建立 Kerberos 叢集:gcloud dataproc clusters create cluster-name \ --region=region \ --kerberos-config-file=local path to config-file \ --image-version=2.0
安全性考量。在新增根主體到 KDC 後,Dataproc 會捨棄已加密的密碼表單。為安全起見,建立叢集後,您可以選擇刪除密碼檔案和用於解密密碼的金鑰,並從 kmsKeyDecrypter
角色移除服務帳戶。如果您打算擴大叢集,請勿執行這項操作,因為這需要密碼檔案和金鑰,以及服務帳戶角色。
REST API
您可以透過 ClusterConfig.SecurityConfig.KerberosConfig,在 clusters.create 要求中建立 Kerberos 叢集。將 enableKerberos
設為 true,並設定 rootPrincipalPasswordUri
和 kmsKeyUri
欄位。
控制台
建立叢集時,如果使用 1.3 以上的映像檔版本,請在 Google Cloud 管理中心的 Dataproc「建立叢集」頁面,從「管理安全性」面板的「Kerberos 和 Hadoop 安全模式」部分選取「啟用」,然後完成安全性選項 (詳見下節)。
OS 登入
叢集上 KDC 管理可使用根 Kerberos 使用者主體或使用 sudo kadmin.local
,以 kadmin
指令執行。啟用 OS 登入,控管可執行超級使用者指令的人員。
SSL 憑證
做為啟用 Hadoop 安全模式的一部分,Dataproc 會建立自行簽署憑證以啟用叢集 SSL 加密。做為替代方案,您可在建立 Kerberos 叢集時,藉由在設定檔中新增以下設定,來提供憑證以進行叢集 SSL 加密:
ssl:keystore_password_uri
:Cloud Storage 中 KMS 加密檔案的位置,該檔案含有 KeyStore 檔案的密碼。ssl:key_password_uri
:Cloud Storage 中 KMS 加密檔案的位置,該檔案含有 KeyStore 檔案中金鑰的密碼。ssl:keystore_uri
:KeyStore 檔案在 Cloud Storage 中的位置,該檔案含有叢集節點使用的萬用字元憑證和私密金鑰。ssl:truststore_password_uri
:Cloud Storage 中 KMS 加密檔案的位置,該檔案含有信任儲存庫檔案的密碼。ssl:truststore_uri
:信任憑證所在的信任儲存區檔案在 Cloud Storage 中的位置。
設定檔範例:
root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key ssl: key_password_uri: gs://bucket/key_password.encrypted keystore_password_uri: gs://bucket/keystore_password.encrypted keystore_uri: gs://bucket/keystore.jks truststore_password_uri: gs://bucket/truststore_password.encrypted truststore_uri: gs://bucket/truststore.jks
其他 Kerberos 設定
如要指定 Kerberos 領域,請建立 Kerberos 叢集,並在 Kerberos 設定檔中新增下列屬性:
realm
:叢集內 Kerberos 領域的名稱。
如果未設定這項屬性,主機名稱的網域 (大寫) 將做為領域。
如要指定 KDC 資料庫的主金鑰,請建立 Kerberos 叢集,並在 Kerberos 設定檔中新增下列屬性:
kdc_db_key_uri
:KMS 加密檔案在 Cloud Storage 中的位置,該檔案含有 KDC 資料庫主金鑰。
如果此屬性尚未設定,Dataproc 會產生主金鑰。
如要指定票證授予票證的最大生命週期 (以小時為單位),請建立 Kerberos 叢集,並在 Kerberos 設定檔中新增下列屬性:
tgt_lifetime_hours
:票證授權票證的生命週期上限,以小時為單位。
如果此屬性尚未設定,Dataproc 會將票證授予票證的生命週期設為 10 小時。
跨領域信任
叢集上的 KDC 最初僅包含根管理員主體和服務主體。您可以手動新增使用者主體,也可以與擁有使用者主體的外部 KDC 或 Active Directory 伺服器來建立跨領域信任。 若要連線至內部部署的 KDC/Active Directory,建議使用 Cloud VPN 或 Cloud Interconnect。
如要建立支援跨領域信任的 Kerberos 叢集,請在建立 Kerberos 叢集時,將下列設定新增至 Kerberos 設定檔。使用 KMS 加密共用密碼,並將其儲存在叢集服務帳戶可存取的 Cloud Storage 值區中。
cross_realm_trust:admin_server
:遠端管理伺服器的主機名稱或位址cross_realm_trust:kdc
:遠端 KDC 的主機名稱或位址cross_realm_trust:realm
:要信任的遠端領域名稱cross_realm_trust:shared_password_uri
:Cloud Storage 中 KMS 加密共用密碼的位置
設定檔範例:
root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key cross_realm_trust: admin_server: admin.remote.realm kdc: kdc.remote.realm realm: REMOTE.REALM shared_password_uri: gs://bucket/shared_password.encrypted
如要啟用跨領域信任至遠端 KDC,請按照下列步驟操作:
在遠端 KDC 的
/etc/krb5.conf
檔案中新增以下內容:[realms] DATAPROC.REALM = { kdc = MASTER-NAME-OR-ADDRESS admin_server = MASTER-NAME-OR-ADDRESS }
建立信任的使用者:
kadmin -q "addprinc krbtgt/DATAPROC.REALM@REMOTE.REALM"
出現提示時,輸入使用者密碼。密碼應與加密的共享密碼檔案內容相符
若要使用 Active Directory 啟用跨領域信任,請在 PowerShell 中以管理員身分執行以下指令:
在 Active Directory 中建立 KDC 定義。
ksetup /addkdc DATAPROC.REALM DATAPROC-CLUSTER-MASTER-NAME-OR-ADDRESS
在 Active Directory 中建立信任。
密碼應與加密的共享密碼檔案內容相符。netdom trust DATAPROC.REALM /Domain AD.REALM /add /realm /passwordt:TRUST-PASSWORD
dataproc
個主體
使用 Dataproc jobs API 將工作提交至 Dataproc Kerberos 叢集時,工作會以叢集 Kerberos 領域的 dataproc
Kerberos 主體身分執行。
如果您直接將工作提交至叢集 (例如使用 SSH),Dataproc Kerberos 叢集支援多租戶。不過,如果作業讀取或寫入其他 Google Cloud 服務 (例如 Cloud Storage),作業會做為叢集的服務帳戶。
預設和自訂叢集屬性
Hadoop 安全模式是以設定檔中的屬性來設定的。Dataproc 會為這些屬性設定預設值。
在您以 gcloud dataproc clusters create
--properties
標記建立叢集,或呼叫 clusters.create API 並設定 SoftwareConfig 屬性時,您可複寫預設屬性 (請參閱叢集屬性範例)。
高可用性模式
在高可用性 (HA) 模式下,kerberos 叢集將具有 3 個 KDC:每個主要執行個體上都各有一個。在「第一個」主要執行個體 ($CLUSTER_NAME-m-0
) 上執行的 KDC 將為主要 KDC,並也作為管理伺服器。
主要 KDC 的資料庫將透過一個 cron 工作,以 5 分鐘的間隔同步到兩個副本 KDC,且 3 個 KDC 將提供讀取流量。
如果主 KDC 關閉,則 Kerberos 本身不支援即時複製或自動容錯移轉。執行手動容錯移轉:
- 在所有 KDC 電腦上的
/etc/krb5.conf
中,將admin_server
更改為新主要執行個體的 FQDN (完全限定的網域名稱)。從 KDC 清單中移除舊主機。 - 在新的主 KDC 上,設定一個 cron 工作來傳播資料庫。
- 在新的主 KDC 上,重新啟動 admin_server 程序 (
krb5-admin-server
)。 - 在所有 KDC 電腦上,重新啟動 KDC 程序 (
krb5-kdc
)。
網路設定
如要確保工作節點可以與在主節點上執行的 KDC 和 Kerberos 管理伺服器通訊,請確認 VPC 防火牆規則允許主節點上的通訊埠 88 輸入 TCP 和 UDP 流量,以及通訊埠 749 輸入 TCP 流量。在高可用性模式中,請確認虛擬私有雲防火牆規則允許主機的通訊埠 754 輸入 TCP 流量,以便傳播對主機 KDC 所做的變更。Kerberos 需要正確設定反向 DNS。 此外,如要進行以主機為準的服務主體正規化,請確保叢集網路已正確設定反向 DNS。
後續步驟
- 請參閱 MIT Kerberos 說明文件。