向用户代管式服务账号委派服务代理权限

对于无代理传输,Storage Transfer Service 默认使用服务代理在源和目标之间传输数据。您向服务代理授予 Cloud Storage 存储分区的访问权限。

由于项目中的所有转移都使用相同的 Storage Transfer Service 服务代理,因此该代理必须对每项转移涉及的所有存储分区拥有权限。

或者,您也可以改为向多个用户代管式服务账号分配存储桶权限。这些用户代管式服务账号会被授予对特定源存储分区和目标存储分区的权限,并且也仅限于特定用户账号(创建或触发转移作业的账号)。

场景示例

以下场景演示了使用服务代理和用户代管式服务账号的不同权限选项。

展开每个部分即可查看详细信息。

场景 1:仅使用服务代理

在此场景中,系统会向服务代理授予所有权限。

  • 服务代理被授予对存储分区 A、B、C 和 D 的写入权限。

任何具有创建转移作业的正确权限的用户都可以向存储分区 A、B、C 和 D 中转移或从中转移数据。

如果 Storage Transfer Service 用户是所有存储桶中数据的可信用户,并且可以正确配置转移作业以避免将数据移入或移出错误的存储桶,这种方法会非常有效。

场景 2:仅由用户代管式服务代理

在此场景中,所有权限均授予用户代管式服务账号。

  • 向用户代管式服务账号 1 授予了对存储分区 A 和 B 的权限。
  • 向用户代管式服务账号 2 授予对存储分区 C 和 D 的权限。

此外:

  • 向用户 Alpha 授予对服务账号 1 的访问权限。
  • 用户 Bravo 被授予对服务账号 2 的访问权限。
  • 用户 Charlie 被授予对服务账号 1 和 2 的访问权限。

在此示例中:

  • Alpha 只能在存储分区 A 和 B 之间转移。
  • Bravo 只能在存储分区 C 和 D 之间转移。
  • Charlie 只能在存储分区 A 和 B 之间以及 C 和 D 之间进行传输。
  • Charlie 不能在 A 和 C、A 和 D、B 和 C 或 B 和 D 之间转移。

场景 3:混合权限

在这种情况下,您的项目中混合了服务代理权限和用户代管式服务账号权限。

  • 服务代理被授予对存储分区 A 和 B 的写入权限。
  • 向用户代管式服务账号 1 授予对存储桶 C 的只读权限,以及对存储桶 D 的写入权限。
  • 向用户 Alpha 授予对用户代管式服务账号 1 的访问权限。

在此示例中:

  • 只要拥有创建转移作业的正确权限,任何用户都可以向存储分区 A 和 B 中转移或从中转移数据。它们无法转移到或从存储桶 C 或 D 转移。
  • 用户 Alpha 可以转移到或转移出分桶 A 和 B。
  • Alpha 可以将数据从存储桶 C 转出到存储桶 D。
  • Alpha 不能从存储桶 C 转移到存储桶 A 或 B。

实现概览

实现如下所示:

  • 您可以创建用户代管式服务账号,也可以使用现有服务账号。
  • 您授予的权限:
    • 允许用户访问用户代管式服务账号。
    • 供服务代理从用户代管式服务账号生成访问令牌
    • 为用户代管式服务账号授予对您的存储分区的访问权限。
  • 用户创建一个转移作业,其中指定了用户代管式服务账号。
  • Storage Transfer Service 会检查用户是否对服务账号拥有正确的权限。如果未授予正确的权限,则创建转移作业将失败。
  • 服务代理代表用户管理的服务账号生成 OAuth 令牌。借助 OAuth 令牌,Storage Transfer Service 可以访问转移中涉及的存储分区。
  • 转移作业会执行。
  • OAuth 令牌是短期有效的,会过期。如果令牌在转移作业进行时过期,Storage Transfer Service 会生成新的令牌并继续转移。

设置权限委托

按照相关说明将服务代理的访问权限委托给用户管理的服务账号。

要求

  • 如需创建新的用户代管式服务账号,您需要拥有项目的“Create Service Accounts”(roles/iam.serviceAccountCreator) 角色。
  • 如需向用户和服务代理授予对用户管理的服务账号的访问权限,您需要拥有用户代管式服务账号或项目的 Service Account Admin (roles/iam.serviceAccountAdmin) 角色。

创建或指定用户代管式服务账号

您可以创建新的用户代管式服务账号,也可以使用现有服务账号。

  • 如需创建用户代管式服务账号,请按照创建服务账号中的说明操作。

  • 如需使用现有的用户代管式服务账号,您需要其电子邮件地址,该地址采用以下格式:

    SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

