IAM によるアクセス制御

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

始める前に

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

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

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

service-PROJECT_NUMBER@gcp-sa-dataform.

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

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

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

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

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

Knowledge Catalog でのメタデータの拡充とデータ品質スコアカードの統合を有効にするには、ワークフローの実行に使用されるカスタム サービス アカウントまたは Google アカウントに、プロジェクトまたは @bigquery エントリ グループに対する Dataplex Catalog 編集者(roles/dataplex.catalogEditor)ロールを付与します。

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

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

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

    これらのセキュリティ境界を管理する方法の詳細については、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 アカウントのユーザー認証情報を使用し、スケジュールを含むリリース構成を指すワークフロー構成を作成または更新することはできません。
  • Google アカウントのエンドユーザー認証情報の使用を禁止するには、組織管理者が end_user_auth_config の設定を拒否するカスタムの組織のポリシー制約を作成します。詳細については、カスタムの組織のポリシーの制約を作成するをご覧ください。

必要な 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.
    
  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
  • dataform.workspaces.reset
  • dataform.workspaces.searchFiles
  • dataform.workspaces.setIamPolicy
  • dataform.workspaces.writeFile

developerconnect.connections.constructGitHubAppManifest

developerconnect.connections.create

developerconnect.connections.delete

developerconnect.connections.fetchGitHubInstallations

developerconnect.connections.fetchLinkableGitRepositories

developerconnect.connections.generateGitHubStateToken

developerconnect.connections.get

developerconnect.connections.list

developerconnect.connections.processGitHubAppCreationCallback

developerconnect.connections.processGitHubOAuthCallback

developerconnect.connections.update

developerconnect.gitRepositoryLinks.create

developerconnect.gitRepositoryLinks.delete

developerconnect.gitRepositoryLinks.fetchGitRefs

developerconnect.gitRepositoryLinks.fetchReadToken

developerconnect.gitRepositoryLinks.fetchReadWriteToken

developerconnect.gitRepositoryLinks.get

developerconnect.gitRepositoryLinks.gitProxyRead

developerconnect.gitRepositoryLinks.gitProxyWrite

developerconnect.gitRepositoryLinks.list

developerconnect.locations.*

  • developerconnect.locations.get
  • developerconnect.locations.list

developerconnect.operations.*

  • developerconnect.operations.cancel
  • developerconnect.operations.delete
  • developerconnect.operations.get
  • developerconnect.operations.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.editor)

Edit access to Workspaces and Repositories.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.config.*

  • 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.update

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.operations.*

  • dataform.operations.cancel
  • dataform.operations.delete
  • dataform.operations.get
  • dataform.operations.list

dataform.releaseConfigs.*

  • 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.delete

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.update

dataform.teamFolders.create

dataform.teamFolders.delete

dataform.teamFolders.deleteTree

dataform.teamFolders.get

dataform.teamFolders.getIamPolicy

dataform.teamFolders.update

dataform.workflowConfigs.*

  • dataform.workflowConfigs.create
  • dataform.workflowConfigs.delete
  • dataform.workflowConfigs.get
  • dataform.workflowConfigs.list
  • dataform.workflowConfigs.update

dataform.workflowInvocations.*

  • 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

dataform.workspaces.reset

dataform.workspaces.searchFiles

dataform.workspaces.writeFile

developerconnect.connections.get

developerconnect.connections.list

developerconnect.gitRepositoryLinks.fetchGitRefs

developerconnect.gitRepositoryLinks.fetchReadToken

developerconnect.gitRepositoryLinks.fetchReadWriteToken

developerconnect.gitRepositoryLinks.get

developerconnect.gitRepositoryLinks.gitProxyRead

developerconnect.gitRepositoryLinks.gitProxyWrite

developerconnect.gitRepositoryLinks.list

developerconnect.locations.*

  • developerconnect.locations.get
  • developerconnect.locations.list

developerconnect.operations.get

developerconnect.operations.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.viewer)

Read-only access to all Dataform resources.

dataform.commentThreads.get

dataform.commentThreads.list

dataform.comments.get

dataform.comments.list

dataform.compilationResults.get

