IAM によるアクセス制御

このドキュメントでは、Dataform で次の操作を行う方法について説明します。

始める前に

    Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。

    In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

    Verify that billing is enabled for your Google Cloud project.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

    In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

    Verify that billing is enabled for your Google Cloud project.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

Dataform に必要なアクセス権を付与する

このセクションでは、Dataform サービス エージェントとカスタム サービス アカウントが BigQuery でワークフローを実行するために必要な Identity and Access Management(IAM)ロールを付与する方法について説明します。

カスタム サービス アカウントと Dataform サービス エージェントについて

カスタム サービス アカウントを構成して、次の方法でワークフローを代行実行できます。

Dataform リポジトリまたはワークフロー構成を作成する際は、サービス アカウントに対する act-as 権限を持つ任意のサービス アカウントを選択できます。Dataform リソースに関連付けられているすべてのサービス アカウントに必要な act-as 権限を構成する必要があります。

最初の Dataform リポジトリを作成すると、Dataform がサービス エージェントを自動的に生成します。Dataform は、サービス エージェントを使用してユーザーに代わって BigQuery を操作します。

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

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

PROJECT_NUMBER は、Google Cloud プロジェクトの数値 ID に置き換えます。 Google Cloud プロジェクト ID は、Google Cloud コンソール ダッシュボードで確認できます。詳細については、プロジェクト名、番号、ID を確認するをご覧ください。

Dataform サービス エージェント、カスタム サービス アカウント、Google アカウントに必要なロール

Dataform での認証に使用される Dataform サービス エージェント、カスタム サービス アカウント、Google アカウントのユーザー認証情報(プレビュー)は、BigQuery でワークフローを実行するために、次の BigQuery IAM ロールが必要です。

また、ワークフロー構成の有効なサービス アカウントで、Dataform サービス エージェントに次のロールを付与します。これらのロールは、厳密な act-as モードが機能するために必要です。

リポジトリの自動リリースとワークフローの自動実行を行うには、Dataform サービス エージェントに有効なサービス アカウントに対する iam.serviceAccounts.actAs 権限を付与します。

セキュリティ上の考慮事項

Dataform で必要なロールを Dataform サービス エージェント、カスタム サービス アカウント、またはユーザーの Google アカウント(プレビュー)に付与する際には、次のセキュリティに関する考慮事項があります。

  • 必要なロールが付与されたカスタム サービス アカウントは、VPC Service Controls に関係なく、サービス アカウントが属するプロジェクトの BigQuery または Secret Manager へのアクセス権を取得する可能性があります。Dataform がカスタム サービス アカウントを使用してワークフローを実行すると、Dataform リクエストは、リポジトリを含むプロジェクトの VPC Service Controls 境界内から発信されたものとして扱われます。そのため、これらのリソースが同じサービス境界内にある場合、VPC Service Controls は Dataform と他のサービス(BigQuery や Secret Manager など)間の通信をブロックしません。

    これらのセキュリティ境界の管理方法の詳細については、VPC Service Controls を構成するをご覧ください。

  • dataform.repositories.create IAM 権限を持つユーザーは、Dataform サービス エージェントと、そのサービス エージェントまたはサービス アカウントに付与されたすべての権限を使用してコードを実行できます。

    詳細については、Dataform 権限のセキュリティに関する考慮事項をご覧ください。

  • 安全な権限モデルを維持するには、Dataform サービス エージェントのロール バインディングを定期的に監査します。モニタリングの詳細な手順については、Security Command Center でサービス エージェントの権限をモニタリングするをご覧ください。

ユーザー、サービス エージェント、サービス アカウントが BigQuery で読み書きできるデータを制限するために、選択した BigQuery データセットまたはテーブルに対して、細かな BigQuery IAM 権限を付与できます。詳細については、データセットへのアクセスの制御テーブルとビューへのアクセスの制御をご覧ください。

