將服務代理人權限委派給使用者管理的服務帳戶

對於無代理程式傳輸作業,Storage 移轉服務預設會使用服務代理程式,在來源和目的地之間傳輸資料。您會授予服務代理存取 Cloud Storage 值區的權限。

由於專案中的所有轉移作業都使用相同的 Storage 移轉服務服務代理,因此該代理必須具備每個轉移作業涉及的「所有」值區的權限。

您也可以改為將資料夾權限指派給多個使用者自行管理的服務帳戶。這些使用者管理的服務帳戶會獲得特定來源和目標值區的權限,且會受到特定使用者帳戶 (建立或觸發轉移作業的帳戶) 的限制。

範例情境

以下情境說明使用服務代理程式和使用者代管的服務帳戶時,可使用的不同權限選項。

展開各個部分即可查看詳細資料。

情境 1:僅限服務代理

在這種情況下,所有權限都會授予服務代理程式。

  • 服務代理已獲得值區 A、B、C 和 D 的寫入權限。

凡是具備建立轉移工作所需權限的使用者,都可以將資料移入或移出 A、B、C 和 D 桶。

當 Storage 移轉服務使用者是所有值區中資料的受信任使用者,且可以正確設定轉移工作,以免將資料移入或移出錯誤的值區時,這項做法就會運作良好。

情境 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 已獲得 bucket C 的只讀權限,以及 bucket D 的寫入權限。
  • 使用者 Alpha 已獲得由使用者自行管理的服務帳戶 #1 的存取權。

在這種情況下:

  • 任何具備建立轉移作業的正確權限的使用者,都可以將資料轉移至或從桶 A 和 B 中移出。無法轉移至或從值區 C 或 D 移出。
  • 使用者 Alpha 可以將資料移入或移出區塊 A 和 B。
  • Alpha 可以將 bucket C 的資料傳出至 bucket D。
  • Alpha「無法」將值區 C 轉移至值區 A 或 B。

導入總覽

實作方式如下:

  • 您可以建立使用者管理的服務帳戶,也可以使用現有的服務帳戶。
  • 您授予權限:
    • 使用者可存取使用者代管的服務帳戶。
    • 讓服務代理程式從使用者管理的服務帳戶產生存取權杖
    • 讓使用者自行管理的服務帳戶存取資料夾。
  • 使用者建立指定使用者代管服務帳戶的轉移作業。
  • Storage 移轉服務會檢查使用者是否具備服務帳戶的正確權限。如果未授予正確的權限,轉移工作就會失敗。
  • 服務代理會代表使用者管理的服務帳戶產生 OAuth 權杖。OAuth 權杖可讓 Storage 移轉服務存取轉移作業涉及的值區。
  • 執行轉移工作。
  • OAuth 權杖的有效期限很短,如果憑證過期時轉移工作仍在進行中,Storage 轉移服務會產生新的憑證,並繼續轉移作業。

設定權限委派

按照操作說明,將服務代理人存取權委派給使用者管理的服務帳戶。

需求條件

  • 如要建立新的使用者管理服務帳戶,您必須擁有專案的「建立服務帳戶」(roles/iam.serviceAccountCreator) 角色。
  • 如要將使用者和服務代理的存取權授予使用者管理的服務帳戶,您需要在使用者管理的服務帳戶或專案中,擁有「服務帳戶管理員」(roles/iam.serviceAccountAdmin) 角色。

建立或識別使用者代管的服務帳戶

您可以建立新的使用者管理服務帳戶,也可以使用現有帳戶。

  • 如要建立使用者管理的服務帳戶,請按照「建立服務帳戶」一文中的操作說明進行。

  • 如要使用現有的使用者代管服務帳戶,您需要該帳戶的電子郵件地址,其格式如下:

    SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

如果服務帳戶位於與轉移工作不同的專案中,請參閱啟用服務帳戶跨專案附加功能

將存取權授予使用者

授予使用者帳戶存取新使用者自行管理的服務帳戶的權限,並指派「服務帳戶使用者」角色 (roles/iam.serviceAccountUser)。使用者帳戶是用來建立或更新轉移工作時所使用的帳戶。

Google Cloud 控制台

  1. 前往 Google Cloud 控制台的「Service Accounts」(服務帳戶) 頁面。

    前往「Service Accounts」(服務帳戶)

  2. 選取專案。

  3. 按一下使用者代管服務帳戶的電子郵件地址。

  4. 選取 [權限] 分頁標籤。

  5. 按一下「授予存取權」

  6. 輸入使用者的電子郵件地址。例如 user1@example.com

  7. 在「角色」下拉式選單中,選取「服務帳戶使用者」

  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

授予服務代理的存取權

如要讓服務代理程式從使用者管理的服務帳戶產生存取權杖,請授予服務代理程式使用者管理的服務帳戶存取權,並指派服務帳戶憑證建立者角色 (roles/iam.serviceAccountTokenCreator)。

您需要服務專員的電子郵件地址才能授予存取權。如要查看服務專員的電子郵件地址,請按照下列步驟操作:

  1. 前往 googleServiceAccounts.get 參考資料頁面

    系統會開啟名為「試試這個方法」的互動式面板。

  2. 在面板的「Request parameters」下方,輸入專案 ID。您在此處指定的專案必須是用於管理 Storage 移轉服務的專案。

  3. 按一下 [Execute] (執行)

    系統會將服務專員的電子郵件地址傳回做為 accountEmail 的值。採用的格式為 project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com

接著,如要將使用者管理的服務帳戶存取權授予服務專員,請按照下列步驟操作:

Google Cloud 控制台

  1. 前往 Google Cloud 控制台的「Service Accounts」(服務帳戶) 頁面。

    前往「Service Accounts」(服務帳戶)

  2. 選取專案。

  3. 按一下使用者代管服務帳戶的電子郵件地址。

  4. 選取 [權限] 分頁標籤。

  5. 按一下「授予存取權」

  6. 輸入服務專員的電子郵件地址。

  7. 在「Role」下拉式清單中,選取「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:服務專員的電子郵件地址。

將 bucket 權限授予使用者管理的服務帳戶

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": {
    ...
  }
}