厳格な act-as モードを使用する

厳格な act-as モードでは、Dataform で次のユーザー操作に対して追加のセキュリティ チェックが有効になります。

  • リポジトリの作成または更新。
  • ワークフロー構成の作成または更新。
  • ワークフローの呼び出しの作成。
  • リリース構成の更新。

この追加のセキュリティ チェックでは、これらのアクションを実行するユーザーに、有効なサービス アカウントに対する iam.serviceAccounts.actAs 権限が必要です。有効なサービス アカウントとは、ワークフローの実行に使用される認証情報を持つサービス アカウントです。 詳細については、 サービス アカウントをリソースに関連付けるをご覧ください。

厳格な act-as モードは、すべてのリポジトリに適用されます。

必要なロール

このドキュメントのタスクを実行するために必要な権限を取得するには、次の IAM ロールを付与するように管理者へ依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタム ロールや他の事前定義 ロールから取得することもできます。

有効なサービス アカウントの act-as 権限を確認する

Dataform ワークフローが安全に中断なく実行されるようにするには、ワークフローで使用するサービス アカウントの act-as 権限を確認することが重要です。このセクションでは、リソースの有効なサービス アカウントを特定し、Cloud Logging を使用して権限の問題を確認し、見つかった問題を解決する方法について説明します。

有効なサービス アカウントを特定する

ワークフローを実行している有効なサービス アカウントは、リソースの種類と次の条件に基づいて特定できます。

リソースの種類 有効なサービス アカウント
リポジトリ

リポジトリ用に構成されたカスタム サービス アカウント。すべてのリポジトリにカスタム サービス アカウントが必要です。このサービス アカウントは、Repository.ServiceAccount フィールドに一覧表示されます。

ワークフロー構成

新しいワークフロー構成では、ワークフロー構成の作成時に選択したカスタム サービス アカウントが使用されます。サービス アカウントが選択されていない場合は、リポジトリのサービス アカウントが使用されます。

ワークフローの呼び出し

コンパイル結果が WORKFLOW_CONFIG リソースの場合、ワークフロー構成の有効なサービス アカウントが使用されます。

コンパイル結果からワークフローの呼び出しを作成する場合、WorkflowInvocation.InvocationConfig フィールドにリストされているサービス アカウントが設定されている場合は、そのサービス アカウントが使用されます。

それ以外の場合、デフォルトではリポジトリ レベルで構成されたサービス アカウントが使用されます。

Cloud Logging で権限の問題を確認する

セキュリティを強化するため、Dataform は、Dataform リソースで使用されるサービス アカウントに iam.serviceAccounts.actAs 権限がないかどうかを確認します。

これらのチェックの結果(権限に関する潜在的な問題を含む)は、Cloud Logging に記録されます。これらのログを定期的に確認して、不足している iam.serviceAccounts.actAs 権限を特定し、付与する必要があります。これらのログを確認することで、Dataform ワークフローと構成が中断なく機能し続けるようにします。

Cloud Logging でログを確認する

  1. コンソールで、[**ログ エクスプローラ**] ページに移動します。 Google Cloud

    [ログ エクスプローラ] に移動

  2. ログを確認する Google Cloud プロジェクトを選択します。

  3. クエリエディタを使用して、次のオプションで Dataform actAs ログをフィルタします。

    • 失敗して対応が必要な actAs チェックのみを一覧表示するには、次のクエリを使用します。

      logName: "projects/PROJECT_ID/logs/dataform.googleapis.com%2Factas_dry_run_result"
      jsonPayload.dryRunResult = false
      
    • すべての actAs チェックを一覧表示するには、次のクエリを使用します。

      logName: "projects/PROJECT_ID/logs/dataform.googleapis.com%2Factas_dry_run_result"
      

    PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。

  4. [クエリを実行] をクリックします。

ログエントリを解釈する

クエリ結果でログエントリを開き、次の jsonPayload フィールドを表示します。

フィールド タイプ 説明
dryRunResult ブール値 true: 権限チェックに合格しました。