ユーザーが他のユーザーの Google アカウントのユーザー認証情報を使用して操作を行うのを防ぐため、次の制限が適用されます。

  • 別の Google アカウントのユーザー認証情報が関連付けられているワークフロー構成を変更するには、自分の Google アカウントのユーザー認証情報をワークフロー構成に関連付けるか、カスタム サービス アカウントで認証するようにワークフロー構成を変更する必要があります。
  • 別の Google アカウント ユーザーの認証情報が関連付けられているリリース構成を参照するワークフロー構成がある場合、リリース構成のコンパイル結果を変更することはできません。
  • ワークフロー構成で Google アカウントのユーザー認証情報を設定し、スケジュールでリリース構成を参照することはできません。この制限には次の影響があります。

    • Google アカウントのユーザー認証情報で認証するように設定されているリリース構成を参照するワークフロー構成がある場合、スケジュールを使用するようにリリース構成を更新することはできません。
    • Google アカウントのユーザー認証情報で認証し、スケジュールを含むリリース構成を指すワークフロー構成を作成することはできません。
    • Google アカウントのユーザー認証情報を使用して、スケジュールでリリース構成を参照するようにワークフロー構成を作成または更新することはできません。

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

Dataform サービス エージェント、Dataform で使用するカスタム サービス アカウント、または Dataform で認証に使用するユーザーの Google アカウント(プレビュー)に必要な BigQuery IAM ロールを付与する手順は次のとおりです。

  1. Google Cloud コンソールで、[Dataform] ページに移動します。

    Dataform に移動

  2. リポジトリを作成または選択します。

  3. Google Cloud コンソールで、[IAM] ページに移動します。

    [IAM] に移動

  4. [アクセス権を付与] をクリックします。

  5. [新しいプリンシパル] フィールドに、サービス エージェント ID、サービス アカウント ID、またはユーザーの Google アカウントのメールアドレス(プレビュー)を入力します。

  6. [ロールを選択] リストで、[BigQuery ジョブユーザー] ロールを選択します。

  7. [別のロールを追加] をクリックし、[ロールを選択] プルダウン リストで [BigQuery データ編集者] ロールを選択します。

  8. [別のロールを追加] をクリックし、[ロールを選択] プルダウン リストで [BigQuery データ閲覧者] ロールを選択します。

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

自動ワークフローに必要なロールを付与する

Dataform でカスタム サービス アカウントを使用するには、Dataform サービス エージェントがカスタム サービス アカウントにアクセスできる必要があります。これにより、Dataform は、サービス エージェントのアカウントではなく、カスタム サービス アカウントで定義された権限を使用してワークフローを実行できます。

このアクセス権を付与するには、プリンシパルとして Dataform サービス エージェントにサービス アカウント トークン作成者ロールroles/iam.serviceAccountTokenCreator)を付与する必要があります。これにより、Dataform サービス エージェントは、トークンと呼ばれる有効期間の短い認証情報を作成して、サービス アカウントの権限を借用できます。これらのトークンは、Dataform がカスタム サービス アカウントの ID を使用してワークフローを実行するために必要です。

また、Dataform サービス エージェントにサービス アカウント ユーザーロールroles/iam.serviceAccountUser)を付与する必要があります。これにより、Dataform サービス エージェントは、カスタム サービス アカウントによって実行されるワークフロー構成の新しい自動ワークフロー実行を開始できます。

Dataform サービス エージェントにカスタム サービス アカウントへのアクセス権を付与する手順は次のとおりです。

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

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

  2. カスタム サービス アカウントが配置されている Google Cloud プロジェクトを選択します。

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

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

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

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

    service-PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com
    
  6. [ロールを選択] リストで、[サービス アカウント トークン作成者] ロールと [サービス アカウント ユーザー] ロールを選択します。

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

これで、カスタム サービス アカウントを Dataform リポジトリ内で構成できるようになりました。

サービス アカウントの構成を監査する

このセクションでは、Dataform リソースを監査して、サービス アカウントの適切な使用と権限付与を確保する方法について説明します。監査は、カスタム サービス アカウントを使用する場合に特に重要です。カスタム サービス アカウントでは、Dataform サービス エージェントが動作するために特定の権限が必要になるためです。

