管理服務帳戶的存取權

本頁說明如何授予、變更及撤銷主體對單一服務帳戶的存取權。如要管理主體對專案、資料夾或機構中所有服務帳戶的存取權,請在專案、資料夾或機構層級管理存取權。

在 Identity and Access Management (IAM) 中,存取權是透過允許政策 (也稱為 IAM 政策) 管理。允許政策會附加至Google Cloud 資源。每項允許政策都包含一組角色繫結,可將一或多個主體 (例如使用者或服務帳戶) 與 IAM 角色建立關聯。這些角色繫結會將指定角色授予主體,包括附加允許政策的資源,以及該資源的所有子系。如要進一步瞭解允許政策,請參閱瞭解允許政策

服務帳戶既是可授予其他主體存取權的資源,也是可授予其他資源存取權的主體。本頁面將服務帳戶視為資源,並說明如何授予其他主體存取權。如要瞭解如何授予服務帳戶其他資源的存取權,請參閱下列指南:

本頁說明如何使用Google Cloud 控制台、Google Cloud CLI 和 REST API 管理服務帳戶的存取權。您也可以使用 IAM 用戶端程式庫管理存取權。

事前準備

必要 IAM 角色

如要取得管理服務帳戶存取權所需的權限,請要求管理員授予您服務帳戶或該服務帳戶所屬專案的「服務帳戶管理員」 (roles/iam.serviceAccountAdmin) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色具備管理服務帳戶存取權所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要管理服務帳戶的存取權,必須具備下列權限:

  • iam.serviceAccounts.get
  • iam.serviceAccounts.list
  • iam.serviceAccounts.getIamPolicy
  • iam.serviceAccounts.setIamPolicy

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

查看目前的存取權

以下章節說明如何使用 Google Cloud 控制台、gcloud CLI 和 REST API,查看哪些使用者有權存取服務帳戶。您也可以使用 IAM 用戶端程式庫取得服務帳戶的允許政策,藉此查看存取權。

控制台

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

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

  2. 選取專案。

  3. 按一下服務帳戶的電子郵件地址。

  4. 前往「權限」分頁標籤。「可存取這個服務帳戶的主體」部分會列出所有已獲服務帳戶角色的主體。

    這份清單包含的主體,是透過在父項資源上授予的角色取得存取權。如要進一步瞭解政策沿用機制,請參閱「政策沿用機制和資源階層」。

  5. 選用:如要查看服務代理程式的角色授予項目,請選取「包含 Google 提供的角色授予項目」 Google核取方塊。

gcloud

如要查看誰有權存取服務帳戶,請取得服務帳戶的允許政策。如要瞭解如何解讀允許政策,請參閱瞭解允許政策

如要取得服務帳戶的允許政策,請為該服務帳戶執行 get-iam-policy 指令:

gcloud iam service-accounts get-iam-policy SA_ID --format=FORMAT > PATH

提供以下這些值:

  • SA_ID:服務帳戶的 ID。這可以是 SA_NAME@PROJECT_ID.iam.gserviceaccount.com 格式的服務帳戶電子郵件地址,也可以是服務帳戶的不重複數字 ID。

  • FORMAT:政策的格式。使用 jsonyaml

  • PATH:政策的新輸出檔案路徑。

舉例來說,以下指令會取得服務帳戶 my-service-account 的政策,並以 JSON 格式儲存至主目錄:

gcloud iam service-accounts get-iam-policy my-service-account --format json > ~/policy.json

REST

如要查看誰有權存取服務帳戶,請取得服務帳戶的允許政策。如要瞭解如何解讀允許政策,請參閱瞭解允許政策

serviceAccounts.getIamPolicy 」方法會取得服務帳戶的允許政策。

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_ID:您的 Google Cloud 專案 ID。專案 ID 為英數字串,例如 my-project
  • SA_ID:服務帳戶的 ID。 這可以是 SA_NAME@PROJECT_ID.iam.gserviceaccount.com 形式的服務帳戶電子郵件地址,也可以是服務帳戶的不重複數字 ID。

  • POLICY_VERSION:要傳回的政策版本。要求應指定最新政策版本,即政策版本 3。詳情請參閱在取得政策時指定政策版本

HTTP 方法和網址:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:getIamPolicy

JSON 要求主體:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

如要傳送要求,請展開以下其中一個選項:

回應會包含服務帳戶的允許政策。例如:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/serviceAccountAdmin",
      "members": [
        "user:my-user@example.com"
      ]
    }
  ]
}