false: チェックに失敗しました。呼び出し元のプリンシパルに、サービス アカウントに対する iam.serviceAccounts.actAs 権限がありません。
caller 文字列 API 呼び出しを開始したプリンシパル(ユーザーまたはサービス アカウント)のメールアドレス。
serviceAccount 文字列 呼び出し元のプリンシパルが act-as を試みたサービス アカウント。通常、このフィールドは dryRunResult フィールドが false の場合に存在します。
apiMethod 文字列 チェックをトリガーした Dataform API メソッド(CreateWorkflowInvocationUpdateRepository など)。
*_context オブジェクト 呼び出された API メソッドに関連するリソース名を含むオブジェクト。詳細については、コンテキスト オブジェクトをご覧ください。
コンテキスト オブジェクト

ログエントリには、jsonPayload フィールド内にコンテキスト オブジェクトが含まれています。このオブジェクトの フィールドには、関連する Dataform エンティティの完全修飾 Google Cloud リソース 名が含まれています。これらの名前は、次のリストに示す標準構造に従っているため、リソースを正確に識別できます。

  • create_workflow_invocation_context: API メソッドが CreateWorkflowInvocation の場合に存在します。

    • workflowInvocation: ワークフローの呼び出しのリソース名。
      • リソース名の形式は次のとおりです: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/workflowInvocations/WORKFLOW_INVOCATION_ID
    • compilationResult または workflowConfig: 呼び出しに使用されるソースのリソース名。
      • compilationResult のリソース名の形式は projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/compilationResults/COMPILATION_RESULT_ID です。
      • workflowConfig のリソース名の形式は projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/workflowConfigs/WORKFLOW_CONFIG_ID です。
  • create_repository_context または update_repository_context: API メソッドが CreateRepository または UpdateRepository の場合に存在します。

    • repository: Dataform リポジトリのリソース名。
      • リソース名の形式は次のとおりです: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID
  • update_release_config_context: API メソッドが UpdateReleaseConfig の場合に存在します。

    • releaseConfig: リリース構成のリソース名。
      • リソース名の形式は次のとおりです: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/releaseConfigs/RELEASE_CONFIG_ID
  • create_workflow_config_context または update_workflow_config_context: API メソッドが CreateWorkflowConfig または UpdateWorkflowConfig の場合に存在します。

    • workflowConfig: ワークフロー構成のリソース名。
      • リソース名の形式は次のとおりです: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/workflowConfigs/WORKFLOW_CONFIG_ID

ドキュメントに記載されている形式とロギング エントリを比較するには、次のように置き換えます。

  • PROJECT_ID: プロジェクトの固有識別子 Google Cloud 。
  • LOCATION_ID: Dataform リポジトリが配置されているリージョン。
  • REPOSITORY_ID: Dataform リポジトリのユーザー定義 ID。これは、リポジトリの作成時に付けられた名前です。
  • COMPILATION_RESULT_ID: Dataform コンパイル結果のシステム生成の一意の識別子。
  • RELEASE_CONFIG_ID: Dataform リリース構成のユーザー定義 ID。
  • WORKFLOW_CONFIG_ID: Dataform ワークフロー構成のユーザー定義 ID。

権限の問題を解決する

dryRunResult フィールドが false のログエントリが見つかった場合は、次の操作を行います。

  1. jsonPayload の詳細で、caller フィールドのメールアドレスをメモして、プリンシパルを特定します。

  2. serviceAccount フィールドのメールアドレスをメモして、サービス アカウントを特定します。

  3. 呼び出し元のプリンシパルに、サービス アカウントとして動作する権限が付与されていることを確認します。 この権限を付与すると、呼び出し元はサービス アカウントが保持する権限を使用できます。

  4. アクセスが意図されている場合は、ターゲット サービス アカウントの呼び出し元のプリンシパルに サービス アカウント ユーザーのロールroles/iam.serviceAccountUser)を付与します。詳細については、 必要な IAM ロールを付与するをご覧ください。

ロールを付与すると、呼び出し元とサービス アカウントの組み合わせの今後のログには dryRunResult: true が表示されます。

