對於無代理程式傳輸作業,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 控制台
前往 Google Cloud 控制台的「Service Accounts」(服務帳戶) 頁面。
選取專案。
按一下使用者代管服務帳戶的電子郵件地址。
選取 [權限] 分頁標籤。
按一下「授予存取權」
。輸入使用者的電子郵件地址。例如
user1@example.com
。在「角色」下拉式選單中,選取「服務帳戶使用者」。
按一下 [儲存]。主體會取得服務帳戶的角色。
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
)。
您需要服務專員的電子郵件地址才能授予存取權。如要查看服務專員的電子郵件地址,請按照下列步驟操作:
前往
googleServiceAccounts.get
參考資料頁面。系統會開啟名為「試試這個方法」的互動式面板。
在面板的「Request parameters」下方,輸入專案 ID。您在此處指定的專案必須是用於管理 Storage 移轉服務的專案。
按一下 [Execute] (執行)。
系統會將服務專員的電子郵件地址傳回做為
accountEmail
的值。採用的格式為project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com
。
接著,如要將使用者管理的服務帳戶存取權授予服務專員,請按照下列步驟操作:
Google Cloud 控制台
前往 Google Cloud 控制台的「Service Accounts」(服務帳戶) 頁面。
選取專案。
按一下使用者代管服務帳戶的電子郵件地址。
選取 [權限] 分頁標籤。
按一下「授予存取權」
。輸入服務專員的電子郵件地址。
在「Role」下拉式清單中,選取「Service Account Token Creator」。
按一下 [儲存]。主體會取得服務帳戶的角色。
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 控制台
按照操作說明建立轉移作業。在完成轉移工作之前:
- 在「選擇設定」頁面中,找出「服務帳戶類型」部分。
- 選取「使用者自行管理的服務帳戶」。
- 使用格式
SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
輸入使用者代管的服務帳戶電子郵件地址。 - 按一下「建立」,即可建立轉移工作。
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": {
...
}
}