dataform.compilationResults.list

dataform.compilationResults.query

dataform.config.get

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.queryContents

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.operations.get

dataform.operations.list

dataform.releaseConfigs.get

dataform.releaseConfigs.list

dataform.repositories.computeAccessTokenStatus

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.teamFolders.get

dataform.teamFolders.getIamPolicy

dataform.workflowConfigs.get

dataform.workflowConfigs.list

dataform.workflowInvocations.get

dataform.workflowInvocations.list

dataform.workflowInvocations.query

dataform.workspaces.fetchFileDiff

dataform.workspaces.fetchFileGitStatuses

dataform.workspaces.fetchGitAheadBehind

dataform.workspaces.get

dataform.workspaces.getIamPolicy

dataform.workspaces.list

dataform.workspaces.queryDirectoryContents

dataform.workspaces.readFile

dataform.workspaces.searchFiles

developerconnect.connections.get

developerconnect.connections.list

developerconnect.gitRepositoryLinks.fetchReadToken

developerconnect.gitRepositoryLinks.get

developerconnect.gitRepositoryLinks.gitProxyRead

developerconnect.gitRepositoryLinks.list

developerconnect.locations.*

  • developerconnect.locations.get
  • developerconnect.locations.list

developerconnect.operations.get

developerconnect.operations.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.codeCommenter)

Permissions to comment, at the repository level. Grants CRUD access over commentThread and comment resources.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.folders.get

dataform.folders.queryContents

dataform.locations.get

dataform.repositories.get

dataform.repositories.readFile

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.codeCreator)

Access only to private and shared code resources. The permissions in the Code Creator let you create and list code in Dataform, and access only the code that you created and code that was explicitly shared with you.

dataform.commentThreads.get

dataform.commentThreads.list

dataform.comments.get

dataform.comments.list

dataform.folders.create

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.repositories.create

dataform.repositories.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.codeEditor)

Edit access code resources.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.addContents

dataform.folders.create

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.queryContents

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.operations.get

dataform.repositories.commit

dataform.repositories.computeAccessTokenStatus

dataform.repositories.create

dataform.repositories.createTagBinding

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.queryDirectoryContents

dataform.repositories.readFile

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

dataform.workspaces.reset

dataform.workspaces.searchFiles

dataform.workspaces.writeFile

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.codeOwner)

Full access to code resources.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.*

  • 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.*

  • dataform.locations.get
  • dataform.locations.list

dataform.operations.get

dataform.operations.list

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.setIamPolicy

dataform.repositories.update

dataform.workspaces.*

  • 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
  • dataform.workspaces.reset
  • dataform.workspaces.searchFiles
  • dataform.workspaces.setIamPolicy
  • dataform.workspaces.writeFile

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.codeScheduler)

Access for scheduling workflows and releases.

dataform.releaseConfigs.create

dataform.workflowConfigs.create

(roles/dataform.codeViewer)

Read-only access to all code resources.

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.queryContents

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.repositories.computeAccessTokenStatus

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.workspaces.fetchFileDiff

dataform.workspaces.fetchFileGitStatuses

dataform.workspaces.fetchGitAheadBehind

dataform.workspaces.get

dataform.workspaces.getIamPolicy

dataform.workspaces.list

dataform.workspaces.queryDirectoryContents

dataform.workspaces.readFile

dataform.workspaces.searchFiles

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.teamFolderCommenter)

View and comment access to a team folder and its contents.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.queryContents

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.repositories.computeAccessTokenStatus

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.teamFolders.get

dataform.teamFolders.getIamPolicy

dataform.workspaces.fetchFileDiff

dataform.workspaces.fetchFileGitStatuses

dataform.workspaces.fetchGitAheadBehind

dataform.workspaces.get

dataform.workspaces.getIamPolicy

dataform.workspaces.list

dataform.workspaces.queryDirectoryContents

dataform.workspaces.readFile

dataform.workspaces.searchFiles

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.teamFolderContributor)

Edit access to a team folder and its contents.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.addContents

dataform.folders.create

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.queryContents

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.operations.get

dataform.repositories.commit

dataform.repositories.computeAccessTokenStatus

