使用严格的“充当”模式

在 Dataform 中,严格的“模拟”模式会针对以下用户操作启用额外的安全检查:

  • 创建或更新代码库。
  • 创建或更新工作流配置。
  • 创建工作流调用。
  • 更新发布配置。

此额外的安全检查要求执行这些操作的用户对有效服务帐号(即用于运行工作流的服务帐号)拥有 iam.serviceAccounts.actAs 权限。 如需了解详情,请参阅 将服务账号关联到资源

所有代码库都必须采用严格的“模拟”模式。

所需的角色

如需获得完成本文档中的任务所需的权限,请让您的管理员为您授予以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义 角色或其他预定义 角色来获取所需的权限。

验证有效服务帐号的“模拟”权限

为了确保 Dataform 工作流安全无中断地运行,请务必验证工作流所用服务账号的“模拟”权限。本部分介绍如何确定资源的有效服务账号、使用 Logging 检查权限问题,然后解决您发现的任何问题。

确定有效服务帐号

您可以根据资源类型和以下条件确定运行工作流的有效服务帐号:

资源类型 有效服务帐号
代码库

为代码库配置的自定义服务帐号。所有代码库都需要自定义服务帐号。此服务帐号列在 Repository.ServiceAccount 字段中。

工作流配置

对于新的工作流配置,系统会使用您在创建工作流配置时选择的自定义服务帐号。如果未选择任何服务帐号,则使用代码库的服务帐号。

工作流调用

如果编译结果是 WORKFLOW_CONFIG 资源,则使用工作流配置的有效服务帐号。

如果您从编译结果创建工作流调用,则系统会使用 WorkflowInvocation.InvocationConfig 字段中列出的服务帐号(如果已设置)。

否则,系统会默认使用在代码库级配置的服务帐号。

在 Cloud Logging 中检查权限问题

为了提高安全性,Dataform 会检查 Dataform 资源使用的服务账号是否缺少 iam.serviceAccounts.actAs 权限。

这些检查的结果(包括任何潜在的权限问题)都会记录在 Cloud Logging 中。您应定期查看这些日志,以确定并授予任何缺少的 iam.serviceAccounts.actAs 权限。查看这些日志可确保 Dataform 工作流和配置能够继续正常运行。

在 Cloud Logging 中查看日志

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

    转到 Logs Explorer

  2. 选择您要在其中检查日志的 Google Cloud 项目。

  3. 使用查询编辑器,通过以下选项过滤 Dataform actAs 日志:

    • 如需仅列出失败且需要采取操作的 actAs 检查,请使用以下查询:

      logName: "projects/PROJECT_ID/logs/dataform.googleapis.com%2Factas_dry_run_result"
      jsonPayload.dryRunResult = false
      
    • 如需列出所有 actAs 检查,请使用以下查询:

      logName: "projects/PROJECT_ID/logs/dataform.googleapis.com%2Factas_dry_run_result"
      

    PROJECT_ID 替换为您的 Google Cloud 项目 ID。

  4. 点击运行查询

解读日志条目

展开查询结果中的日志条目,以查看以下 jsonPayload 字段:

字段 类型 说明
dryRunResult 布尔值 true:权限检查通过。

false:检查失败。调用方主账号缺少服务帐号的 iam.serviceAccounts.actAs 权限。
caller 字符串 发起 API 调用的主账号(用户或服务帐号)的电子邮件地址。
serviceAccount 字符串 调用方主账号尝试模拟的服务帐号。当 dryRunResult 字段为 false 时,通常会显示此字段。
apiMethod 字符串 触发检查的 Dataform API 方法,例如 CreateWorkflowInvocationUpdateRepository
*_context 对象 一个对象,其中包含与调用的 API 方法相关的资源名称。如需了解详情,请参阅 上下文对象
上下文对象

日志条目在 jsonPayload 字段中包含一个上下文对象。此对象中的 字段包含所涉及 Dataform 实体的完全限定 Google Cloud 资源 名称。这些名称遵循以下列表中显示的标准结构,可让您准确识别资源。

  • create_workflow_invocation_context:当 API 方法为 CreateWorkflowInvocation 时显示。

    • workflowInvocation:工作流调用的资源名称。
      • 资源名称的格式如下: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/workflowInvocations/WORKFLOW_INVOCATION_ID
    • compilationResultworkflowConfig:用于调用的来源的资源名称。
      • compilationResult 的资源名称格式如下: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/compilationResults/COMPILATION_RESULT_ID
      • workflowConfig 的资源名称格式如下: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/workflowConfigs/WORKFLOW_CONFIG_ID
  • create_repository_contextupdate_repository_context:当 API 方法为 CreateRepositoryUpdateRepository 时显示。

    • repository:Dataform 代码库的资源名称。
      • 资源名称的格式如下: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID
  • update_release_config_context:当 API 方法为 UpdateReleaseConfig 时显示。

    • releaseConfig:发布配置的资源名称。
      • 资源名称的格式如下: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/releaseConfigs/RELEASE_CONFIG_ID
  • create_workflow_config_contextupdate_workflow_config_context:当 API 方法为 CreateWorkflowConfigUpdateWorkflowConfig 时显示。

    • workflowConfig:工作流配置的资源名称。
      • 资源名称的格式如下: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/workflowConfigs/WORKFLOW_CONFIG_ID

