從 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 值區名稱。
執行工具後,請檢查產生的 principals.yaml 檔案,確認其中包含從來源對應至 IAM 主體的 Google Cloud主體。您可以在執行後續步驟前手動編輯檔案。
產生目標權限檔案
目標權限檔案包含 Hadoop 叢集中來源權限集的對應資訊,可對應至 BigQuery 或 Cloud Storage 受管理資料夾的 IAM 角色。如要產生目標權限檔案,您必須先手動建立權限規則集 YAML 檔案,指定 Ranger 或 HDFS 的權限如何對應至 Cloud Storage 或 BigQuery。
以下範例會接受 Cloud Storage 的所有 Ranger 權限:
gcs: ranger_hive_rules: - map: {} log: true
以下範例接受所有 HDFS 權限,但 hadoop 主體除外:
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 值區的位置,指令碼會根據權限設定檢查及建立資料夾。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,請使用變數user - 如為
group_rules,請使用變數group - 如為
other_rules,請使用變數other - 如為
role_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- Writerroles/storage.objectViewer- 讀取者
BigQuery:
roles/bigquery.dataOwner- Writerroles/bigquery.dataViewer- 讀取者
以下範例說明如何接受預設對應,而不對規則集 YAML 檔案進行任何變更:
ranger_hdfs_rules: - map: {}
覆寫預設角色對應
如要使用非預設角色,可以略過或修改規則集檔案中的預設角色對應。
以下範例說明如何使用含有角色欄位的對應子句,並透過值子句覆寫預設角色對應:
ranger_hdfs_rules: - map: role: value: "roles/customRole"
合併權限對應
如果系統為同一目標資源產生多個權限對應,則會使用存取權範圍最廣的對應。舉例來說,如果 HDFS 規則將讀取者角色授予 HDFS 位置上的主體 pa1,而 Ranger 規則將寫入者角色授予相同位置上的相同主體,則系統會指派寫入者角色。
CEL 運算式中的字串引號
請使用引號 "" 將整個 CEL 運算式包在 YAML 中。在 CEL 運算式中,請使用單引號 '' 引號字串。例如:
"'permissions-migration-' + group.name + '@google.com'"