授予或撤銷單一 IAM 角色

您可以使用 Google Cloud 主控台和 gcloud CLI,對單一主體快速授予或撤銷單一角色,而不直接編輯服務帳戶的允許政策。 常見的主體類型包括 Google 帳戶、服務帳戶、Google 群組和網域。如需所有主體類型清單,請參閱「主體類型」。

一般而言,政策變更會在 2 分鐘內生效,但在某些情況下,可能需要 7 分鐘以上,系統才會全面套用變更。

如需協助找出最合適的預先定義角色,請參閱「尋找合適的預先定義角色」。

授予單一 IAM 角色

如要將單一角色授予主體,請執行下列操作:

控制台

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

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

  2. 選取專案。

  3. 按一下服務帳戶的電子郵件地址。

  4. 前往「權限」分頁,然後找到「可存取這個服務帳戶的主體」部分。

  5. 選取要授予角色的主體:

    • 如要將角色授予服務帳戶中已有其他角色的主體,請找出包含該主體的列,然後依序點選該列中的 「編輯主體」「新增其他角色」

      如要將角色授予服務代理,請選取「IncludeGoogle-provided role grants」(包含Google提供的角色授權) 核取方塊,查看服務代理的電子郵件地址。

    • 如要將角色授予服務帳戶中沒有任何角色的主體,請按一下 「授予存取權」,然後輸入主體的 ID,例如 my-user@example.com//iam.googleapis.com/locations/global/workforcePools/example-pool/group/example-group@example.com

  6. 從下拉式清單中選取要授予的角色。為遵循安全性最佳做法,請選擇僅含主體所需權限的角色。

  7. 選用:為角色新增條件

  8. 按一下 [儲存]。主體就會取得服務帳戶的角色。

gcloud

如要將角色授予主體,請執行 add-iam-policy-binding 指令:

gcloud iam service-accounts add-iam-policy-binding SA_ID \
    --member=PRINCIPAL --role=ROLE_NAME \
    --condition=CONDITION

提供以下這些值:

  • SA_ID:服務帳戶的 ID。這可以是 SA_NAME@PROJECT_ID.iam.gserviceaccount.com 格式的服務帳戶電子郵件地址,也可以是服務帳戶的不重複數字 ID。

  • PRINCIPAL:主體或成員的 ID,通常採用以下格式: PRINCIPAL-TYPE:ID。 例如 user:my-user@example.comprincipalSet://iam.googleapis.com/locations/global/workforcePools/example-pool/group/example-group@example.com。如需 PRINCIPAL 可用的完整值清單,請參閱「主體 ID」。

    對於主體類型 user,識別碼中的網域名稱必須是 Google Workspace 網域或 Cloud Identity 網域。如要瞭解如何設定 Cloud Identity 網域,請參閱 Cloud Identity 總覽

  • ROLE_NAME:要授予的角色名稱。請使用下列其中一種格式:

    • 預先定義的角色:roles/SERVICE.IDENTIFIER
    • 專案層級自訂角色:projects/PROJECT_ID/roles/IDENTIFIER
    • 機構層級的自訂角色:organizations/ORG_ID/roles/IDENTIFIER

    如需預先定義角色清單,請參閱「瞭解角色」。

  • CONDITION:選用。要新增至角色繫結的條件。如要進一步瞭解條件,請參閱條件總覽

舉例來說,如要將服務帳戶使用者角色授予使用者 my-user@example.com,請執行下列指令: my-service-account@my-project.iam.gserviceaccount.com

gcloud iam service-accounts add-iam-policy-binding my-service-account@my-project.iam.gserviceaccount.com \
    --member=user:my-user@example.com --role=roles/iam.serviceAccountUser

撤銷單一 IAM 角色

如要撤銷主體的單一角色,請執行下列步驟:

控制台

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

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

  2. 選取專案。

  3. 按一下服務帳戶的電子郵件地址。

  4. 前往「權限」分頁,然後找到「可存取這個服務帳戶的主體」部分。

  5. 找到包含要撤銷存取權主體的資料列。然後點選該列中的「Edit principal」(編輯主體)

  6. 針對要撤銷的角色按一下「刪除」圖示 按鈕,然後按一下「儲存」

gcloud

如要快速撤銷使用者的某個角色,請執行 remove-iam-policy-binding 指令:

gcloud iam service-accounts remove-iam-policy-binding SA_ID \
    --member=PRINCIPAL --role=ROLE_NAME

