Hadoop から権限を移行する

このドキュメントでは、Apache Hadoop Distributed File System(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 ジェネレータ スクリプトは、リリース パッケージ内の terraform.zip ファイルにもあります。

プリンシパル マッピング ファイルを生成する

プリンシパル マッピング ファイルは、ソースのプリンシパルを Trusted Cloud IAM プリンシパルにマッピングするマッピング ルールを定義します。

プリンシパル マッピング ファイルを生成するには、まずプリンシパル ルールセット YAML ファイルを手動で作成して、ソースから Trusted Cloud IAM プリンシパルへのプリンシパルのマッピング方法を定義する必要があります。プリンシパル ルールセット YAML ファイルで、各ソース(rangerHDFS、またはその両方)のマッピング ルールを定義します。

次の例は、Apache Ranger グループを Trusted Cloud by S3NSのサービス アカウントにマッピングするプリンシパル ルールセット YAML ファイルを示しています。

  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

次の例は、HDFS ユーザーを特定の Trusted Cloud ユーザーにマッピングするプリンシパル ルールセット YAML ファイルを示しています。

  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 バケットにアップロードします。また、権限を移行するソースに応じて、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 ファイルを調べて、 Trusted CloudIAM プリンシパルにマッピングされたソースのプリンシパルが含まれていることを確認します。次の手順に進む前に、このファイルを編集できます。

ターゲット権限ファイルを生成する

ターゲット権限ファイルには、Hadoop クラスタで設定されたソース権限の、BigQuery または Cloud Storage マネージド フォルダの IAM ロールへのマッピングに関する情報が含まれています。ターゲット権限ファイルを生成するには、まず、Ranger または HDFS の権限を Cloud Storage または BigQuery にマッピングする方法を指定する権限ルールセット YAML ファイルを手動で作成する必要があります。

次の例では、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 バケットにアップロードします。また、権限を移行するソースに応じて、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 バケットの名前に置き換えます。

ツールを実行したら、生成された 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 バケットの名前です。

権限を Terraform 構成として適用する

移行した権限を適用するには、ターゲット権限ファイルを Terraform Infrastructure as Code(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 ファイルのパス。
    • LOCATION: スクリプトが権限構成に基づいてフォルダをチェックし、作成する Cloud Storage バケットのロケーション
    • OUTPUT: 出力ファイル main.tf のパス。

ルールセット YAML ファイル

ルールセット YAML ファイルは、HDFS または Apache Ranger からTrusted Cloudに権限を移行するときに、プリンシパルとロールをマッピングするために使用されます。ルールセット YAML ファイルでは、述語(結果がブール値)と式(結果が文字列)の指定に Common Expression Language(CEL)を使用します。

ルールセット YAML ファイルには、次の特性があります。

  • 各タイプのマッピング ルールは、各入力オブジェクトに対して上から順に実行されます。
  • CEL 式はコンテキスト変数にアクセスできます。コンテキスト変数はルールセットのセクションによって異なります。たとえば、user 変数を使用してソース ユーザー オブジェクトにマッピングし、group 変数を使用してグループにマッピングできます。
  • CEL 式または静的値を使用して、デフォルト値を変更できます。たとえば、グループをマッピングするときに、出力値 type をデフォルト値 group から serviceAccount などの別の値にオーバーライドできます。
  • すべての入力オブジェクトに一致するルールが少なくとも 1 つ必要です。

HDFS または Apache Ranger の権限移行では、ルールセット YAML ファイルを使用して、プリンシパル マッピング ファイルまたはロール マッピング ファイルのいずれかを定義できます。

ルールセット YAML ファイルのマッピング ルール

ルールセット YAML ファイルは、権限の移行中にソースからターゲットにオブジェクトを照合する方法を指定するマッピング ルールで構成されています。マッピング ルールには、次のセクションまたは句を含めることができます。

  • when: ルール
      の適用範囲を制限する述語句
    • 文字列はブール値の CEL 式を表します。値は true または false です
    • このルールは、when 句が true と評価された場合にのみ適用されます。
    • デフォルト値は true です
  • map: 結果フィールドの内容を指定する句。この句の値は、処理されるオブジェクトのタイプに応じて異なり、次のように定義できます。
    • 文字列として評価する expression
    • 定数文字列の value
  • skip: 入力オブジェクトをマッピングしないように指定します。
    • truefalse のいずれかになります
  • log: ルールのデバッグまたは開発に役立つ述語句
    • 文字列はブール値の CEL 式を表します。値は true または false です
    • デフォルト値は 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 です。
  • アクセス設定に select または read が含まれている場合、デフォルトのロールは reader です。
  • アクセスセットに上記の権限が含まれていない場合、ロールは空になります。

Cloud Storage:

  • roles/storage.objectUser - 書き込み
  • roles/storage.objectViewer - 読み取り

BigQuery:

  • roles/bigquery.dataOwner - 書き込み
  • roles/bigquery.dataViewer - 読み取り

次の例は、ルールセット YAML ファイルを変更せずにデフォルトのマッピングを受け入れる方法を示しています。

ranger_hdfs_rules:
  - map: {}

デフォルトのロール マッピングをオーバーライドする

デフォルト以外のロールを使用するには、ルールセット ファイルを使用してデフォルトのロール マッピングをスキップするか、変更します。

次の例は、値の原因を使用して Role フィールドを含むマップ句を使用して、デフォルトのロール マッピングをオーバーライドする方法を示しています。

ranger_hdfs_rules:
  - map:
    role:
      value: "roles/customRole"

権限マッピングの統合

同じターゲット リソースに対して複数の権限マッピングが生成された場合は、最も広範なアクセス権を持つマッピングが使用されます。たとえば、HDFS ルールで HDFS ロケーションのプリンシパル pa1 に読み取りロールが付与され、Ranger ルールで同じロケーションの同じプリンシパルに書き込みロールが付与されている場合、書き込みロールが割り当てられます。

CEL 式での文字列の引用符

引用符 "" を使用して、CEL 式全体を YAML でラップします。CEL 式内で文字列を引用するには、単一引用符 '' を使用します。例:

"'permissions-migration-' + group.name + '@google.com'"