dataform.repositories.create

dataform.repositories.createTagBinding

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.queryDirectoryContents

dataform.repositories.readFile

dataform.teamFolders.get

dataform.teamFolders.getIamPolicy

dataform.teamFolders.update

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

dataform.workspaces.reset

dataform.workspaces.searchFiles

dataform.workspaces.writeFile

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.teamFolderCreator)

Access to create new team folders.

dataform.teamFolders.create

(roles/dataform.teamFolderOwner)

Full access to a team folder and its contents. Can share the team folder and its contents.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.*

  • 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.*

  • dataform.locations.get
  • dataform.locations.list

dataform.operations.get

dataform.operations.list

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.setIamPolicy

dataform.repositories.update

dataform.teamFolders.delete

dataform.teamFolders.deleteTree

dataform.teamFolders.get

dataform.teamFolders.getIamPolicy

dataform.teamFolders.setIamPolicy

dataform.teamFolders.update

dataform.workspaces.*

  • 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
  • dataform.workspaces.reset
  • dataform.workspaces.searchFiles
  • dataform.workspaces.setIamPolicy
  • dataform.workspaces.writeFile

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.teamFolderViewer)

View access to a team folder and its contents.

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.queryContents

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.repositories.computeAccessTokenStatus

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.teamFolders.get

dataform.teamFolders.getIamPolicy

dataform.workspaces.fetchFileDiff

dataform.workspaces.fetchFileGitStatuses

dataform.workspaces.fetchGitAheadBehind

dataform.workspaces.get

dataform.workspaces.getIamPolicy

dataform.workspaces.list

dataform.workspaces.queryDirectoryContents

dataform.workspaces.readFile

dataform.workspaces.searchFiles

resourcemanager.projects.get

resourcemanager.projects.list

Service agent roles

Service agent roles should only be granted to service agents.

Role Permissions

(roles/dataform.serviceAgent)

Gives permission for the Dataform API to access a secret from Secret Manager

dataform.compilationResults.create

dataform.workflowInvocations.create

resourcemanager.projects.get

resourcemanager.projects.list

カスタム Dataform ロール

カスタムロールには、指定した権限を含めることができます。開発ワークスペースの作成や、開発ワークスペース内でのファイルやディレクトリの作成など、特定の管理オペレーションを実行する権限を含むカスタムロールを作成できます。カスタムロールを作成するには、カスタムロールの作成と管理をご覧ください。

Dataform 権限のセキュリティに関する考慮事項

dataform.repositories.create 権限を持つユーザーは、カスタム サービス アカウントと、そのサービス アカウントに付与されたすべての権限を使用して、BigQuery でコードを実行できます。これには、Dataform ワークフローの実行と、Knowledge Catalog でメタデータを管理する機能が含まれます。

すべてのリポジトリに厳格な act-as モードが適用されるため、dataform.repositories.create 権限では、後続のワークフローを実行するために、ユーザーがカスタム サービス アカウントに対する act-as 権限を持っていることが暗黙的に必要になります。これにより、明示的な権限借用権限を持つユーザーのみが、サービス アカウントの ID を使用してコードを実行できるようになります。

dataform.repositories.create 権限は、次の IAM ロールに含まれています。

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

カスタム サービス アカウントと、必要なロールと権限の詳細については、Dataform に必要なアクセス権を付与するをご覧ください。

パッケージのインストール中のシークレットへのアクセス

Secret Manager のシークレットを使用して非公開 NPM パッケージを構成すると、リポジトリ内の特定の Git commit からコードを変更したり、コードのコンパイルをトリガーしたりする権限を持つユーザーが、それらのシークレットにアクセスできる可能性があります。

パッケージのインストール中(ワークスペースにパッケージを手動でインストールする場合や、特定の Git commit からコードをコンパイルする場合にトリガーされます)、NPM クライアントは .npmrc ファイルから認証情報を読み取り、構成された NPM レジストリに認証トークンを送信します。ワークスペースの .npmrc ファイルを変更する権限を持つユーザーは、レジストリ リクエストを外部サーバーにリダイレクトして、シークレットにアクセスするように設定を構成できます。