提供以下這些值:

  • SA_ID:服務帳戶的 ID。這可以是 SA_NAME@PROJECT_ID.iam.gserviceaccount.com 格式的服務帳戶電子郵件地址,也可以是服務帳戶的不重複數字 ID。

  • PRINCIPAL:主體或成員的 ID,通常採用以下格式: PRINCIPAL-TYPE:ID。 例如 user:my-user@example.comprincipalSet://iam.googleapis.com/locations/global/workforcePools/example-pool/group/example-group@example.com。如需 PRINCIPAL 可用的完整值清單,請參閱「主體 ID」。

    對於主體類型 user,識別碼中的網域名稱必須是 Google Workspace 網域或 Cloud Identity 網域。如要瞭解如何設定 Cloud Identity 網域,請參閱 Cloud Identity 總覽

  • ROLE_NAME:要撤銷的角色名稱。請使用下列其中一種格式:

    • 預先定義的角色:roles/SERVICE.IDENTIFIER
    • 專案層級自訂角色:projects/PROJECT_ID/roles/IDENTIFIER
    • 機構層級的自訂角色:organizations/ORG_ID/roles/IDENTIFIER

    如需預先定義角色清單,請參閱「瞭解角色」。

舉例來說,如要撤銷使用者 my-user@example.com 的服務帳戶使用者角色,請執行下列指令: my-service-account@my-project.iam.gserviceaccount.com

gcloud iam service-accounts remove-iam-policy-binding my-service-account@my-project.iam.gserviceaccount.com \
    --member=user:my-user@example.com --role=roles/iam.serviceAccountUser

使用 Google Cloud 控制台授予或撤銷多個 IAM 角色

您可以使用 Google Cloud 控制台,為單一主體授予及撤銷多個角色:

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

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

  2. 選取專案。

  3. 按一下服務帳戶的電子郵件地址。

  4. 前往「權限」分頁,然後找到「可存取這個服務帳戶的主體」部分。

  5. 選取要修改角色的主體:

    • 如要修改服務帳戶中已有角色的主體,請找出包含該主體的資料列,然後點選該列中的「編輯主體」,接著點選「新增其他角色」

      如要修改服務代理人的角色,請選取「Include Google-provided role grants」(包括 Google 提供的角色授權) Google 核取方塊,查看服務代理人的電子郵件地址。

    • 如要將角色授予服務帳戶中沒有任何角色的主體,請按一下 「授予存取權」,然後輸入主體的電子郵件地址或其他 ID。

  6. 修改主體的角色:

    • 如要將角色授予還沒有任何資源角色的主體,請按一下「Select a role」(選取角色),然後從下拉式清單中選取要授予的角色。
    • 如要將其他角色授予主體,請按一下「新增其他角色」,然後從下拉式清單中選取要授予的角色。
    • 如要以其他角色取代主體的其中一個角色,請按一下現有角色,然後從下拉式清單中選擇要授予的角色。
    • 如要撤銷主體的其中一個角色,請針對要撤銷的每個角色按一下「刪除」 按鈕。

    您也可以為角色新增條件修改角色的條件,或移除角色的條件

  7. 按一下 [儲存]

以程式輔助方式授予或撤銷多個 IAM 角色

如要進行大規模存取權變更,包括授予及撤銷多個主體的多個角色,請使用「讀取 - 修改 - 寫入」模式更新服務帳戶的允許政策:

  1. 呼叫 getIamPolicy() 讀取目前的允許政策。
  2. 使用文字編輯器或透過程式來編輯允許政策,藉此新增或移除任何主體或角色繫結。
  3. 呼叫 setIamPolicy() 寫入更新後的允許政策。

本節說明如何使用 gcloud CLI 和 REST API 更新允許政策。您也可以使用 IAM 用戶端程式庫更新允許政策。

一般而言,政策變更會在 2 分鐘內生效,但在某些情況下,可能需要 7 分鐘以上,系統才會全面套用變更。

取得目前的允許政策

gcloud

如要取得服務帳戶的允許政策,請為該服務帳戶執行 get-iam-policy 指令:

gcloud iam service-accounts get-iam-policy SA_ID --format=FORMAT > PATH

提供以下這些值:

  • SA_ID:服務帳戶的 ID。這可以是 SA_NAME@PROJECT_ID.iam.gserviceaccount.com 格式的服務帳戶電子郵件地址,也可以是服務帳戶的不重複數字 ID。

  • FORMAT:允許政策的格式。使用 jsonyaml

  • PATH:允許政策的新輸出檔案路徑。