如果服务账号与转移作业位于不同的项目中,请参阅允许跨项目关联服务账号

向用户授予访问权限

向用户账号授予对新用户代管式服务账号的访问权限,并分配 Service Account User 角色 (roles/iam.serviceAccountUser)。用户账号是用于创建或更新转移作业的账号。

Google Cloud 控制台

  1. 在 Google Cloud 控制台中,前往服务账号页面。

    前往“服务账号”页面

  2. 选择一个项目。

  3. 点击用户代管式服务账号的电子邮件地址。

  4. 选择权限标签页。

  5. 点击 授予访问权限

  6. 输入用户的电子邮件地址。例如 user1@example.com

  7. 角色下拉列表中,选择 Service Account User

  8. 点击保存。将向该主账号授予服务账号上的角色。

gcloud

如需向主账号授予角色,请运行 add-iam-policy-binding 命令:

gcloud iam service-accounts add-iam-policy-binding USER_MANAGED_SERVICE_ACCOUNT_EMAIL \
  --member=PRINCIPAL --role=roles/iam.serviceAccountUser

执行以下变量替换操作:

  • USER_MANAGED_SERVICE_ACCOUNT_EMAIL:用户代管式服务账号的电子邮件地址,采用 SA_NAME@PROJECT_ID.iam.gserviceaccount.com 格式。
  • PRINCIPAL:运行传输作业的用户的电子邮件地址,格式为 user:name@example.com

向服务代理授予访问权限

如需让服务代理能够从用户代管式服务账号生成访问令牌,请向服务代理授予对用户代管式服务账号的访问权限,并分配 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator)。

您需要知道服务代理的电子邮件地址才能授予访问权限。如需查找服务代理的电子邮件地址,请执行以下操作:

  1. 前往 googleServiceAccounts.get 参考页面

    系统会打开标题为试用此方法的交互式面板。

  2. 在该面板的请求参数下,输入您的项目 ID。您在此处指定的项目必须是您用于管理 Storage Transfer Service 的项目。

  3. 点击执行

    服务代理的电子邮件地址会作为 accountEmail 的值返回。其格式为 project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com

然后,如需向服务代理授予对用户代管式服务账号的访问权限,请执行以下操作:

Google Cloud 控制台

  1. 在 Google Cloud 控制台中,前往服务账号页面。

    前往“服务账号”页面

  2. 选择一个项目。

  3. 点击用户代管式服务账号的电子邮件地址。

  4. 选择权限标签页。

  5. 点击 授予访问权限

  6. 输入服务代理的电子邮件地址。

  7. 角色下拉列表中,选择 Service Account Token Creator

  8. 点击保存。将向该主账号授予服务账号上的角色。

gcloud

如需向主账号授予角色,请运行 add-iam-policy-binding 命令:

gcloud iam service-accounts add-iam-policy-binding USER_MANAGED_SERVICE_ACCOUNT_EMAIL \
  --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/iam.serviceAccountTokenCreator

执行以下变量替换操作:

  • USER_MANAGED_SERVICE_ACCOUNT_EMAIL:用户代管式服务账号的电子邮件地址,采用 SA_NAME@PROJECT_ID.iam.gserviceaccount.com 格式。
  • SERVICE_AGENT_EMAIL:服务代理的电子邮件地址。

向用户代管式服务账号授予存储桶权限

向用户代管式服务账号(而非服务代理)授予Google 代管式服务代理权限中列出的权限。

使用用户代管式服务账号创建转移作业

授予正确的权限后,您可以在创建新的转移作业时指定用户管理的服务账号。

Google Cloud 控制台

按照相应说明创建转移。在最终确定转移作业之前,请执行以下操作:

  1. 选择设置页面上,找到服务账号类型部分。
  2. 选择用户代管式服务
  3. 使用 SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com 格式输入用户代管式服务账号电子邮件地址。
  4. 点击创建以创建转移作业。

REST API

将用户代管式服务账号指定为 transferJobs.create 请求中的 serviceAccount 字段的值。

该值必须采用 projects/-/serviceAccounts/ACCOUNT_EMAIL_OR_UNIQUEID 格式。

字符串中接受服务账号电子邮件地址 (SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com) 或唯一 ID (123456789012345678901)。- 通配符是必需的,用项目 ID 替换该通配符是无效的。

例如:

POST https://storagetransfer.googleapis.com/v1/transferJobs
{
"description": "A transfer using a user-managed service account for bucket permissions",
"status": "ENABLED",
"projectId": "PROJECT_ID",
"serviceAccount": "projects/-/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com",
"transferSpec": {
    ...
  }
}