使用严格的“充当”模式

严格的 act-as 模式可针对 Dataform 中的以下用户操作启用额外的安全检查:

  • 创建或更新代码库
  • 创建或更新工作流配置
  • 创建工作流调用
  • 更新版本配置

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

您可以通过以下方式启用这些权限:

  • 创建代码库
  • 使用 strict_act_as_checks 代码库标志更新现有代码库时

所需的角色

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

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

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

验证有效服务账号的 act-as 权限

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

确定有效服务账号

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

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

如果您在创建代码库时选择自定义服务账号,则系统会使用 Repository.ServiceAccount 服务账号。

否则,此值默认为 Dataform 服务代理

工作流配置

您可以在创建工作流配置时选择自定义服务账号。

否则,此值默认为代码库的 Dataform 服务代理

工作流调用

如果编译结果为 WORKFLOW_CONFIG,则使用工作流配置的有效服务账号。

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

否则,此值默认为代码库的 Dataform 服务代理

在 Cloud Logging 中检查权限问题

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

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

在 Cloud Logging 中查看日志

  1. 在 Google Cloud 控制台中,前往 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。

解决权限问题

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

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

  2. 记下 serviceAccount 字段中的电子邮件地址,以标识服务账号。

  3. 确认调用方主账号有权以服务账号身份执行操作。授予此权限后,调用方可以使用服务账号所拥有的权限。

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

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

授予 Service Account User IAM 角色

服务账号用户角色 (roles/iam.serviceAccountUser) 包含 iam.serviceAccounts.actAs 权限,这是严格的“以服务账号身份执行操作”模式所必需的权限。使用 Dataform API 时,您必须已根据所调用的 projects.locations.repositories 方法为有效服务账号授予服务账号用户角色:

  • createpatch
    • 如果设置了 Repository.ServiceAccount 属性,则您应该已获得该属性的 Service Account User 角色。
    • 如果您要调用 patch 方法,则应为代码库中所有工作流配置中的所有有效服务账号授予 Service Account User 角色。
  • workflowConfigs.createworkflowConfigs.patch
    • 您应为工作流配置中使用的有效服务账号授予服务账号用户角色。
  • releaseConfigs.patch
    • 您应针对使用此发布配置的工作流配置中使用的所有有效服务账号,获得“服务账号用户”角色。
  • workflowInvocations.create
    • 您应为工作流调用中使用的有效服务账号授予 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
    
  6. 选择角色列表中,选择 Service Account User 角色。

  7. 点击保存

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

严格的“以…身份行动”模式对自动发布和运行的影响

启用严格的“充当”模式后,会对自动代码库发布和自动工作流执行产生以下影响:

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

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

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

  • 允许安排发布和工作流运行。
  • 如需启用基于版本配置的自动发布或基于工作流配置的自动运行,您必须向默认 Dataform 服务代理授予相关有效服务账号iam.serviceAccounts.actAs 权限:
    • 对于自动发布配置,请向由相应发布配置触发的所有工作流配置的有效服务账号授予相应权限。
    • 对于自动工作流配置,请向该工作流配置所用的有效服务账号授予相应权限。

后续步骤

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