舉例來說,以下指令會取得服務帳戶 my-service-account 的允許政策,並以 JSON 格式儲存至主目錄:

gcloud iam service-accounts get-iam-policy my-service-account --format json > ~/policy.json

REST

serviceAccounts.getIamPolicy 」方法會取得服務帳戶的允許政策。

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_ID:您的 Google Cloud 專案 ID。專案 ID 為英數字串,例如 my-project
  • SA_ID:服務帳戶的 ID。 這可以是 SA_NAME@PROJECT_ID.iam.gserviceaccount.com 形式的服務帳戶電子郵件地址,也可以是服務帳戶的不重複數字 ID。

  • POLICY_VERSION:要傳回的政策版本。要求應指定最新政策版本,即政策版本 3。詳情請參閱在取得政策時指定政策版本

HTTP 方法和網址:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:getIamPolicy

JSON 要求主體:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

如要傳送要求,請展開以下其中一個選項:

回應會包含服務帳戶的允許政策。例如:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/serviceAccountAdmin",
      "members": [
        "user:my-user@example.com"
      ]
    }
  ]
}

將回應儲存為適當類型的檔案 (jsonyaml)。

Java

如要瞭解如何安裝及使用 IAM 的用戶端程式庫,請參閱 IAM 用戶端程式庫。 詳情請參閱 IAM Java API 參考說明文件

如要向 IAM 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。


import com.google.cloud.iam.admin.v1.IAMClient;
import com.google.iam.admin.v1.ServiceAccountName;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import java.io.IOException;

public class GetServiceAccountPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";
    // TODO: Replace with your service account name.
    String serviceAccount = "your-service-account";
    getPolicy(projectId, serviceAccount);
  }

  // Gets a service account's IAM policy.
  public static Policy getPolicy(String projectId, String serviceAccount) throws IOException {

    // Construct the service account email.
    // You can modify the ".iam.gserviceaccount.com" to match the name of the service account
    // whose allow policy you want to get.
    String serviceAccountEmail = serviceAccount + "@" + projectId + ".iam.gserviceaccount.com";

    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (IAMClient iamClient = IAMClient.create()) {
      GetIamPolicyRequest request = GetIamPolicyRequest.newBuilder()
              .setResource(ServiceAccountName.of(projectId, serviceAccountEmail).toString())
              .build();
      Policy policy = iamClient.getIamPolicy(request);
      System.out.println("Policy retrieved: " + policy.toString());
      return policy;
    }
  }
}

Python

如要瞭解如何安裝及使用 IAM 的用戶端程式庫,請參閱 IAM 用戶端程式庫。 詳情請參閱 IAM Python API 參考說明文件

如要向 IAM 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

from google.cloud import iam_admin_v1
from google.iam.v1 import iam_policy_pb2, policy_pb2


def get_service_account_iam_policy(project_id: str, account: str) -> policy_pb2.Policy:
    """Get policy for service account.

    project_id: ID or number of the Google Cloud project you want to use.
    account: ID or email which is unique identifier of the service account.
    """

    iam_client = iam_admin_v1.IAMClient()
    request = iam_policy_pb2.GetIamPolicyRequest()
    request.resource = f"projects/{project_id}/serviceAccounts/{account}"

    policy = iam_client.get_iam_policy(request)
    return policy

修改允許政策

透過程式或使用文字編輯器修改服務帳戶許可政策的本機副本,以反映要授予或撤銷特定使用者角色的動作。

為確保不會覆寫其他變更,請勿編輯或移除「允許政策」的 etag 欄位。etag 欄位會指出允許政策的目前狀態。當您設定更新後的允許政策時,IAM 會比較要求中的 etag 值與現有的 etag,並且只會在兩個值相符時才寫入允許政策。

如要編輯允許政策授予的角色,請編輯允許政策中的角色繫結。角色繫結的格式如下:

{
  "role": "ROLE_NAME",
  "members": [
    "PRINCIPAL_1",
    "PRINCIPAL_2",
    ...
    "PRINCIPAL_N"
  ],
  "conditions:" {
    CONDITIONS
  }
}