このインストールとトークンの漏洩は、次のようなシナリオで発生する可能性があります。

  • Workspace パッケージのインストール: Workspace 内で手動でトリガーされます。これには、ワークスペースの編集権限が必要です。この権限は、Dataform 編集者(roles/dataform.editor)ロールまたは Dataform コードエディタ(roles/dataform.codeEditor)ロールにあります。

  • Git commitish のコンパイル: リポジトリ内の Git commitish(ブランチ、タグ、commit SHA など)のコンパイル結果を作成するときに自動的にトリガーされます。このシナリオには dataform.compilationResults.create 権限が必要です。

認証情報を保護するには、次のことをおすすめします。

  • リポジトリ編集権限(Dataform コード編集者など)またはコンパイル権限(Dataform コード閲覧者など)を持つロールは、信頼できるユーザーにのみ付与します。

  • 組織のポリシーを使用して、Dataform が接続できるリモートの Git リポジトリを制限します。詳細については、リモート リポジトリを制限するをご覧ください。

  • Dataform サービス エージェントの Secret Manager へのアクセスを、必要なシークレットのみに制限します。

  • end_user_auth_config の設定を拒否するカスタム組織のポリシー制約を使用して、エンドユーザーの認証情報の使用を禁止します。詳細については、カスタムの組織のポリシーの制約を作成するをご覧ください。

Dataform のロールを表示する

Google Cloud コンソールで、次の操作を行います。

  1. [IAM と管理] > [ロール] ページに移動します。

    [ロール] に移動

  2. [フィルタ] フィールドで [次の中で使用] を選択し、「Dataform」と入力して Enter キーを押します。

  3. 一覧表示されたロールのいずれかをクリックして、右側のペインにロールの権限を表示します。

    たとえば、Dataform 管理者のロールには、すべての Dataform リソースに対する完全なアクセス権が付与されます。

プロジェクトに対するロールの付与については、ロールの付与をご覧ください。 この方法を使用して事前定義ロールまたはカスタムロールを付与できます。

個々のリポジトリへのアクセスを制御する

きめ細かい権限で Dataform へのアクセスを制御するには、Dataform API の repositories.setIamPolicy リクエストを使用して、個々のリポジトリに Dataform IAM ロールを設定します。

個々の Dataform リポジトリに Dataform IAM ロールを設定する手順は次のとおりです。

  1. ターミナルで、アクセスポリシーを指定して Dataform API repositories.setIamPolicy リクエストを渡します。

  2. ポリシーで、ユーザー、グループ、ドメイン、サービス エージェント、またはサービス アカウントを、次の形式で選択したロールにバインドします。

    {
    "policy":
       {
          "bindings": [
          {
             "role": "roles/ROLE",
             "members": [
                "TYPE:IDENTIFIER",
             ]
          },
          ],
       }
    }
    

    次のように置き換えます。

    • ROLE: リポジトリに付与する Dataform IAM ロール。
    • またはTYPEuser
    • IDENTIFIER: ロールを付与するユーザー、グループ、ドメイン、サービス アカウント。
  3. IAM ページで、すべてのユーザーが dataform.repositories.list 権限を持つ Dataform ロールを介して Dataform リポジトリの完全なリストを表示できることを確認します。

  4. IAM で、すべての Dataform リポジトリに対する完全アクセス権を必要とするユーザーにのみ、すべてのリポジトリに対する Dataform 管理者のロールが付与されていることを確認します。

次のコマンドは、sales リポジトリに対する Dataform 編集者のロールを付与する repositories.setIamPolicy Dataform API リクエストを単一のユーザーに渡します。

curl -H "Content-Type: application/json" -X POST -d '{ "policy": { "bindings": [{ "role": "roles/dataform.editor", "members": ["user:sasha@examplepetstore.com"]}] }}' "https://dataform.googleapis.com/v1/projects/examplepetstore/locations/us-central1/repositories/sales:setIamPolicy"

リポジトリへの公開アクセス権を付与する

Dataform リポジトリへの公開アクセス権を付与するには、リポジトリに対する IAM ロールを allAuthenticatedUsers プリンシパルに付与します。

