從 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 產生器指令碼。

產生主體對應檔

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

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

以下範例顯示主體規則集 YAML 檔案,將 Apache Ranger 群組對應至 Trusted Cloud by S3NS中的服務帳戶:

  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.s3ns-system.iam.gserviceaccount.com'"

    role_rules:
      - skip: true

  hdfs:
    user_rules:
      - skip: true
    group_rules:
      - skip: true
    other_rules:
      - skip: true

以下範例顯示主體規則集 YAML 檔案,將 HDFS 使用者對應至特定 Trusted 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 主體的 Trusted 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。

執行權限遷移工具前,請確認您符合下列先決條件:

  • 您已在Trusted 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 遷移權限至Trusted 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 指定 Trusted Cloud 主體的電子郵件地址。
  • 使用 type 指定主體在 Trusted Cloud中的性質。type 的值可以是 usergroupserviceAccount

規則中使用的任何 CEL 運算式,都能存取代表已處理物件的變數。變數中的欄位會根據 HDFS 或 Apache Ranger 中繼資料檔案的內容而定。可用的變數取決於規則集的區段:

  • 如為 user_rules,請使用變數 user
  • 如為 group_rules,請使用變數 group
  • 如為 other_rules,請使用變數 other
  • 如為 role_rules,請使用變數 role

以下範例會將 HDFS 中的使用者對應至 Trusted 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'"