預留位置的值如下:

  • ROLE_NAME:要授予的角色名稱。請使用下列其中一種格式:

    • 預先定義的角色:roles/SERVICE.IDENTIFIER
    • 專案層級自訂角色:projects/PROJECT_ID/roles/IDENTIFIER
    • 機構層級的自訂角色:organizations/ORG_ID/roles/IDENTIFIER

    如需預先定義角色清單,請參閱「瞭解角色」。

  • PRINCIPAL_1PRINCIPAL_2...PRINCIPAL_N:要授予角色的主體 ID。

    主體 ID 通常採用以下格式: PRINCIPAL-TYPE:ID。 例如 user:my-user@example.comprincipalSet://iam.googleapis.com/locations/global/workforcePools/example-pool/group/example-group@example.com。如需 PRINCIPAL 可用的完整值清單,請參閱「主體 ID」。

    對於主體類型 user,識別碼中的網域名稱必須是 Google Workspace 網域或 Cloud Identity 網域。如要瞭解如何設定 Cloud Identity 網域,請參閱 Cloud Identity 總覽

  • CONDITIONS:選用。指定授予存取權時機的條件

授予角色

如要將角色授予主體,請修改允許政策中的角色繫結。 如要瞭解可授予的角色,請參閱「瞭解角色」一文,或查看服務帳戶可授予的角色。如需協助找出最合適的預先定義角色,請參閱「找出合適的預先定義角色」。

您也可以選擇使用條件,只在符合特定需求時授予角色。

如要授予已包含在允許政策中的角色,請將主體新增至現有角色繫結:

gcloud

編輯允許政策,將主體新增至現有角色繫結。請注意,您必須設定更新後的允許政策,這項變更才會生效。

舉例來說,假設允許政策包含下列角色繫結,將服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予 Kai:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com"
  ]
}

如要將相同角色授予 Raha,請將 Raha 新增至現有的角色繫結:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

REST

編輯允許政策,將主體新增至現有角色繫結。請注意,您必須設定更新後的允許政策,這項變更才會生效。

舉例來說,假設允許政策包含下列角色繫結,將服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予 Kai:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com"
  ]
}

如要將相同角色授予 Raha,請將 Raha 新增至現有的角色繫結:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

如要授予允許政策尚未包含的角色,請新增角色繫結:

gcloud

編輯允許政策,新增角色繫結,將角色授予主體。您必須設定更新後的允許政策,這項變更才會生效。

舉例來說,如要將「服務帳戶憑證建立者」角色 (roles/iam.serviceAccountTokenCreator) 授予 Raha,請將下列角色繫結新增至允許政策的 bindings 陣列:

{
  "role": "roles/iam.serviceAccountTokenCreator",
  "members": [
    "user:raha@example.com"
  ]
}

REST

編輯允許政策,新增角色繫結,將角色授予主體。您必須設定更新後的允許政策,這項變更才會生效。

舉例來說,如要將「服務帳戶憑證建立者」角色 (roles/iam.serviceAccountTokenCreator) 授予 Raha,請將下列角色繫結新增至允許政策的 bindings 陣列:

{
  "role": "roles/iam.serviceAccountTokenCreator",
  "members": [
    "user:raha@example.com"
  ]
}

撤銷角色

如要撤銷角色,請從角色繫結中移除主體。如果角色繫結中沒有其他主體,請從允許政策中移除整個角色繫結。

gcloud

編輯允許政策,移除主體或整個角色繫結。您必須設定更新後的允許政策,這項變更才會生效。

舉例來說,假設允許政策包含下列角色繫結,將服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予 Kai 和 Raha:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

如要撤銷 Kai 的角色,請從角色繫結中移除 Kai 的主體 ID:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    user:raha@example.com
  ]
}

如要撤銷 Kai 和 Raha 的角色,請從允許政策中移除角色繫結。

REST

編輯允許政策,移除主體或整個角色繫結。您必須設定更新後的允許政策,這項變更才會生效。

舉例來說,假設允許政策包含下列角色繫結,將服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予 Kai 和 Raha:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

如要撤銷 Kai 的角色,請從角色繫結中移除 Kai 的主體 ID:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    user:raha@example.com
  ]
}

如要撤銷 Kai 和 Raha 的角色,請從允許政策中移除角色繫結。

設定允許政策

修改允許政策以授予及撤銷角色後,請呼叫 setIamPolicy() 來進行更新。

gcloud

如要為資源設定允許政策,請為服務帳戶執行 set-iam-policy 指令:

gcloud iam service-accounts set-iam-policy SA_ID PATH

提供以下這些值:

  • SA_ID:服務帳戶的 ID。這可以是 SA_NAME@PROJECT_ID.iam.gserviceaccount.com 格式的服務帳戶電子郵件地址,也可以是服務帳戶的不重複數字 ID。

  • PATH:包含新允許政策的檔案路徑。