allAuthenticatedUsers プリンシパルに IAM ロールを割り当てると、サービス アカウントと、Google アカウントで認証されたすべてのインターネット ユーザーにそのロールが付与されます。これには、個人用 Gmail アカウントなど、Google Workspace アカウントまたは Cloud Identity のドメインに接続していないアカウントも含まれます。認証されていないユーザー(匿名の訪問者など)は含まれません。詳細については、認証済みのすべてのユーザーをご覧ください。

たとえば、Dataform 閲覧者のロールを sales リポジトリの allAuthenticatedUsers に付与すると、Google アカウントで認証されたすべてのサービス アカウントとインターネット上のユーザーは、すべての sales コードリソースへの読み取り専用権限を持ちます。

Dataform リポジトリへの一般公開アクセス権を付与する手順は次のとおりです。

  1. ターミナルで、アクセスポリシーを指定して Dataform API repositories.setIamPolicy リクエストを渡します。

  2. ポリシーで、allAuthenticatedUsers プリンシパルを次の形式で選択したロールにバインドします。

    {
    "policy":
       {
          "bindings": [
          {
             "role": "roles/ROLE",
             "members": [
                "allAuthenticatedUsers",
             ]
          },
          ],
       }
    }
    

    ROLE は、すべての認証済みユーザーに付与する Dataform IAM ロールに置き換えます。

次のコマンドは、sales リポジトリに対する Dataform 閲覧者のロールを allAuthenticatedUsers に付与する repositories.setIamPolicy Dataform API リクエストを渡します。

curl -H "Content-Type: application/json" -X POST -d '{ "policy": { "bindings": [{ "role": "roles/dataform.viewer", "members": ["allAuthenticatedUsers"]}] }}' "https://dataform.googleapis.com/v1/projects/examplepetstore/locations/us-central1/repositories/sales:setIamPolicy"

リポジトリへの公開アクセスを防止する

Dataform リポジトリに対する公開アクセスを防止するには、プロジェクトの allAuthenticatedUsers プリンシパルを制限します。

プロジェクトで allAuthenticatedUsers を制限するには、iam.allowedPolicyMemberDomains ポリシーを設定し、allowed_values のリストから allAuthenticatedUsers を削除します。

iam.allowedPolicyMemberDomains ポリシーで allAuthenticatedUsers を制限すると、allAuthenticatedUsers プリンシパルをプロジェクトの IAM ポリシーで使用できないため、Dataform リポジトリを含めて、すべてのリソースへの公開アクセスの付与が防止されます。

iam.allowedPolicyMemberDomains ポリシーとその設定手順の詳細については、ドメイン別の ID の制限をご覧ください。

Dataform の Workforce Identity 連携

Workforce Identity 連携では、外部 ID プロバイダ(IdP)を使用し、IAM で Google Cloud サービスに対するユーザーの認証と認可を行うことができます。

Dataform は Workforce Identity 連携をサポートしています。既知の制限事項はありません。

IAM を使用して個々のテーブルへのアクセスを制御する

このセクションでは、個別の Dataform テーブルとビューに対して BigQuery IAM ロールを付与または取り消す方法について説明します。

Dataform がテーブルまたはビューを実行すると、BigQuery にリソースが作成されます。Dataform の開発中に、BigQuery のロールを個別のテーブルとビューに付与して、実行後に BigQuery でアクセスを制御できます。

リソースへのアクセス権の付与と取り消しについて詳しくは、リソースへのアクセス権の付与をご覧ください。

テーブルまたはビューに BigQuery のロールを付与する

Dataform のテーブルまたはビューに BigQuery のロールを付与するには、GRANT DCL ステートメントを使用して post_operations ブロックを選択したテーブルまたはビューの .sqlx 定義ファイルに追加します。

