配置对来源的访问权限:Microsoft Azure Storage

在从 Azure Storage 存储桶转移数据之前,您必须配置对该存储桶的访问权限,以便 Storage Transfer Service 能够检索其对象。

Storage Transfer Service 支持以下 Azure 身份验证方法:

  • 共享访问签名 (SAS) 令牌。您可以在创建转移作业时直接指定 SAS 令牌,也可以将其存储在 Secret Manager 中。

  • Azure 共享密钥可存储在 Secret Manager 中,并在创建传输作业时传递 Secret。

  • 在创建传输作业期间,系统会在 federatedIdentityConfig 对象中传递联合凭据

本文档还介绍了如何将 Storage Transfer Service 工作器 IP 地址添加到 Azure Storage 防火墙以允许访问。如需了解详情,请参阅 IP 限制

支持的区域

Storage Transfer Service 能够转移来自以下 Microsoft Azure Storage 区域的数据:
  • 美洲:美国东部、美国东部 2、美国西部、美国西部 2、美国西部 3、美国中部、美国中北部、美国中南部、美国中西部、加拿大中部、加拿大东部、巴西南部
  • 亚太地区:澳大利亚中部、澳大利亚东部、澳大利亚东南部、印度中部、印度南部、印度西部、东南亚、东亚、日本东部、日本西部、韩国南部、韩国中部
  • 欧洲、中东、非洲 (EMEA):法国中部、德国中西部、挪威东部、瑞典中部、瑞士北部、北欧、西欧、英国南部、英国西部、卡塔尔中部、阿联酋北部,南非北部

选项 1:使用 SAS 令牌进行身份验证

如需使用 SAS 令牌配置对 Microsoft Azure Storage 容器的访问权限,请按以下步骤操作。或者,您也可以将 SAS 令牌保存在 Secret Manager 中;具体方法请参阅在 Secret Manager 中使用 Azure 共享密钥或 SAS 令牌进行身份验证中的说明。

  1. 创建或使用现有的 Microsoft Azure Storage 用户来访问 Microsoft Azure Storage Blob 容器的存储账号。

  2. 在容器级层创建一个 SAS 令牌。如需了解相关说明,请参阅使用共享访问签名授予对 Azure Storage 资源的有限访问权限

    1. 允许的服务必须包含 Blob

    2. 允许的资源类型部分,选择容器对象

    3. 允许的权限必须包含读取列出。如果转移作业配置为从来源删除对象,则还必须包含删除权限。

    4. SAS 令牌的默认到期时间为 8 小时。设置合理的到期时间,以便成功完成转移。

    5. 请勿在允许的 IP 地址字段中指定任何 IP 地址。Storage Transfer Service 使用各种 IP 地址,并且不支持 IP 地址限制。

    6. 允许的协议应为仅限 HTTPS

  3. 创建令牌后,记下返回的 SAS 令牌值。使用 Storage Transfer Service 配置转移作业时,您需要用到此值。

方案 2:使用 Secret Manager 中的 Azure 共享密钥或 SAS 令牌进行身份验证

Secret Manager 是用于存储和管理密码等敏感数据的安全服务。它使用强大的加密、基于角色的访问权限控制和审核日志记录来保护您的 Secret。

Storage Transfer Service 支持引用安全存储的 Azure 凭据的 Secret Manager 资源名称。

如需使用 Azure 共享密钥,您必须将密钥保存在 Secret Manager 中。SAS 令牌可以保存在 Secret Manager 中,也可以直接传递

当您指定共享密钥时,Storage Transfer Service 会使用该密钥生成一个服务 SAS,其范围仅限于转移作业中指定的 Azure 容器。

启用该 API

Enable the Secret Manager API.

Enable the API

配置其他权限

用户权限

创建 Secret 的用户需要以下角色:

  • Secret Manager Admin (roles/secretmanager.admin)

了解如何授予角色

服务代理权限

Storage Transfer Service 服务代理需要以下 IAM 角色:

  • Secret Manager Secret Accessor (roles/secretmanager.secretAccessor)

如需向您的服务代理授予角色:

Cloud 控制台

  1. 按照说明检索您的服务代理电子邮件

  2. 在 Google Cloud 控制台中,转到 IAM 页面。

    转到 IAM

  3. 点击授予使用权限

  4. 新的主账号文本框中,输入服务代理电子邮件地址。

  5. 选择角色下拉列表中,搜索并选择 Secret Manager Secret Accessor

  6. 点击保存