回應會包含更新後的允許政策。

舉例來說,下列指令會將 policy.json 中儲存的允許政策,設為服務帳戶 my-service-account@my-project.iam.gserviceaccount.com 的允許政策:

gcloud iam service-accounts set-iam-policy my-service-account@my-project.iam.gserviceaccount.com \
    ~/policy.json

REST

serviceAccounts.setIamPolicy 方法會為服務帳戶設定更新後的允許政策。

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_ID:您的 Google Cloud 專案 ID。專案 ID 為英數字串,例如 my-project
  • SA_ID:服務帳戶的 ID。 這可以是 SA_NAME@PROJECT_ID.iam.gserviceaccount.com 形式的服務帳戶電子郵件地址,也可以是服務帳戶的不重複數字 ID。

  • POLICY:要設定的政策 JSON 表示法。如要進一步瞭解政策格式,請參閱政策參考資料

    舉例來說,如要設定上一步驟中顯示的允許政策,請將 policy 換成下列內容:

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "group:my-group@example.com"
          ]
        },
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }

HTTP 方法和網址:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:setIamPolicy

JSON 要求主體:

{
  "policy": POLICY
}

如要傳送要求,請展開以下其中一個選項:

回應會包含更新後的允許政策。

Java

如要瞭解如何安裝及使用 IAM 的用戶端程式庫,請參閱 IAM 用戶端程式庫。 詳情請參閱 IAM Java API 參考說明文件

如要向 IAM 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

import com.google.cloud.iam.admin.v1.IAMClient;
import com.google.iam.admin.v1.ServiceAccountName;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import com.google.protobuf.FieldMask;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class SetServiceAccountPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";
    // TODO: Replace with your service account name.
    String serviceAccount = "your-service-account";
    // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
    Policy policy = Policy.newBuilder().build();

    setServiceAccountPolicy(policy, projectId, serviceAccount);
  }

  // Sets a service account's policy.
  public static Policy setServiceAccountPolicy(Policy policy, String projectId,
                                               String serviceAccount) throws IOException {

    // Construct the service account email.
    // You can modify the ".iam.gserviceaccount.com" to match the name of the service account
    // whose allow policy you want to set.
    String accountEmail = String.format("%s@%s.iam.gserviceaccount.com", serviceAccount, projectId);

    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (IAMClient iamClient = IAMClient.create()) {
      List<String> paths = Arrays.asList("bindings", "etag");
      SetIamPolicyRequest request = SetIamPolicyRequest.newBuilder()
              .setResource(ServiceAccountName.of(projectId, accountEmail).toString())
              .setPolicy(policy)
              // A FieldMask specifying which fields of the policy to modify. Only
              // the fields in the mask will be modified. If no mask is provided, the
              // following default mask is used:
              // `paths: "bindings, etag"`
              .setUpdateMask(FieldMask.newBuilder().addAllPaths(paths).build())
              .build();

      return iamClient.setIamPolicy(request);
    }
  }
}

Python

如要瞭解如何安裝及使用 IAM 的用戶端程式庫,請參閱 IAM 用戶端程式庫。 詳情請參閱 IAM Python API 參考說明文件

如要向 IAM 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

from google.cloud import iam_admin_v1
from google.iam.v1 import iam_policy_pb2, policy_pb2


def set_service_account_iam_policy(
    project_id: str, account: str, policy: policy_pb2.Policy
) -> policy_pb2.Policy:
    """Set policy for service account.

    Pay attention that previous state will be completely rewritten.
    If you want to update only part of the policy follow the approach
    read->modify->write.
    For more details about policies check out
    https://cloud.google.com/iam/docs/policies

    project_id: ID or number of the Google Cloud project you want to use.
    account: ID or email which is unique identifier of the service account.
    policy: Policy which has to be set.
    """

    # Same approach as for policies on project level,
    # but client stub is different.
    iam_client = iam_admin_v1.IAMClient()
    request = iam_policy_pb2.SetIamPolicyRequest()
    request.resource = f"projects/{project_id}/serviceAccounts/{account}"

    # request.etag field also will be merged which means
    # you are secured from collision, but it means that request
    # may fail and you need to leverage exponential retries approach
    # to be sure policy has been updated.
    request.policy.MergeFrom(policy)

    policy = iam_client.set_iam_policy(request)
    return policy

後續步驟

歡迎試用

如果您未曾使用過 Google Cloud,歡迎建立帳戶來評估我們的產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。

免費試用