使用 IAM 控制访问权限

本文档介绍了如何在 Dataform 中执行以下操作:

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery and Dataform APIs.

    Enable the APIs

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

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery and Dataform APIs.

    Enable the APIs

  8. 授予 Dataform 所需的访问权限

    本部分介绍如何授予 Dataform 服务账号在 BigQuery 中运行工作流所需的 Identity and Access Management (IAM) 角色。

    Dataform 中的服务账号简介

    创建第一个 Dataform 代码库时,Dataform 会自动生成一个默认服务账号。Dataform 使用默认服务账号代表您与 BigQuery 进行交互。默认情况下,系统不会为默认 Dataform 服务账号授予任何 BigQuery 角色或权限。您必须向默认 Dataform 服务账号授予所需的访问权限。

    默认 Dataform 服务账号 ID 的格式如下:

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

    PROJECT_NUMBER 替换为您的Google Cloud 项目的数字 ID。您可以在Google Cloud 控制台信息中心找到 Google Cloud 项目 ID。如需了解详情,请参阅标识项目

    除了默认的 Dataform 服务账号之外,您还可以使用其他服务账号来代表您运行工作流。您可以通过以下方式配置自定义服务账号:

    创建 Dataform 代码库或工作流配置时,您可以选择与您的 Google Cloud 项目关联且您有权访问的任何服务账号。您必须为与 Dataform 资源关联的所有服务账号配置所需权限。

    与 Dataform 代码库关联的自定义服务账号仅用于运行该代码库中的工作流。所有其他代码库操作仍由默认的 Dataform 服务账号执行。

    Dataform 服务账号和 Google 账号所需的角色

    用于在 Dataform 中进行身份验证的默认服务账号、自定义服务账号以及 Google 账号用户凭据(预览版)需要具有以下 BigQuery IAM 角色,才能在 BigQuery 中运行工作流:

    此外,您还需要向默认 Dataform 服务账号授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator),以便该服务账号可以访问您要在 Dataform 中使用的任何自定义服务账号。

    如果您启用了严格的 act-as 模式预览版),并为工作流配置配置了频次设置,请向工作流配置的有效服务账号上的默认 Dataform 服务账号授予服务账号用户角色 (roles/iam.serviceAccountUser)。

    Dataform 服务账号和 Google 账号的安全注意事项

    向服务账号或用户的 Google 账号授予 Dataform 所需的角色(预览版)时,需要考虑以下安全注意事项:

    • 无论 VPC Service Controls 如何设置,任何被授予所需角色的服务账号都可能会获得对相应项目(服务账号所属的项目)中 BigQuery 或 Secret Manager 的访问权限。

      如需了解详情,请参阅配置 VPC Service Controls

    • 拥有 dataform.repositories.create IAM 权限的任何用户都可以使用默认的 Dataform 服务账号和授予该服务账号的所有权限来运行代码。

      如需了解详情,请参阅 Dataform 权限的安全注意事项

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

    为防止用户在使用其他用户的 Google 账号用户凭据时执行操作,系统会强制执行以下限制:

    • 如需修改附加了其他 Google 账号用户凭据的工作流配置,您需要将自己的 Google 账号用户凭据附加到该工作流配置,或者更改工作流配置以使用服务账号进行身份验证。
    • 如果存在引用发布配置的工作流配置,且该配置附加了其他 Google 账号用户的凭据,则您无法修改发布配置的编译结果。
    • 您无法将工作流配置设置为使用 Google 账号用户凭据进行身份验证,并引用具有时间表的发布配置。此限制会产生以下后果:

      • 如果存在引用相应发布配置且设置为使用 Google 账号用户凭据进行身份验证的工作流配置,您就无法更新发布配置以使用时间表。
      • 您无法创建使用 Google 账号用户凭据进行身份验证并指向具有时间表的发布配置的工作流配置。
      • 您无法创建或更新工作流配置,以使用 Google 账号用户凭据并指向具有时间表的发布配置。

    向 Dataform 中使用的服务账号或 Google 账号授予所需的 BigQuery 角色

    如需向您的默认 Dataform 服务账号、您要在 Dataform 中使用的自定义服务账号或您要在 Dataform 中用于身份验证的用户 Google 账号(预览版)授予所需的 BigQuery IAM 角色,请按以下步骤操作:

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

      前往 Dataform

    2. 选择或创建代码库

    3. 在 Google Cloud 控制台中,前往 IAM 页面。

      转到 IAM

    4. 点击授予访问权限

    5. 新的主账号字段中,输入服务账号 ID 或用户的 Google 账号电子邮件地址(预览版)。

    6. 选择角色列表中,选择 BigQuery Job User 角色。

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

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

    9. 点击保存

    向自定义服务账号授予令牌创建权限

    如需在 Dataform 中使用自定义服务账号,默认 Dataform 服务账号必须能够访问该自定义服务账号。如需授予此访问权限,您需要将默认 Dataform 服务账号作为主账号添加到自定义服务账号,并向该主账号授予 Service Account Token Creator 角色

    如需向自定义服务账号授予默认 Dataform 服务账号的访问权限,请按以下步骤操作:

    1. 在 Google Cloud 控制台中,依次前往 IAM > 服务账号

      转到“服务账号”

    2. 选择一个项目。

    3. 项目“PROJECT_NAME”的服务账号页面上,选择您的自定义 Dataform 服务账号。

    4. 前往权限,然后点击授予访问权限

    5. 新的主账号字段中,输入您的默认 Dataform 服务账号 ID。

      默认 Dataform 服务账号 ID 的格式如下:

      service-PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com
      
    6. 选择角色列表中,选择 Service Account Token Creator 角色。

    7. 点击保存

    使用 IAM 控制对 Dataform 的访问权限

    本部分介绍了 Dataform 的访问权限控制选项,并说明了如何查看和授予 Dataform 角色。Dataform 使用 Identity and Access Management (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.locations.get
    • dataform.locations.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.delete
    • dataform.repositories.fetchHistory
    • dataform.repositories.fetchRemoteBranches
    • dataform.repositories.get
    • dataform.repositories.getIamPolicy
    • dataform.repositories.list
    • dataform.repositories.queryDirectoryContents
    • dataform.repositories.readFile
    • dataform.repositories.setIamPolicy
    • dataform.repositories.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

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

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

    dataform.repositories.commit

    dataform.repositories.computeAccessTokenStatus

    dataform.repositories.create

    dataform.repositories.fetchHistory

    dataform.repositories.fetchRemoteBranches

    dataform.repositories.get

    dataform.repositories.getIamPolicy

    dataform.repositories.list

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

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

    dataform.repositories.*

    • 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.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.codeViewer)

    Read-only access to all code resources.

    dataform.compilationResults.*

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

    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.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.editor)

    Edit access to Workspaces and Read-only access to Repositories.

    dataform.commentThreads.get

    dataform.commentThreads.list

    dataform.comments.get

    dataform.comments.list

    dataform.compilationResults.*

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

    dataform.config.get

    dataform.locations.*

    • dataform.locations.get
    • dataform.locations.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.queryDirectoryContents

    dataform.repositories.readFile

    dataform.workflowConfigs.get

    dataform.workflowConfigs.list

    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

    resourcemanager.projects.get

    resourcemanager.projects.list

    (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

    (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.locations.*

    • dataform.locations.get
    • dataform.locations.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.queryDirectoryContents

    dataform.repositories.readFile

    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

    resourcemanager.projects.get

    resourcemanager.projects.list

    自定义 Dataform 角色

    自定义角色可以包含您指定的任何权限。您可以创建包含执行特定管理操作权限的自定义角色,例如创建开发工作区或在开发工作区内创建文件和目录。如需创建自定义角色,请参阅创建和管理自定义角色

    Dataform 权限的安全注意事项

    拥有 dataform.repositories.create 权限的任何用户都可以使用默认的 Dataform 服务账号和授予该服务账号的所有权限在 BigQuery 中运行代码。这包括执行 Dataform 工作流

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

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

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

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

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

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

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

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

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

    当您向 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/v1beta1/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 角色,方法是向所选表或视图的 .sqlx 定义文件中添加包含 GRANT DCL 语句post_operations 块。

    如需向所选表或视图授予 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_TYPETABLEVIEW

      • 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 角色:在所选表或视图的 .sqlx 定义文件中添加包含 REVOKE DCL 语句post_operations 块。

    如需撤消所选表或视图的 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_TYPETABLEVIEW
      • 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 角色

    如需在一个位置控制对单个表和视图的 BigQuery 访问权限,您可以创建一个包含 GRANTREVOKE 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_TYPETABLEVIEW
      • RESOURCE_NAME:表或视图的名称。
      • USER_LIST:为其授予或撤消角色的以英文逗号分隔的用户列表。如需查看有效格式的列表,请参阅 user_list
    9. 根据需要添加 GRANTREVOKE 语句。

      1. 如需撤消文件中 GRANT 语句授予的访问权限,请将 GRANT 语句替换为 REVOKE 语句。

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

    10. 可选:点击格式

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

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

    后续步骤