從 Hadoop 遷移權限

本文說明如何將 Apache Hadoop 分散式檔案系統 (HDFS)、Ranger HDFS 和 Apache Hive 的權限,遷移至 Cloud Storage 或 BigQuery 中的 Identity and Access Management (IAM) 角色。

權限遷移程序包含下列步驟:

  1. 首先建立主體規則集 YAML 設定檔,產生主體對應檔案。接著,請使用主體規則集 YAML 檔案和 HDFS 或 Ranger 中繼資料檔案,執行權限遷移工具,產生主體對應檔案。
  2. 首先建立權限規則集 YAML 檔案,產生目標權限對應檔案。接著,使用權限規則集 YAML 檔案、表格對應設定檔,以及 HDFS 或 Ranger 中繼資料檔案,執行權限遷移工具,產生目標權限對應檔案。
  3. 使用目標權限檔案執行權限遷移工具,將權限套用至 Cloud Storage 或 BigQuery。您也可以使用提供的 Python 指令碼產生 Terraform 檔案,自行套用權限。

事前準備

遷移權限前,請先確認您已完成下列事項:

您也可以在發行套件中的 terraform.zip 檔案內找到 Terraform 產生器指令碼。

產生主體對應檔

主體對應檔案會定義對應規則,將來源中的主體對應至 Google Cloud IAM 主體。

如要產生主體對應檔,您必須先手動建立主體規則集 YAML 檔案,定義如何將來源主體對應至 Google Cloud IAM 主體。在主體規則集 YAML 檔案中,為每個來源定義對應規則,可以是 rangerHDFS 或兩者皆是。

以下範例顯示主體規則集 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 Cloudprincipals.yaml主體。您可以在執行後續步驟前手動編輯檔案。

產生目標權限檔案

目標權限檔案包含 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。

  1. 確認您使用的是 Python 3.7 以上版本。
  2. 建立新的虛擬環境並啟用。
  3. permissions-migration/terraform 目錄中,使用下列指令安裝 requirements.txt 檔案中的依附元件:

    python -m pip install -r requirements.txt
  4. 執行產生器指令:

    python tf_generator PATH LOCATION OUTPUT

    更改下列內容:

    • PATH:產生的 permissions.yaml 檔案路徑。
    • LOCATIONCloud 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 運算式。值可以是 truefalse
    • 只有在 when 子句評估結果為 true 時,規則才會生效
    • 預設值為 true
  • map:指定結果欄位內容的子句。這個子句的值取決於處理的物件類型,可定義為:
    • expression,以評估為字串
    • value 代表常數字串
  • skip:指定不應對應輸入物件
    • 可以是 truefalse
  • log:有助於偵錯或開發規則的述詞子句
    • 字串代表布林值 CEL 運算式。值可以是 truefalse
    • 預設值為 false
    • 如果設為 true,輸出內容會包含執行記錄,可用於監控或診斷執行作業中的問題

建立主體規則集 YAML 檔案

主體對應檔案用於提供 email_addresstype 的值,藉此產生主體 ID

  • 使用 email_address 指定 Google Cloud 主體的電子郵件地址。
  • 使用 type 指定主體在 Google Cloud中的性質。type 的值可以是 usergroupserviceAccount

規則中使用的任何 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:

  • 如果存取權集包含 updatecreatedropalterindexlockallwriterefresh,則預設角色為 writer
  • 如果存取權集包含 selectread,則預設角色為 reader
  • 如果存取權集不包含上述任何權限,則角色為空白

Cloud Storage:

  • roles/storage.objectUser - Writer
  • roles/storage.objectViewer - 讀取者

BigQuery:

  • roles/bigquery.dataOwner - Writer
  • roles/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'"