使用 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 控制台信息中心内找到 Google Cloud 项目 ID。如需了解详情,请参阅查找项目名称、编号和 ID。

Dataform 服务代理、自定义服务账号和 Google 账号所需的角色

Dataform 服务代理、自定义服务账号以及用于在 Dataform 中进行身份验证的 Google 账号的用户凭证需要以下 BigQuery IAM 角色才能在 BigQuery 中运行工作流:

此外,还需在工作流配置的有效服务账号上向 Dataform 服务代理授予以下角色。这些角色是严格 act-as 模式正常运行所必需的。

对于自动代码库发布和自动工作流运行,请向 Dataform 服务代理授予对有效服务账号的 iam.serviceAccounts.actAs 权限。

如需在 Knowledge Catalog 中启用元数据丰富功能和数据质量记分卡集成,请向用于执行工作流的自定义服务账号或 Google 账号授予项目或 @bigquery 条目组的 Dataplex Catalog Editor (roles/dataplex.catalogEditor) 角色。

安全注意事项

向 Dataform 服务代理、自定义服务账号或用户的 Google 账号授予 Dataform 所需的角色时,需要考虑以下安全因素:

  • 无论 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 Job User 角色。

  7. 点击添加其他角色,然后在选择角色列表中选择 BigQuery Data Editor 角色。

  8. 点击添加其他角色,然后在选择角色列表中选择 BigQuery Data Viewer 角色。

  9. 点击保存。

授予自动工作流所需的角色

如需在 Dataform 中使用自定义服务账号,Dataform 服务代理必须能够访问该自定义服务账号。这样,Dataform 就可以使用自定义服务账号(而非服务代理账号)上定义的权限来运行工作流。

如需授予此访问权限,您需要向 Dataform 服务代理授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator) 作为主账号。这样,Dataform 服务代理就可以通过创建称为令牌的短期有效凭据来模拟服务账号。Dataform 需要这些令牌才能使用自定义服务账号的身份运行工作流。

