從 Hadoop 遷移權限
本文說明如何將 Apache Hadoop 分散式檔案系統 (HDFS)、Ranger HDFS 和 Apache Hive 的權限,遷移至 Cloud Storage 或 BigQuery 的 Identity and Access Management (IAM) 角色。
權限遷移程序包含下列步驟:
- 產生主體對應檔案:首先,建立主體規則集 YAML 設定檔。接著,執行權限遷移工具,並提供主體規則集 YAML 檔案和 HDFS 或 Ranger 中繼資料檔案,產生主體對應檔案。
- 產生目標權限對應檔:首先,建立權限規則集 YAML 檔案。接著,使用權限規則集 YAML 檔案、資料表對應設定檔,以及 HDFS 或 Ranger 中繼資料檔案,執行權限遷移工具,產生目標權限對應檔案。
- 使用目標權限檔案執行權限遷移工具,將權限套用至 Cloud Storage 或 BigQuery。您也可以使用提供的 Python 指令碼產生 Terraform 檔案,自行套用權限。
事前準備
遷移權限前,請確認您已完成下列事項:
- 安裝
dwh-migration-dumper工具。 - 執行
dwh-migration-dumper工具,為資料來源產生必要的中繼資料。
您也可以在版本套件中的 terraform.zip 檔案內找到 Terraform 產生器指令碼。
產生主體對應檔案
主體對應檔案會定義對應規則,將來源中的主體對應至 Google Cloud IAM 主體。
如要產生主體對應檔案,您必須先手動建立主體規則集 YAML 檔案,定義主體如何從來源對應至 Google Cloud IAM 主體。在主體規則集 YAML 檔案中,為每個來源 (ranger、HDFS 或兩者) 定義對應規則。
以下範例顯示主體規則集 YAML 檔案,將 Apache Ranger 群組對應至 Google Cloud中的服務帳戶:
ranger: user_rules: - skip: true group_rules: # Skip internal Ranger groups. - skip: true when: "group.groupSource == 0" # Map all roles to Google Cloud Platform service accounts. - map: type: value: serviceAccount email_address: expression: "group.name + 'my-service-account@my-project.iam.gserviceaccount.com'" role_rules: - skip: true hdfs: user_rules: - skip: true group_rules: - skip: true other_rules: - skip: true
以下範例顯示主體規則集 YAML 檔案,可將 HDFS 使用者對應至特定 Google Cloud 使用者:
ranger: user_rules: - skip: true group_rules: - skip: true role_rules: - skip: true hdfs: user_rules: # Skip user named 'example' - when: "user.name == 'example'" skip: true # Map all other users to their name at google.com - when: "true" map: type: value: user email_address: expression: "user.name + '@google.com'" group_rules: - skip: true other_rules: - skip: true
如要進一步瞭解建立主體規則集 YAML 檔案的語法,請參閱「規則集 YAML 檔案」。
建立主體規則集 YAML 檔案後,請上傳至 Cloud Storage bucket。您也必須加入 HDFS 檔案、dwh-migration-dumper 工具產生的 Apache Ranger 檔案,或兩者皆加入,具體取決於您要從哪個來源遷移權限。接著,您可以執行權限遷移工具,產生主體對應檔案。
以下範例說明如何執行權限遷移工具,從 HDFS 和 Apache Ranger 遷移,產生名為 principals.yaml 的主體對應檔案。
./dwh-permissions-migration expand \ --principal-ruleset gs://MIGRATION_BUCKET/principals-ruleset.yaml \ --hdfs-dumper-output gs://MIGRATION_BUCKET/hdfs-dumper-output.zip \ --ranger-dumper-output gs://MIGRATION_BUCKET/ranger-dumper-output.zip \ --output-principals gs://MIGRATION_BUCKET/principals.yaml
將 MIGRATION_BUCKET 替換為含有遷移檔案的 Cloud Storage bucket 名稱。
執行工具後,請檢查產生的 principals.yaml 檔案,確認其中包含來源主體,且對應至 Google CloudIAM 主體。在進行後續步驟前,您可以手動編輯檔案。
產生目標權限檔案
目標權限檔案包含 Hadoop 叢集中設定的來源權限,與 BigQuery 或 Cloud Storage 代管資料夾的 IAM 角色之間的對應資訊。如要產生目標權限檔案,您必須先手動建立權限規則集 YAML 檔案,指定 Ranger 或 HDFS 的權限如何對應至 Cloud Storage 或 BigQuery。
以下範例會接受 Cloud Storage 的所有 Ranger 權限:
gcs: ranger_hive_rules: - map: {} log: true
以下範例接受 hadoop 主體以外的所有 HDFS 權限:
gcs: hdfs_rules: - when: source_principal.name == 'hadoop' skip: true - map: {}
以下範例會覆寫資料表 tab0 的預設角色對應,並對所有其他權限使用預設值
gcs: ranger_hive_rules: ranger_hive_rules: - when: table.name == 'tab0' map: role: value: "roles/customRole" - map: {}
如要進一步瞭解建立權限規則集 YAML 檔案的語法,請參閱「規則集 YAML 檔案」。
建立權限規則集 YAML 檔案後,請上傳至 Cloud Storage bucket。您也必須加入 HDFS 檔案、dwh-migration-dumper 工具產生的 Apache Ranger 檔案,或兩者皆加入,具體取決於您要從哪個來源遷移權限。您也必須加入資料表設定 YAML 檔案和主體對應檔。
接著,您可以執行權限遷移工具,產生目標權限檔案。
以下範例說明如何執行權限遷移工具,從 HDFS 和 Apache Ranger 遷移,並使用資料表對應設定檔和名為 principals.yaml 的主體對應檔案,產生名為 permissions.yaml 的主體對應檔案。
./dwh-permissions-migration build \ --permissions-ruleset gs://MIGRATION_BUCKET/permissions-config.yaml \ --tables gs://MIGRATION_BUCKET/tables/ \ --principals gs://MIGRATION_BUCKET/principals.yaml \ --ranger-dumper-output gs://MIGRATION_BUCKET/ranger-dumper-output.zip \ --hdfs-dumper-output gs://MIGRATION_BUCKET/hdfs-dumper-output.zip \ --output-permissions gs://MIGRATION_BUCKET/permissions.yaml
將 MIGRATION_BUCKET 替換為含有遷移檔案的 Cloud Storage bucket 名稱。
執行工具後,請檢查產生的 permissions.yaml 檔案,確認其中包含從來源對應至 Cloud Storage 或 BigQuery IAM 繫結的權限。您可以在進行後續步驟前手動編輯。
套用權限
產生目標權限檔案後,即可執行權限遷移工具,將 IAM 權限套用至 Cloud Storage 或 BigQuery。
執行權限遷移工具前,請確認您符合下列必要條件:
- 您已在Google Cloud中建立必要的主體 (使用者、群組、服務帳戶)。
- 您已建立 Cloud Storage 代管資料夾或資料表,用於託管遷移的資料。
- 執行工具的使用者有權管理 Cloud Storage 受管理資料夾或資料表的角色。
執行下列指令即可套用權限:
./dwh-permissions-migration apply \ --permissions gs://MIGRATION_BUCKET/permissions.yaml
其中 MIGRATION_BUCKET 是含有遷移檔案的 Cloud Storage bucket 名稱。
以 Terraform 設定的形式套用權限
如要套用遷移的權限,您也可以將目標權限檔案轉換為 Terraform 基礎架構即程式碼 (IaC) 設定,並套用至 Cloud Storage。
- 確認您使用的是 Python 3.7 以上版本。
- 建立新的虛擬環境並啟用。
在
permissions-migration/terraform目錄中,使用下列指令安裝requirements.txt檔案中的依附元件:python -m pip install -r requirements.txt
執行產生器指令:
python tf_generator PATH LOCATION OUTPUT
更改下列內容:
PATH:產生的permissions.yaml檔案路徑。LOCATION:Cloud Storage bucket 的位置,指令碼會根據權限設定檢查並建立資料夾。OUTPUT:輸出檔案的路徑,main.tf。
規則集 YAML 檔案
將權限從 HDFS 或 Apache Ranger 遷移至Google Cloud時,規則集 YAML 檔案會用於對應主體和角色。規則集 YAML 檔案使用一般運算語言 (CEL) 指定述詞 (結果為布林值) 和運算式 (結果為字串)。
規則集 YAML 檔案具有下列特性:
- 系統會針對每個輸入物件,由上至下依序執行各類型的對應規則。
- CEL 運算式可存取情境變數,而情境變數取決於規則集的區段。舉例來說,您可以使用
user變數對應至來源使用者物件,並使用group變數對應至群組。 - 您可以使用 CEL 運算式或靜態值來變更預設值。舉例來說,對應群組時,您可以將輸出值
type從預設值group覆寫為其他值,例如serviceAccount。 - 至少須有一項規則與每個輸入物件相符。
在 HDFS 或 Apache Ranger 權限遷移作業中,規則集 YAML 檔案可用來定義主體對應檔案或角色對應檔案。
規則集 YAML 檔案中的對應規則
規則集 YAML 檔案包含對應規則,指定權限遷移期間,物件如何從來源對應至目標。對應規則可包含下列區段或子句:
when:限制規則適用範圍的述詞子句- 代表布林值 CEL 運算式的字串。值可以是
true或false - 只有在
when子句評估為true時,規則才會生效 - 預設值為
true
- 代表布林值 CEL 運算式的字串。值可以是
map:指定結果欄位內容的子句。這個子句的值取決於處理的物件類型,定義方式如下:- 要評估為字串的
expression value:常數字串
- 要評估為字串的
skip:指定不應對應輸入物件- 可以是
true或false
- 可以是
log:有助於偵錯或開發規則的述詞子句- 字串代表布林值 CEL 運算式。值可以是
true或false - 預設值為
false - 如果設為
true,輸出內容會包含執行記錄,可用於監控或診斷執行作業中的問題
- 字串代表布林值 CEL 運算式。值可以是
建立主體規則集 YAML 檔案
主體對應檔案會提供 email_address 和 type 的值,用於產生主體 ID。
- 使用
email_address指定 Google Cloud 主體的電子郵件地址。 - 使用
type指定 Google Cloud中主體的性質。type的值可以是user、group或serviceAccount。
規則中使用的任何 CEL 運算式,都能存取代表已處理物件的變數。變數中的欄位取決於 HDFS 或 Apache Ranger 中繼資料檔案的內容。可用的變數取決於規則集的區段:
user_rules請使用變數usergroup_rules請使用變數groupother_rules請使用變數otherrole_rules請使用變數role
以下範例會將 HDFS 使用者對應至 Google Cloud中的使用者,並以使用者名稱加上 @google.com 做為電子郵件地址:
hdfs: user_rules: # Skip user named 'example' - when: "user.name == 'example'" skip: true # Map all other users to their name at google.com - when: "true" map: type: value: user email_address: expression: "user.name + '@google.com'"
覆寫預設角色對應
如要使用非預設主體,您可以使用規則集檔案,略過或修改預設角色對應。
以下範例說明如何略過某個規則區段:
hdfs: user_rules: - skip: true group_rules: - skip: true other_rules: - skip: true
建立權限規則集 YAML 檔案
權限規則集 YAML 檔案用於產生目標權限對應檔案。如要建立權限規則集 YAML 檔案,請在權限規則集 YAML 中使用 CEL 運算式,將 HDFS 或 Apache Ranger 權限對應至 Cloud Storage 或 BigQuery 角色。
預設角色對應
HDFS 檔案角色取決於來源檔案權限:
- 如果已設定
w位元,預設角色為writer - 如果已設定
r位元,預設角色為reader - 如果未設定任何位元,則角色為空白
Ranger HDFS:
- 如果存取權組合包含
write,則預設角色為writer - 如果存取權組合包含
read,則預設角色為reader - 如果存取權組合不含這兩者,則角色為空白
Ranger:
- 如果存取權組合包含
update、create、drop、alter、index、lock、all、write或refresh,則預設角色為writer - 如果存取權組合包含
select或read,則預設角色為reader - 如果存取權組合不含上述任何權限,則角色為空白
Cloud Storage:
roles/storage.objectUser- 寫入者roles/storage.objectViewer- 讀取者
BigQuery:
roles/bigquery.dataOwner- 寫入者roles/bigquery.dataViewer- 讀取者
以下範例說明如何在不變更規則集 YAML 檔案的情況下,接受預設對應:
ranger_hdfs_rules: - map: {}
覆寫預設角色對應
如要使用非預設角色,您可以使用規則集檔案,略過或修改預設角色對應。
以下範例說明如何使用對應子句和角色欄位,並搭配值子句,覆寫預設角色對應:
ranger_hdfs_rules: - map: role: value: "roles/customRole"
合併權限對應
如果系統為同一個目標資源產生多個權限對應,則會使用存取權最廣泛的對應。舉例來說,如果 HDFS 規則將 HDFS 位置的讀取者角色授予主體 pa1,而 Ranger 規則將相同位置的寫入者角色授予相同主體,則系統會指派寫入者角色。
CEL 運算式中的字串引號
在 YAML 中,請使用引號 "" 包住整個 CEL 運算式。在 CEL 運算式中,請使用單引號 '' 括住字串。例如:
"'permissions-migration-' + group.name + '@google.com'"