gcloud

使用 gcloud projects add-iam-policy-binding 命令将 IAM 角色添加到服务代理。

  1. 按照说明检索您的服务代理电子邮件

  2. 从命令行中,输入以下命令:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member='serviceAccount:SERVICE_AGENT_EMAIL' \
      --role='roles/secretmanager.secretAccessor'
    

创建 Secret

使用 Secret Manager 创建 Secret:

Cloud 控制台

  1. 转到 Google Cloud 控制台中的 Secret Manager 页面。

    转到 Secret Manager

  2. 点击创建密钥

  3. 输入名称。

  4. 密钥值文本框中,按以下格式之一输入凭据。

    {
      "sas_token" : "SAS_TOKEN_VALUE"
    }
    

    或:

    {
      "access_key" : "ACCESS_KEY"
    }
    
  5. 点击创建密钥

  6. 创建 Secret 后,请记下 Secret 的完整资源名称:

    1. 选择概览标签页。

    2. 复制资源名称的值。它使用以下格式:

      projects/1234567890/secrets/SECRET_NAME

gcloud

如需使用 gcloud 命令行工具创建新 Secret,请将 JSON 格式的凭据传递给 gcloud secrets create 命令:

printf '{
  "sas_token" : "SAS_TOKEN_VALUE"
}' | gcloud secrets create SECRET_NAME --data-file=-

或:

printf '{
  "access_key" : "ACCESS_KEY"
}' | gcloud secrets create SECRET_NAME --data-file=-

检索 Secret 的完整资源名称:

gcloud secrets describe SECRET_NAME

请记下响应中 name 的值。它使用以下格式:

projects/1234567890/secrets/SECRET_NAME

如需详细了解如何创建和管理 Secret,请参阅 Secret Manager 文档

将 Secret 传递给作业创建命令

将 Secret Manager 与 Storage Transfer Service 配合使用需要使用 REST API 创建转移作业。

将 Secret Manager 资源名称作为 transferSpec.azureBlobStorageDataSource.credentialsSecret 字段的值传递:

POST https://storagetransfer.googleapis.com/v1/transferJobs

{
  "description": "Transfer with Secret Manager",
  "status": "ENABLED",
  "projectId": "PROJECT_ID",
  "transferSpec": {
    "azureBlobStorageDataSource": {
      "storageAccount": "AZURE_STORAGE_ACCOUNT_NAME",
      "container": "AZURE_CONTAINER_NAME",
      "credentialsSecret": "SECRET_RESOURCE_ID",
    },
    "gcsDataSink": {
      "bucketName": "CLOUD_STORAGE_BUCKET_NAME"
    }
  }
}

如需详细了解如何创建转移作业,请参阅创建转移作业

选项 3:使用联合身份进行身份验证

Storage Transfer Service 支持将 Azure 工作负载身份联合与 Google Cloud 搭配使用。Storage Transfer Service 可以通过已注册的 Azure 应用向 Azure Storage 发出请求,从而无需直接将凭据传递给 Storage Transfer Service。

如需配置联合身份,请按照以下说明操作。

配置 Google Cloud 凭据

您必须向 Storage Transfer Service 服务代理添加 Service Account Token Creator (roles/iam.serviceAccountTokenCreator) 角色,才能为该账号创建 OpenID Connect (OIDC) ID 令牌。

  1. 检索开始使用 Storage Transfer Service 时自动创建的 Google 管理的服务代理的 accountEmailsubjectId。如需检索这些值,请执行以下操作:

    1. 进入 googleServiceAccounts.get 参考页面

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

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

    3. 点击 Execute。响应中包含 accountEmailsubjectId。保存这些值。

  2. 向 Storage Transfer Service 服务代理授予 Service Account Token Creator (roles/iam.serviceAccountTokenCreator) 角色。请按照管理对服务账号的访问权限中的说明操作。

配置 Microsoft 凭据