必要な IAM ロールを付与する

サービス アカウント ユーザーのロールroles/iam.serviceAccountUser)には、厳格な act-as モードに必要な iam.serviceAccounts.actAs 権限が含まれています。Dataform API を使用する場合は、呼び出す projects.locations.repositories メソッド に基づいて、有効なサービス アカウントにサービス アカウント ユーザーのロールが付与されている必要があります。

  • create または patch
    • Repository.ServiceAccount プロパティが設定されている場合は、そのプロパティにサービス アカウント ユーザーのロールが付与されている必要があります。
    • patch メソッドを呼び出す場合は、リポジトリ内のすべてのワークフロー構成のすべての有効なサービス アカウントにサービス アカウント ユーザーのロールが付与されている必要があります。
  • workflowConfigs.create または workflowConfigs.patch
    • ワークフロー構成で使用される有効なサービス アカウントにサービス アカウント ユーザーのロールが付与されている必要があります。
  • releaseConfigs.patch
    • このリリース構成を使用してワークフロー構成で使用されるすべての有効なサービス アカウントにサービス アカウント ユーザーのロールが付与されている必要があります。
  • workflowInvocations.create
    • ワークフローの呼び出しで使用される有効なサービス アカウントにサービス アカウント ユーザーのロールが付与されている必要があります。

カスタム サービス アカウントにサービス アカウント ユーザーのロールを付与する手順は次のとおりです。

  1. コンソールで、[**IAM**] > [**サービス アカウント**] に移動します。 Google Cloud

    [サービス アカウント] に移動

  2. プロジェクトを選択します。

  3. [**プロジェクト「PROJECT_NAME」のサービス アカウント**] ページで、カスタム サービス アカウントを選択します。

  4. [アクセス権を持つプリンシパル] に移動し、[アクセスを許可] をクリックします。

  5. [新しいプリンシパル] フィールドに、デフォルトの Dataform サービス エージェント ID を入力します。

    デフォルトの Dataform サービス エージェント ID の形式は次のとおりです。

    service-PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com
    

    PROJECT_NUMBER は、使用する Google Cloud プロジェクト番号に置き換えます。

  6. [ロールを選択] リストで、[サービス アカウント ユーザー] ロールを選択します。

  7. [別のロールを追加] をクリックし、[サービス アカウント トークン作成者] ロールを選択します。

  8. [保存] をクリックします。

詳細については、 ワークフロー構成の作成に必要なロールリリース構成の作成に必要なロールをご覧ください。

厳格な act-as モードが自動リリースと実行に与える影響

厳格な act-as モードは、リポジトリの自動リリースとワークフローの自動実行に次のような影響を与えます。

サードパーティのリポジトリに接続されていないリポジトリの場合:

  • リリース構成で自動リリースの Cron スケジュール を設定することはできません。これは、下流のサービス アカウントに対する必要な iam.serviceAccounts.actAs 権限がない可能性のあるユーザーによるコード変更が自動的にデプロイされないようにするために適用されます。
  • ワークフロー構成で Cron スケジュールを使用してスケジュールされたワークフロー実行は有効なままです。これらの自動実行を成功させるには、ワークフロー構成で指定された 有効なサービス アカウント に対する iam.serviceAccounts.actAs 権限をデフォルト Dataform サービス エージェントに付与する必要があります。

サードパーティのリポジトリに接続されているリポジトリの場合:

  • スケジュールされたリリースとスケジュールされたワークフロー実行は許可されます。
  • リリース構成からの自動リリースまたはワークフロー構成からの自動 実行を有効にするには、関連する 有効なサービス アカウントに対する iam.serviceAccounts.actAs 権限 をデフォルトの Dataform サービス エージェントに付与する必要があります:
    • 自動リリース構成の場合は、このリリース構成によってトリガーされるすべてのワークフロー構成の有効なサービス アカウントに対する権限を付与します。
    • 自動ワークフロー構成の場合は、そのワークフロー構成で使用される有効なサービス アカウントに対する権限を付与します。

次のステップ