您还需要向 Dataform 服务代理授予 Service Account User 角色 (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. 在选择角色列表中,选择 Service Account Token Creator 角色和 Service Account User 角色。

  7. 点击保存。

现在,您可以在 Dataform 代码库中配置自定义服务账号。

审核服务账号配置

本部分介绍如何审核 Dataform 资源,以确保正确使用服务账号和授予权限。使用自定义服务账号时,审核尤为重要,因为它们需要 Dataform 服务代理的特定权限才能运行。

为 Dataform 代码库或工作流配置使用自定义服务账号时,您必须验证 Dataform 服务代理在自定义服务账号上是否具有 Service Account User 角色 (roles/iam.serviceAccountUser)。此角色会授予 iam.serviceAccounts.actAs 权限,该权限允许由 Dataform 服务代理发起的预定运行模拟自定义服务账号。此外,请验证 Dataform 服务代理在有效服务账号上是否具有 Service Account Token Creator 角色 (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 服务代理是否对该自定义服务账号同时拥有 Service Account User 角色 (roles/iam.serviceAccountUser) 和 Service Account Token Creator 角色 (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 服务代理已获得该自定义服务账号的 Service Account User 角色 (roles/iam.serviceAccountUser) 和 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator)。这些权限允许 Dataform 服务代理模拟自定义服务账号来发起工作流执行。

使用 Security Command Center 监控服务代理权限

为确保始终遵循最小权限原则,请在 Security Command Center 中主动监控项目,查找与权限过高的服务账号和服务代理相关的发现结果。

如需了解如何在 Security Command Center 中查看和应用修复发现结果,请参阅 IAM Recommender 发现结果和在控制台中调查身份发现结果。

在针对 Dataform 服务代理修正 SERVICE_AGENT_GRANTED_BASIC_ROLE 发现结果时,请将权限过多的角色替换为具有最低所需权限的预定义角色,并将范围限定为特定资源。例如,针对特定服务账号授予 Service Account User 角色 (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 权限,以便执行后续工作流。这样可以确保只有具有明确模拟权限的用户才能使用服务账号的身份执行代码。

以下 IAM 角色包含 dataform.repositories.create 权限:

如需限制用户或服务账号在 BigQuery 中可以读取或写入的数据,您可以向所选 BigQuery 数据集或表授予精细的 BigQuery IAM 权限。如需了解详情,请参阅控制对数据集的访问权限和控制对表和视图的访问权限。

如需详细了解自定义服务账号及其所需的角色和权限,请参阅授予 Dataform 所需的访问权限。

软件包安装期间的密钥访问

如果您使用 Secret Manager 密钥配置私有 NPM 软件包,则有权修改代码或触发从代码库中特定 Git 提交内容编译代码的用户可能会访问这些密钥。

在软件包安装期间(在工作区中手动安装软件包或从特定 Git 提交编译代码时触发),NPM 客户端会从 .npmrc 文件中读取凭据,并将身份验证令牌传输到配置的 NPM 注册表。有权修改其工作区中的 .npmrc 文件的用户可以配置设置,通过将注册表请求重定向到外部服务器来访问 Secret。

在以下情况下,可能会发生此安装和潜在的令牌泄露:

  • 工作区软件包安装:在工作区内手动触发。这需要工作区修改权限,您可以在 Dataform Editor (roles/dataform.editor) 或 Dataform 代码编辑器 (roles/dataform.codeEditor) 角色中找到这些权限。

  • 编译 Git commitish:在为代码库中的 Git commitish(例如分支、标记或提交 SHA)创建编译结果时自动触发。此场景需要 dataform.compilationResults.create 权限。

为确保凭证安全,我们建议您执行以下操作:

  • 仅向可信用户授予具有代码库修改权限(例如 Dataform Code Editor)或编译权限(例如 Dataform Code Viewer)的角色。

  • 使用组织政策限制 Dataform 可以连接到的远程 Git 代码库。如需了解详情,请参阅限制远程仓库。

  • 将 Dataform 服务代理的 Secret Manager 访问权限限制为仅限必要的 Secret。

  • 使用拒绝设置 end_user_auth_config 的自定义组织政策限制条件,禁止使用最终用户凭证。如需了解详情,请参阅创建自定义组织政策限制条件。

查看 Dataform 角色

在 Google Cloud 控制台中,执行以下步骤:

  1. 前往 IAM 和管理 > 角色页面。

    打开“角色”

  2. 在过滤条件字段中,选择用于,输入 Dataform,然后按 Enter 键。

  3. 点击列出的某个角色,即可在右侧窗格中查看该角色的权限。

    例如,Dataform Admin 角色拥有对所有 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 角色。
    • TYPE:user、group、domain 或 serviceAccount。
    • IDENTIFIER:您要向其授予角色的用户、群组、网域或服务账号。
  3. 在 IAM 页面中,确保所有用户都可以通过具有 dataform.repositories.list 权限的 Dataform 角色查看 Dataform 代码库的完整列表。

  4. 在 IAM 中,确保仅向需要对所有 Dataform 代码库拥有完整访问权限的用户授予对所有代码库的 Dataform Admin 角色。

以下命令会传递 repositories.setIamPolicy Dataform API 请求,该请求会向单个用户授予对 sales 代码库的 Dataform Editor 角色:

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"

授予对代码库的公开访问权限

您可以通过向 allAuthenticatedUsers 主账号授予代码库的 IAM 角色,来授予对 Dataform 代码库的公开访问权限。

当您向 allAuthenticatedUsers 主账号分配 IAM 角色时,互联网上所有已使用 Google 账号进行身份验证的服务账号和用户都会获得该角色。此标识符包括未关联到 Google Workspace 账号或 Cloud Identity 网域的账号,如个人 Gmail 账号。不包括未经身份验证的用户,例如匿名访问者。如需了解详情,请参阅所有经过身份验证的用户。

例如,如果您向 sales 代码库授予 allAuthenticatedUsers 的 Dataform Viewer 角色,那么互联网上所有已使用 Google 账号进行身份验证的服务账号和用户都将拥有对所有 sales 代码资源的只读访问权限。

如需向 Dataform 代码库授予公开访问权限,请按照以下步骤操作:

  1. 在终端中,传递带有访问政策的 Dataform API repositories.setIamPolicy 请求。

  2. 在政策中,将 allAuthenticatedUsers 主账号绑定到所选角色,格式如下:

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

    将 ROLE 替换为您要向所有经过身份验证的用户授予的 Dataform IAM 角色。

以下命令会传递 repositories.setIamPolicy Dataform API 请求,该请求会向 allAuthenticatedUsers 授予 sales 代码库的 Dataform Viewer 角色:

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,则无法在项目的任何 IAM 政策中使用 allAuthenticatedUsers 主账号,这会阻止授予对所有资源(包括 Dataform 代码库)的公开访问权限。

如需详细了解 iam.allowedPolicyMemberDomains 政策以及设置该政策的说明,请参阅按网域限制身份。

Dataform 中的员工身份联合

借助员工身份联合,您可以使用外部身份提供方 (IdP) 通过 IAM 对用户进行身份验证和授权,以便他们访问 Google Cloud 服务。

Dataform 支持员工身份联合,没有已知限制。

使用 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/ 目录。

  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 Viewer 角色:

config { type: "table" }

SELECT ...

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

撤消表或视图的 BigQuery 角色

您可以通过将包含 REVOKE DCL 语句的 post_operations 块添加到所选表或视图的 .sqlx 定义文件中,撤消表或视图的 BigQuery 角色。

如需撤消所选表或视图的 BigQuery 角色,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Dataform 页面。

    前往 Dataform

  2. 选择一个代码库,然后选择一个工作区。

  3. 在文件窗格中,展开 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 Viewer 角色:

config { type: "table" }

SELECT ...

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

集中管理表和视图的 BigQuery 角色

如需在单个位置控制对单个表和视图的 BigQuery 访问权限,您可以使用 GRANT 和 REVOKE DCL 语句创建专用 type: "operations" 文件。

如需在单个 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 语句。

      移除 GRANT 语句而不添加 REVOKE 语句不会撤消访问权限。

  10. 可选:点击格式化。

  11. 每次更新后运行该文件。

    1. 如果您授予或撤消了对增量表的访问权限,请在首次执行 GRANT 或 REVOKE 语句后从文件中移除该语句。

使用 Config API 自定义 IAM 行为

您可以使用 projects.locations.updateConfig Dataform API 方法自定义 IAM 行为并增强安全性。

在创建资源时授予特定角色

当您在 projects.locations.repositories 资源中将 setAuthenticatedUserAdmin 字段设置为 true 时,Dataform 会自动向创建代码库的用户授予该代码库的 Dataform Admin 角色 (roles/dataform.admin)。此外,Dataform 会向在该代码库中创建工作区的任何用户授予新工作区的 Dataform Admin 角色。

您可以使用 projects.locations.updateConfig 方法中的 creator_role 字段(预览版)来替换此行为。如果 setAuthenticatedUserAdmin 为 true,并且您使用自定义角色配置 creator_role 字段,则 Dataform 会授予自定义角色,而不是默认的 dataform.admin 角色。

实现增强的调度权限

如需要求用户必须拥有明确权限才能安排 Dataform 工作流,请在 projects.locations.updateConfig 方法中将 enable_project_checks_for_scheduling 字段设置为 true。

如果您为调度启用这些检查,则用户需要以下权限:

  • 如需创建工作流配置,请执行以下操作:

    • 项目的 dataform.workflowConfigs.create 权限,由 Code Scheduler 角色 (roles/dataform.codeScheduler) 授予。
    • 代码库的 dataform.repositories.scheduleWorkflow 权限,由 Dataform Admin 角色 (roles/dataform.admin) 授予。
  • 如需创建发布配置,请执行以下操作:

    • 项目的 dataform.releaseConfigs.create 权限,由 Code Scheduler 角色 (roles/dataform.codeScheduler) 授予。
    • 代码库的 dataform.repositories.scheduleRelease 权限,由 Dataform Admin 角色 (roles/dataform.admin) 授予。

启用私密工作区

如需限制对 Dataform 工作区的访问权限,以便只有工作区创建者才能在该工作区中读取和写入代码,请在 projects.locations.updateConfig 方法中将 enable_private_workspace 字段设置为 true。

此限制也适用于查看生成的工件,例如工作区编译或工作流调用的已编译 SQL、编译错误和运行日志。

此设置会覆盖向其他代码库用户授予工作区访问权限的标准 IAM 角色。

后续步骤