建立 Dataproc 叢集時,您可以透過 Kerberos 啟用 Hadoop 安全模式,在 Dataproc 叢集內透過使用者驗證、隔離和加密功能提供多用戶群安全架構。
使用者驗證和其他 Google Cloud Platform 服務。透過 Kerberos 進行的個別使用者驗證僅適用於叢集內。與其他 Google Cloud 服務 (例如 Cloud Storage) 的互動仍會以叢集的服務帳戶身分進行驗證。
透過 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 (請參閱 Dataproc 服務屬性),而非使用上述的 --enable-kerberos
標記。
REST API
您可以透過 ClusterConfig.SecurityConfig.KerberosConfig 建立 Kerberos 叢集,做為 clusters.create 要求的一部分。您必須將 enableKerberos
設為 true
。
控制台
您可以在 Dataproc Google Cloud 主控台的「Create a cluster」 頁面上,從「Manage security」面板的「Kerberos and Hadoop Secure Mode」部分選取「Enable」,即可在新的叢集中自動設定 Kerberos。
使用自己的根主體密碼建立 Kerberos 叢集
請按照下列步驟設定使用根主體密碼的 Kerberos 叢集。
設定 Kerberos 根主體密碼
Kerberos 根主體為具有叢集上 KDC 管理員權限的帳戶。為確保安全地提供 Kerberos 根主體的密碼,使用者可以使用 Key Management Service (KMS) 金鑰加密密碼,然後將密碼儲存在叢集服務帳戶可存取的 Google Cloud Storage 儲存空間值區中。叢集服務帳戶必須被授予 cloudkms.cryptoKeyDecrypter
IAM 角色。
將 Cloud KMS CryptoKey 加密者/解密者角色授予叢集服務帳戶:
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 值區。
- 範例:
gcloud storage cp kerberos-root-principal-password.encrypted gs://my-bucket
- 範例:
- 將加密密碼上傳至專案中的 Cloud Storage 值區。
建立叢集
您可以使用 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 建立 Kerberos 叢集,做為 clusters.create 要求的一部分。將 enableKerberos
設為 true,並設定 rootPrincipalPasswordUri
和 kmsKeyUri
欄位。
控制台
使用映像檔版本 1.3 以上建立叢集時,請在 Dataproc Google Cloud 主控台的「Create a cluster」 頁面上,從「Manage security」面板的「Kerberos and Hadoop Secure Mode」部分選取「Enable」,然後完成安全性選項 (詳見下文)。
OS 登入
叢集上 KDC 管理可使用根 Kerberos 使用者主體或使用 sudo kadmin.local
,以 kadmin
指令執行。啟用 OS 登入功能,以控制可執行超級使用者指令的人員。
安全資料傳輸層 (SSL) 憑證
做為啟用 Hadoop 安全模式的一部分,Dataproc 會建立自行簽署憑證以啟用叢集 SSL 加密。做為替代方案,您可在建立 kerberos 叢集時,藉由在設定檔中新增下列設定,來提供憑證以進行叢集 SSL 加密:
ssl:keystore_password_uri
:KMS 加密檔案在 Cloud Storage 中的所在位置,該檔案含有 KeyStore 檔案的密碼。ssl:key_password_uri
:Cloud Storage 中 KMS 加密檔案的位置,該檔案含有 KeyStore 檔案中金鑰的密碼。ssl:keystore_uri
:Cloud Storage 中 KeyStore 檔案的位置,該檔案含有叢集節點使用的萬用字元憑證和私密金鑰。ssl:truststore_password_uri
:KMS 加密檔案在 Cloud Storage 中的位置,該檔案含有信任儲存庫檔案的密碼。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
:含有 KDC 資料庫主金鑰的 KMS 加密檔案在 Cloud Storage 中的位置。
如果此屬性尚未設定,Dataproc 會產生主金鑰。
如要指定票證授予票證的最大生命週期 (以小時計算),請在 Kerberos 設定檔中新增下列屬性,建立 kerberos 叢集:
tgt_lifetime_hours
:票證授權票證的最大生命週期 (以小時為單位)。
如果此屬性尚未設定,Dataproc 會將票證授予票證的生命週期設為 10 小時。
跨領域信任
叢集上的 KDC 最初僅包含根管理員主體和服務主體。您可以手動新增用戶主體,也可以與擁有使用者主體的外部 KDC 或 Active Directory 伺服器來建立跨領域信任。建議使用 Cloud VPN 或 Cloud Interconnect 連線至內部部署的 KDC/Active Directory。
如要建立支援跨領域信任的 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
:KMS 加密共用密碼在 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 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 叢集建立
--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 流量。在高可用性模式中,請確認 VPC 防火牆規則允許主控台上的通訊埠 754 輸入 TCP 流量,以便將變更套用至主控台 KDC。Kerberos 需要正確設定反向 DNS。此外,針對以主機為基礎的服務主體標準化,請確保叢集網路已正確設定反向 DNS。
瞭解詳情
參閱 MIT Kerberos 文件。