如需将文档中记录的格式与日志条目进行比较,请替换以下内容:

  • PROJECT_ID:您的 Google Cloud 项目的唯一标识符。
  • LOCATION_ID:Dataform 代码库所在的区域。
  • REPOSITORY_ID:用户定义的 Dataform 代码库 ID。这是创建代码库时为其指定的名称。
  • COMPILATION_RESULT_ID:系统为 Dataform 编译结果生成的唯一标识符。
  • RELEASE_CONFIG_ID:用户定义的 Dataform 发布配置 ID。
  • WORKFLOW_CONFIG_ID:用户定义的 Dataform 工作流配置 ID。

解决权限问题

如需解决 Logging 中发现的权限问题,请确定失败的根本原因,然后按照相应的解决方案步骤操作。

授予缺少的“模拟”权限

如果您发现 dryRunResult 字段为 false 的日志条目,请执行以下操作:

  1. jsonPayload 详细信息中,记下 caller 字段中的电子邮件地址,以确定主账号。

  2. 记下 serviceAccount 字段中的电子邮件地址,以确定服务帐号。

  3. 确认调用方主账号 具有模拟服务帐号的权限。授予此权限后,调用方可以使用服务帐号拥有的权限。

  4. 如果访问是预期的,请向 目标 服务 账号上的调用方主账号授予Service Account User 角色(roles/iam.serviceAccountUser)。如需了解详情,请参阅 授予所需的 IAM 角色

授予角色后,此调用方和服务帐号组合的未来日志应显示 dryRunResult: true

处理跨项目服务帐号关联

如果代码库和有效服务帐号位于不同的项目中,则模拟服务帐号的请求可能会被 iam.disableCrossProjectServiceAccountUsage 组织政策限制条件阻止。

如需解决此问题,请参阅 允许跨项目关联服务账号

授予所需的 IAM 角色

Service Account User 角色 (roles/iam.serviceAccountUser) 包含 iam.serviceAccounts.actAs 权限,这是严格的“模拟”模式所必需的。使用 Dataform API 时,您必须根据要调用的 projects.locations.repositories方法 ,为有效服务帐号授予 Service Account User 角色 :

  • createpatch
    • 如果设置了 Repository.ServiceAccount 属性,则应为该属性授予 Service Account User 角色。
    • 如果您要调用 patch 方法,则应为代码库中所有工作流配置中的所有有效服务账号授予 Service Account User 角色。
  • workflowConfigs.createworkflowConfigs.patch
    • 您应为工作流配置中使用的有效服务帐号授予 Service Account User 角色。
  • releaseConfigs.patch
    • 您应为使用此发布配置的工作流配置中使用的所有有效服务账号授予 Service Account User 角色。
  • workflowInvocations.create
    • 您应为工作流调用中使用的有效服务帐号授予 Service Account User 角色。

如需向自定义服务帐号授予 Service Account User 角色,请按以下步骤操作:

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

    转到“服务账号”

  2. 选择一个项目。

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

  4. 前往有权访问的主账号 ,然后点击授予访问权限

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

    您的默认 Dataform 服务代理 ID 采用以下格式:

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

    PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。

  6. 选择角色 列表中,选择 Service Account User 角色。

  7. 点击添加其他角色 ,然后选择 Service Account Token Creator 角色。

  8. 点击保存

如需了解详情,请参阅 创建工作流配置所需的角色创建发布配置所需的角色

严格的“模拟”模式对自动发布和运行的影响

严格的“模拟”模式对自动代码库发布和自动工作流执行有以下影响。

对于未连接到第三方代码库的代码库

  • 您无法在发布配置中为自动发布设置 Cron 时间表 。强制执行此操作是为了防止由可能缺少下游服务账号的必要 iam.serviceAccounts.actAs 权限的用户所做的代码更改被自动部署。
  • 使用工作流配置中的 Cron 时间表安排的工作流运行仍处于启用状态。如需使这些自动运行成功,您必须向默认 Dataform 服务代理授予iam.serviceAccounts.actAs 工作流配置中指定的 有效服务账号 的权限。

对于连接到第三方代码库的代码库:

后续步骤

  • 如需了解如何创建代码库,请参阅 创建代码库
  • 如需详细了解 Dataform 如何与 BigQuery 搭配使用,请参阅 工作流概览
  • 如需了解如何创建工作流配置,请参阅 安排运行
  • 如需了解如何创建发布配置,请参阅 配置编译