選択したテーブルまたはビューに BigQuery のロールを付与する手順は次のとおりです。

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

    Dataform に移動

  2. リポジトリを選択し、ワークスペースを選択します。

  3. [ファイル] ペインで「definitions/definitions」ディレクトリを展開します。

  4. アクセス権を付与するテーブルまたはビューの .sqlx 定義ファイルを選択します。

  5. このファイルに次のコード スニペットを入力します。

    post_operations {
        GRANT "ROLE_LIST"
        ON "RESOURCE_TYPE" ${self()}
        TO "USER_LIST"
    }
    

    以下を置き換えます。

    • ROLE_LIST: 付与する BigQuery のロールまたは BigQuery のロールのカンマ区切りリスト。

    • RESOURCE_TYPE: TABLE または VIEW。

    • USER_LIST: ロールが付与されているユーザーのカンマ区切りのリスト。

      有効な形式の一覧については、user_list をご覧ください。

  6. 省略可: [書式] をクリックします。

  7. テーブルまたはビューを実行します。

  8. 増分テーブルに対してアクセス権を付与した場合は、最初の実行後にテーブル定義ファイルから GRANT ステートメントを削除します。

次のコードサンプルは、ユーザーにテーブルに対して付与される BigQuery 閲覧者のロールを示しています。

config { type: "table" }

SELECT ...

post_operations {
  GRANT `roles/bigquery.dataViewer`
  ON TABLE ${self()}
  TO "user:222larabrown@gmail.com"
}

テーブルまたはビューから BigQuery のロールを取り消す

テーブルまたはビューから BigQuery のロールを取り消すには、REVOKE DCL ステートメントを使用して post_operations ブロックを選択したテーブルまたはビューの .sqlx 定義ファイルに追加します。

選択したテーブルまたはビューから BigQuery のロールを取り消すには、次の操作を行います。

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

    Dataform に移動

  2. リポジトリを選択し、ワークスペースを選択します。

  3. [ファイル] ペインで「definitions/definitions」ディレクトリを展開します。

  4. アクセス権を取り消すテーブルまたはビューの .sqlx 定義ファイルを選択します。

  5. post_operations ブロックに次の REVOKE ステートメントを入力します。

        REVOKE "ROLE_LIST"
        ON "RESOURCE_TYPE" ${self()}
        FROM "USER_LIST"
    

    以下を置き換えます。

    • ROLE_LIST: 取り消す BigQuery のロールまたは BigQuery のロールのカンマ区切りリスト。
    • RESOURCE_TYPE: TABLE または VIEW。
    • USER_LIST: ロールを取り消す対象ユーザーのカンマ区切りのリスト。有効な形式の一覧については、user_list をご覧ください。
  6. ファイル内の GRANT ステートメントで付与されたアクセス権を取り消すには、GRANT ステートメントを REVOKE ステートメントに置き換えます。

  7. 省略可: [書式] をクリックします。

  8. テーブルまたはビューを実行します。

  9. 増分テーブルに対してアクセス権を取り消した場合は、最初の実行後にテーブル定義ファイルから REVOKE ステートメントを削除します。

次のコードサンプルは、テーブルに対するユーザーから取り消された BigQuery 閲覧者のロールを示しています。

config { type: "table" }

SELECT ...

post_operations {
  REVOKE `roles/bigquery.dataViewer`
  ON TABLE ${self()}
  FROM "user:222larabrown@gmail.com"
}

テーブルとビューの BigQuery のロールを集約的に管理する

1 つのロケーションの個別のテーブルとビューに対する BigQuery アクセスを制御するには、GRANT および REVOKE の DCL ステートメントを使用して専用の type: "operations" ファイルを作成します。