Dataform リポジトリまたはワークフロー構成にカスタム サービス アカウントを使用する場合は、Dataform サービス エージェントにカスタム サービス アカウントに対するサービス アカウント ユーザーのロールroles/iam.serviceAccountUser)があることを確認する必要があります。このロールは iam.serviceAccounts.actAs 権限を付与します。これにより、Dataform サービス エージェントによって開始されたスケジュール設定された実行は、カスタム サービス アカウントの権限を借用できます。また、Dataform サービス エージェントに、有効なサービス アカウントに対するサービス アカウント トークン作成者ロールroles/iam.serviceAccountTokenCreator)が付与されていることを確認します。

リポジトリのサービス アカウントを確認する

まず、Dataform 独自のスケジューリングと実行のスコープ内の dataform.Repository アセットを特定します。次に、スコープ内のリポジトリのサービス アカウント構成を確認します。

  1. Cloud Asset Inventory を使用して、dataform.Repository タイプのすべてのリソースを一覧表示します。詳細については、アセットを表示するをご覧ください。

  2. Cloud Asset Inventory の出力の各リポジトリについて、resource.data.labels フィールドを調べて、スコープ内にあるかどうかを確認します。正確なパスは、エクスポート形式によって若干異なる場合があります。

  3. single-file-asset-type キーのラベルマップを調べて、範囲外のリポジトリを特定します。このキーが存在する場合、リポジトリが BigQuery 機能で使用されていることを示します。値が sql または data_canvas の場合、リポジトリはサービス アカウントの権限チェックから除外できます。

    このキーまたは値がない残りのリポジトリは、サービス アカウントの権限チェックのスコープ内にあります。

  4. スコープ内の各リポジトリについて、Cloud Asset Inventory の出力で resource.data.serviceAccount フィールドを確認し、カスタム サービス アカウントが構成されているかどうかを判断します。

    • resource.data.serviceAccount フィールドが存在し、その値がプロジェクトの Dataform サービス エージェントのメールアドレスと異なる場合、リポジトリはカスタム サービス アカウントを使用します。
    • resource.data.serviceAccount フィールドがない場合、またはフィールドの値がプロジェクトの Dataform サービス エージェントと一致する場合、リポジトリはサービス エージェントを使用します。

  5. カスタム サービス アカウントが使用されている場合は、Dataform サービス エージェントに、そのカスタム サービス アカウントに対するサービス アカウント ユーザーのロール(roles/iam.serviceAccountUser)とサービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)の両方が付与されていることを確認します。

ワークフロー構成サービス アカウントを確認する

Dataform ワークフロー構成に専用のカスタム サービス アカウントを使用することは、最小権限の原則に沿ったセキュリティのベスト プラクティスです。

dataform.WorkflowConfig resources のサービス アカウントの使用状況を確認するには、次の操作を行います。

  1. Cloud Asset Inventory を使用して、dataform.WorkflowConfig タイプのすべてのリソースを一覧表示します。

  2. ワークフロー構成ごとに、Cloud Asset Inventory の出力を調べて、有効なサービス アカウントを特定します。

    • resource.data.serviceAccount フィールドが存在する場合、この値はワークフロー構成で明示的に設定されたサービス アカウントのメールアドレスです。
    • resource.data.serviceAccount フィールドがない場合、ワークフロー構成は親リポジトリからサービス アカウントを継承します。親リポジトリの構成を確認して、有効なサービス アカウントを見つけます。
  3. 有効なサービス アカウントのメールアドレスとプロジェクトの Dataform サービス エージェントのメールアドレスを比較して、カスタム サービス アカウントが使用されているかどうかを確認します。異なる場合は、カスタム サービス アカウントが使用されています。

  4. カスタム サービス アカウントが使用されている場合は、Dataform サービス エージェントに、そのカスタム サービス アカウントに対するサービス アカウント ユーザーロール(roles/iam.serviceAccountUser)とサービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)の両方が付与されていることを確認します。これらの権限により、Dataform サービス エージェントはカスタム サービス アカウントを偽装してワークフローの実行を開始できます。

Security Command Center でサービス エージェントの権限をモニタリングする

最小権限の原則を継続的に遵守するため、Security Command Center でプロジェクトを積極的にモニタリングし、権限が過剰なサービス アカウントとサービス エージェントに関連する検出結果を確認します。

Security Command Center で修復の検出結果を確認して適用する手順については、IAM Recommender の検出結果コンソールで ID の検出結果を調査するをご覧ください。

