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

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

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

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

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

必要なロール

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

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

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

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

Dataform ワークフローが安全に中断なく実行されるようにするには、使用するサービス アカウントの act-as 権限を確認することが重要です。このセクションでは、リソースの有効なサービス アカウントを特定する方法、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 文字列 呼び出し元プリンシパルが代行しようとしたサービス アカウント。通常、このフィールドは 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。

権限の問題を解決する

ロギングで特定された権限の問題を解決するには、障害の根本原因を特定し、対応する解決手順を行います。

不足している act-as 権限を付与する

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

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

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

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

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

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

プロジェクト間のサービス アカウントの接続を処理する

リポジトリと有効なサービス アカウントが異なるプロジェクトにある場合、サービス アカウントとして動作するリクエストが iam.disableCrossProjectServiceAccountUsage 組織のポリシー制約によってブロックされることがあります。

この問題を解決するには、プロジェクト間でサービス アカウントの接続を有効にするをご覧ください。

必要な 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. Google Cloud コンソールで、[IAM] > [サービス アカウント] に移動します。

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

  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 サービス エージェントに付与する必要があります。
    • 自動リリース構成の場合は、このリリース構成によってトリガーされるすべてのワークフロー構成の有効なサービス アカウントに対する権限を付与します。
    • 自動ワークフロー構成の場合は、そのワークフロー構成で使用される有効なサービス アカウントに対する権限を付与します。

次のステップ