1 つの type: "operations" ファイルで BigQuery テーブルへのアクセスを管理する手順は次のとおりです。

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

    Dataform に移動

  2. リポジトリを選択し、ワークスペースを選択します。

  3. [ファイル] ペインで、definitions/ の横にある 追加メニュー アイコン。 [その他] メニューをクリックします。

  4. [ファイルを作成] をクリックします。

  5. [ファイルパスを追加] フィールドに、ファイルの名前の後に definitions/ の後に .sqlx を入力します。例: definitions/table-access.sqlx。

    ファイル名 には数字、英字、ハイフン、アンダースコアのみを使用できます。

  6. [ファイルを作成] をクリックします。

  7. [ファイル] ペインで definitions/ ディレクトリを展開し、新しく作成されたファイルを選択します。

  8. このファイルに次のコード スニペットを入力します。

      config { type: "operations" }
    
      GRANT "ROLE_LIST"
      ON RESOURCE_TYPE RESOURCE_NAME
      TO "USER_LIST"
    
      REVOKE "ROLE_LIST"
      ON { "<var>" }}RESOURCE_TYPE RESOURCE_NAME
      TO "USER_LIST"
    

    以下を置き換えます。

    • ROLE_LIST: 付与または取り消しを行う BigQuery のロールまたは BigQuery のロールのカンマ区切りリスト。
    • RESOURCE_TYPE: TABLE または VIEW。
    • RESOURCE_NAME: テーブルまたはビューの名前。
    • USER_LIST: ロールの付与または取り消しを行う対象ユーザーのカンマ区切りのリスト。有効な形式の一覧については、user_list をご覧ください。
  9. 必要に応じて GRANT ステートメントと REVOKE ステートメントを追加します。

    1. ファイル内の GRANT ステートメントで付与されたアクセス権を取り消すには、GRANT ステートメントを REVOKE ステートメントに置き換えます。

      REVOKE ステートメントを追加せずに GRANT ステートメントを削除しても、アクセス権は取り消されません。

  10. 省略可: [書式] をクリックします。

  11. 更新のたびにファイルを実行します。

    1. 増分テーブルに対してアクセス権の付与または取り消しを行った場合は、ステートメントを最初に実行した後にファイルから GRANT ステートメントまたは REVOKE ステートメントを削除します。

Config API を使用して IAM の動作をカスタマイズする

projects.locations.updateConfig Dataform API メソッドを使用すると、IAM の動作をカスタマイズしてセキュリティを強化できます。

リソースの作成時に特定のロールを付与する

projects.locations.repositories リソースで setAuthenticatedUserAdmin フィールドを true に設定すると、Dataform はリポジトリを作成したユーザーに、そのリポジトリに対する Dataform 管理者ロール(roles/dataform.admin)を自動的に付与します。さらに、Dataform は、そのリポジトリにワークスペースを作成したユーザーに、新しいワークスペースに対する Dataform 管理者ロールを付与します。

この動作をオーバーライドするには、projects.locations.updateConfig メソッドの creator_role フィールド(プレビュー)を使用します。setAuthenticatedUserAdmin が true で、カスタムロールを使用して creator_role フィールドを構成すると、Dataform はデフォルトの dataform.admin ロールではなくカスタムロールを付与します。

拡張されたスケジュール設定の権限を実装する

Dataform ワークフローをスケジュールするためにユーザーに明示的な権限が必要になるようにするには、projects.locations.updateConfig メソッドで enable_project_checks_for_scheduling フィールドを true に設定します。

スケジューリングでこれらのチェックを有効にするには、ユーザーに次の権限が必要です。

  • ワークフロー構成を作成するには:

    • Code Scheduler ロール(roles/dataform.codeScheduler)によって付与される、プロジェクトに対する dataform.workflowConfigs.create 権限。
    • リポジトリに対する dataform.repositories.scheduleWorkflow 権限。これは、Dataform 管理者ロール(roles/dataform.admin)によって付与されます。
  • リリース構成を作成するには:

    • Code Scheduler ロール(roles/dataform.codeScheduler)によって付与される、プロジェクトに対する dataform.releaseConfigs.create 権限。
    • リポジトリに対する dataform.repositories.scheduleRelease 権限。これは、Dataform 管理者ロール(roles/dataform.admin)によって付与されます。

プライベート ワークスペースを有効にする

Dataform ワークスペースへのアクセスを制限して、ワークスペースの作成者のみがそのワークスペースでコードの読み取りと書き込みを行えるようにするには、projects.locations.updateConfig メソッドで enable_private_workspace フィールドを true に設定します。

この制限は、コンパイルされた SQL、コンパイル エラー、ワークスペースのコンパイルまたはワークフロー呼び出しの実行ログなど、生成されたアーティファクトの表示にも適用されます。

この設定は、他のリポジトリ ユーザーにワークスペースへのアクセス権を付与する標準の IAM ロールをオーバーライドします。

次のステップ