Dataform サービス エージェントの SERVICE_AGENT_GRANTED_BASIC_ROLE の検出結果を修復する場合は、権限が過剰なロールを、特定のスコープのリソースに必要な最小限の権限を持つ事前定義ロールに置き換えます。たとえば、特定のサービス アカウントに対するサービス アカウント ユーザーロール(roles/iam.serviceAccountUser)を付与します。

IAM を使用して Dataform へのアクセスを制御する

このセクションでは、Dataform のアクセス制御オプションについて説明し、Dataform のロールを表示して付与する方法について説明します。Dataform は、Identity and Access Management(IAM)を使用してアクセス制御を行います。IAM のロールと権限の詳細については、IAM のロールと権限のインデックスをご覧ください。

Dataform の事前定義ロール

次の表に、Dataform リソースへのアクセスを許可する事前定義ロールを一覧表示します。

Role Permissions

(roles/dataform.admin)

Full access to all Dataform resources.

dataform.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update
  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update
  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query
  • dataform.config.get
  • dataform.config.update
  • dataform.folders.addContents
  • dataform.folders.create
  • dataform.folders.delete
  • dataform.folders.deleteTree
  • dataform.folders.get
  • dataform.folders.getIamPolicy
  • dataform.folders.move
  • dataform.folders.queryContents
  • dataform.folders.setIamPolicy
  • dataform.folders.update
  • dataform.locations.get
  • dataform.locations.list
  • dataform.operations.cancel
  • dataform.operations.delete
  • dataform.operations.get
  • dataform.operations.list
  • dataform.releaseConfigs.create
  • dataform.releaseConfigs.delete
  • dataform.releaseConfigs.get
  • dataform.releaseConfigs.list
  • dataform.releaseConfigs.update
  • dataform.repositories.commit
  • dataform.repositories.computeAccessTokenStatus
  • dataform.repositories.create
  • dataform.repositories.createTagBinding
  • dataform.repositories.delete
  • dataform.repositories.deleteTagBinding
  • dataform.repositories.fetchHistory
  • dataform.repositories.fetchRemoteBranches
  • dataform.repositories.get
  • dataform.repositories.getIamPolicy
  • dataform.repositories.list
  • dataform.repositories.listEffectiveTags
  • dataform.repositories.listTagBindings
  • dataform.repositories.move
  • dataform.repositories.queryDirectoryContents
  • dataform.repositories.readFile
  • dataform.repositories.scheduleRelease
  • dataform.repositories.scheduleWorkflow
  • dataform.repositories.setIamPolicy
  • dataform.repositories.update
  • dataform.teamFolders.create
  • dataform.teamFolders.delete
  • dataform.teamFolders.deleteTree
  • dataform.teamFolders.get
  • dataform.teamFolders.getIamPolicy
  • dataform.teamFolders.setIamPolicy
  • dataform.teamFolders.update
  • dataform.workflowConfigs.create
  • dataform.workflowConfigs.delete
  • dataform.workflowConfigs.get
  • dataform.workflowConfigs.list
  • dataform.workflowConfigs.update
  • dataform.workflowInvocations.cancel
  • dataform.workflowInvocations.create
  • dataform.workflowInvocations.delete
  • dataform.workflowInvocations.get
  • dataform.workflowInvocations.list
  • dataform.workflowInvocations.query
  • dataform.workspaces.commit
  • dataform.workspaces.create
  • dataform.workspaces.delete
  • dataform.workspaces.fetchFileDiff
  • dataform.workspaces.fetchFileGitStatuses
  • dataform.workspaces.fetchGitAheadBehind
  • dataform.workspaces.get
  • dataform.workspaces.getIamPolicy
  • dataform.workspaces.installNpmPackages
  • dataform.workspaces.list
  • dataform.workspaces.makeDirectory
  • dataform.workspaces.moveDirectory
  • dataform.workspaces.moveFile
  • dataform.workspaces.pull
  • dataform.workspaces.push
  • dataform.workspaces.queryDirectoryContents
  • dataform.workspaces.readFile
  • dataform.workspaces.removeDirectory
  • dataform.workspaces.removeFile