首先,注册应用并添加联合凭据:

  1. 登录 https://portal.azure.com
  2. 前往应用注册页面。
  3. 点击 New registration(新注册)。
  4. 输入名称。 例如 azure-transfer-app
  5. 选择仅此组织目录中的账号
  6. 点击注册。应用已创建。记下 Application (client) IDDirectory (tenant) ID。您也可以稍后从应用的概览页面检索这些信息。
  7. 点击证书和密钥,然后选择联合凭据标签页。
  8. 点击添加凭据
  9. 选择其他颁发者作为场景,然后输入以下信息:
    • 签发机构:https://accounts.google.com
    • 正文标识符:服务代理的 subjectId,您可以在配置 Google Cloud 凭据中检索到。
    • 联合凭据的唯一名称。
    • 受众群体必须保持为 api://AzureADTokenExchange
  10. 点击添加

接下来,向应用授予对您的 Azure Storage 容器的访问权限:

  1. 前往 Azure 账号中的存储账号页面。
  2. 选择您的存储账号,然后从数据存储部分中选择容器
  3. 点击要授予访问权限的存储桶。
  4. 点击左侧菜单中的访问控制 (IAM),然后选择角色标签页。
  5. 点击任意角色旁边的菜单图标 (...),然后选择克隆
  6. 为此自定义角色输入名称,然后选择从头开始。点击下一步
  7. 点击添加权限,然后搜索 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read
  8. 点击随即显示的 Microsoft Storage 卡片。
  9. 选择数据操作单选按钮。
  10. 选择 Read : Read Blob
  11. 点击添加
  12. 如果您要在转移后删除来源中的对象,请再次点击添加权限,然后搜索 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete
  13. 点击随即显示的 Microsoft Storage 卡片,选择数据操作,然后选择删除:删除 Blob
  14. 点击添加
  15. 依次点击 Review + create(检查 + 创建)和 Create(创建)。您将返回到该存储桶的访问权限控制 (IAM) 页面。
  16. 点击添加,然后选择添加角色分配
  17. 从角色列表中选择您的自定义角色,然后点击下一步
  18. 点击选择成员
  19. 选择字段中,输入您之前注册的应用的名称。例如 azure-transfer-app
  20. 点击相应应用图块,然后点击选择
  21. 点击检查 + 分配

将应用标识符传递给作业创建命令

系统会使用 federatedIdentityConfig 对象将应用的标识符传递给作业创建命令。将您在配置 Microsoft 凭据步骤中保存的应用(客户端)ID目录(租户)ID 复制到 client_idtenant_id 字段。

"federatedIdentifyConfig": {
  "client_id": "efghe9d8-4810-800b-8f964ed4057f",
  "tenant_id": "abcd1234-c8f0-4cb0-b0c5-ae4aded60078"
}

作业创建请求示例如下:

POST https://storagetransfer.googleapis.com/v1/transferJobs

{
  "description": "Transfer with Azure Federated Identity",
  "status": "ENABLED",
  "projectId": "PROJECT_ID",
  "transferSpec": {
    "azureBlobStorageDataSource": {
      "storageAccount": "AZURE_STORAGE_ACCOUNT_NAME",
      "container": "AZURE_CONTAINER_NAME",
      "federatedIdentifyConfig": {
        "client_id": "AZURE_CLIENT_ID",
        "tenant_id": "AZURE_TENANT_ID"
      }
    },
    "gcsDataSink": {
      "bucketName": "CLOUD_STORAGE_BUCKET_NAME"
    }
  }
}

如需详细了解如何创建转移作业,请参阅创建转移作业

IP 限制

如果您使用 Azure Storage 防火墙限制对 Azure 资源的访问,则必须将 Storage Transfer Service 工作器使用的 IP 范围添加到允许的 IP 列表。

由于这些 IP 范围可能会发生变化,因此我们会将当前值以 JSON 文件的形式发布到下面的永久地址:

https://www.gstatic.com/storage-transfer-service/ipranges.json

向文件添加新范围后,我们至少会等待 7 天,之后才会使用该范围处理来自 Storage Transfer Service 的请求。

我们建议您至少每周从本文档中提取一次数据,以确保您的安全配置保持最新。如需查看从 JSON 文件提取 IP 范围的示例 Python 脚本,请参阅 Virtual Private Cloud 文档中的这篇文章

如需将这些范围添加为允许的 IP,请按照 Microsoft Azure 文章配置 Azure Storage 防火墙和虚拟网络中的说明操作。