將角色授予服務帳戶

授予 IAM 角色時,您可以將服務帳戶視為資源身分

您的應用程式會將服務帳戶視為身分,並用於驗證 Google Cloud Platform 服務。舉例來說,如果您將 Compute Engine 虛擬機器 (VM) 做為服務帳戶執行,則可以將專案 (資源) 的編輯者角色授予服務帳戶 (身分)。

同時,您可能也想要控制哪些使用者能夠啟動 VM。只要將服務帳戶 (資源) 的 serviceAccountUser 角色授予使用者 (身分),即可進行控制。

如需服務帳戶的詳細資訊,以及更多將服務帳戶做為資源和身分使用的示例,請參閱服務帳戶

使用本指南的事前準備

  • 如果您想要使用本指南中的指令列範例,請安裝 gcloud 指令列工具

  • 如需可授予服務帳戶的預先定義角色清單,請參閱瞭解角色

將角色授予特定資源的服務帳戶

您可以將角色授予服務帳戶,讓服務帳戶有權限對 Cloud Platform 專案中的資源完成特定動作。例如,您可以向服務帳戶授予 storage.admin 角色,讓服務帳戶擁有 Google Cloud Storage 中物件和值區的控制權。

如要將角色授予服務帳戶,請使用以下其中一個方法:

主控台

您可以用管理專案中使用者角色一樣的方式,來管理服務帳戶的角色。

  1. 在 GCP 主控台中開啟「IAM & Admin」(IAM 與管理員) 頁面。

    開啟「IAM & Admin」(IAM 與管理員) 頁面

  2. 選取您的專案並點選 [Continue] (繼續)

  3. 找出您想新增角色的服務帳戶。

    • 如果服務帳戶不在成員清單中,表示服務帳戶尚未被指派任何角色。按一下 [Add] (新增),然後輸入服務帳戶的電子郵件地址。
    • 如果服務帳戶已在成員清單中,表示已獲指派角色。在要編輯的服務帳戶的「Role(s)」(角色)下方,點選下拉式清單。
  4. 選取一或多個要套用到服務帳戶的角色。

  5. 按一下 [Add] (新增) 或 [Save] (儲存),即可將角色套用到服務帳戶。

gcloud

將角色加入單一服務帳戶。

gcloud projects add-iam-policy-binding my-project-123 \
  --member serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com \
  --role roles/editor

指令會輸出更新後的政策:

bindings:
- members:
  - user:email1@gmail.com
  role: roles/owner
- members:
  - serviceAccount:our-project-123@appspot.gserviceaccount.com
  - serviceAccount:123456789012-compute@developer.gserviceaccount.com
  - serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com
  - user:email3@gmail.com
  role: roles/editor
- members:
  - user:email2@gmail.com
  role: roles/viewer
etag: BwUm38GGAQk=
version: 1

如需將服務帳戶做為專案身分授予存取權的操作說明,請參閱為專案成員授予、變更及撤銷存取權限的說明

API

以下 POST 要求透過 projects.setIamPolicy() 方法,向服務帳戶 my-sa-123 授予專案 my-project-123 的編輯者存取權。要求主體必須包含授予服務帳戶權限的新政策。每個角色可以擁有多個成員。

POST https://cloudresourcemanager.googleapis.com/v1beta1/projects/my-project-123:setIamPolicy

{
    "policy":
    {
        "version": 1,
        "etag": "BwUqMvZQGfo=",
        "bindings": [
        {
            "role": "roles/editor",
            "members": [
                "serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com",
                "user:alice@gmail.com"
            ]
        },
        {
            "role":"roles/owner",
            "members":
            [
                "user:bob@gmail.com",
            ]
        },
        {
            "role":"roles/viewer",
            "members":
            [
                "user:john@gmail.com",
            ]
        },
        {
            "role":"roles/iam.serviceAccountUser",
            "members":
            [
                "user:alice@gmail.com"
            ]
        },
        ]
    },
}

回應包含新的政策:

{
    "version": 1,
    "etag": "BwUqMvZQGfo=",
    "bindings": [
    {
        "role": "roles/editor",
        "members": [
            "serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com",
            "user:alice@gmail.com"
        ]
    },
    {
        "role":"roles/owner",
        "members":
        [
            "user:bob@gmail.com",
        ]
    },
    {
        "role":"roles/viewer",
        "members":
        [
            "user:john@gmail.com",
        ]
    },
    {
        "role":"roles/iam.serviceAccountUser",
        "members":
        [
            "user:alice@gmail.com"
        ]
    },
    ]
}

設定服務帳戶的擁有權及存取權限

您可以將服務帳戶的擁有權及存取權提供給特定使用者,方法是將服務帳戶視為資源,而非身分。本節中的步驟會將服務帳戶視為資源。如需進一步瞭解每個使用類型之間的差異,請參閱服務帳戶主題。

具有原始專案擁有者及專案編輯者角色的使用者,都可以修改服務帳戶,但是您可能會希望限制某些使用者的存取權,讓他們只能對服務帳戶資源採取特定動作。

如要向使用者授予服務帳戶權限,請使用下列其中一個方法:

主控台

  1. 在 GCP 主控台中開啟「IAM & Admin」(IAM 與管理員) 頁面。

    開啟「IAM & Admin」(IAM 與管理員) 頁面

  2. 選取您的專案並點選 [Continue] (繼續)

  3. 在左側導覽列中,點選 [Service accounts] (服務帳戶)。

  4. 選取服務帳戶,然後開啟資訊面板。系統隨即顯示可以存取這個服務帳戶的所有使用者。

  5. 新增專案成員的電子郵件地址。

  6. 為成員選取角色,定義成員可對服務帳戶執行的動作。

  7. 按一下 [Add] (新增) 對專案成員套用角色。

gcloud

更新整個政策:

首先,取得您要修改的政策,並將其寫入 JSON 檔案。您可以利用 --format 標記來選擇輸出格式 (可用的輸出格式為 JSON、YAML 及文字)。本頁面中的其他示例使用預設的文字輸出格式,但是以下示例將輸出寫入 JSON 檔案 (policy.json),以在設定現有政策前先加以修改。

gcloud iam service-accounts get-iam-policy \
  my-sa-123@my-project-123.iam.gserviceaccount.com \
  --format json > policy.json

請注意,這個指令只會傳回已在服務帳戶本身設定的政策。如果服務帳戶沒有設定現有政策,JSON 檔案的內容與以下類似:

{
  "etag": "ACAB"
}

如果沒有現有政策,您可以透過以下步驟設定具有單一繫結的新政策;或是將下列步驟視為範本,使用 JSON 手動建立政策。

如果已有政策生效,則輸出 policy.json 檔案的內容與以下類似:

{
  "bindings": [
    {
      "members": [
        "user:bob@gmail.com"
      ],
      "role": "roles/owner"
    }
  ],
  "etag": "BwUqLaVeua8="
}

其次,請於文字編輯器中將新物件加入定義群組成員及其角色的 bindings 陣列,以修改 policy.json 檔案。如果 bindings 陣列不存在,請建立該陣列。若要將 serviceAccountUser 角色授予 alice@gmail.com,您可以更改以上示例,如下所示:

{
    "bindings": [
    {
        "role": "roles/iam.serviceAccountUser",
        "members": [
            "user:alice@gmail.com"
        ]
    },
    {
        "role": "roles/owner",
        "members": [
            "user:bob@gmail.com"
        ]
    }
    ],
    "etag": "BwUqLaVeua8=",
}

第三,執行下列指令以更新政策:

gcloud iam service-accounts set-iam-policy \
  my-sa-123@my-project-123.iam.gserviceaccount.com policy.json

指令會輸出更新後的政策:

bindings:
- members:
  - user:alice1@gmail.com
  role: roles/iam.serviceAccountUser
- members:
  - bob@gmail.com
  role: roles/owner
etag: BwUjMhXbSPU=
version: 1

新增單一繫結:

執行下列指令可將單一繫結加入全新或現有的政策:

gcloud iam service-accounts add-iam-policy-binding \
  my-sa-123@my-project-123.iam.gserviceaccount.com \
  --member='user:jane@gmail.com' --role='roles/editor'

指令會輸出更新後的政策:

bindings:
- members:
  - user:alice@gmail.com
  role: roles/iam.serviceAccountUser
- members:
  - user:bob@gmail.com
  role: roles/owner
- members:
  - user:jane@gmail.com
  role: roles/editor
etag: BwUqKjVeua8=
version: 1

移除單一繫結:

執行下列指令可從現有的政策中移除單一繫結:

gcloud iam service-accounts remove-iam-policy-binding \
    my-sa-123@my-project-123.iam.gserviceaccount.com \
    --member='user:jane@gmail.com' --role='roles/editor'

指令會輸出更新後的政策:

bindings:
- members:
  - user:alice@gmail.com
  role: roles/iam.serviceAccountUser
- members:
  - user:bob@gmail.com
  role: roles/owner
etag: BwUqNkVeua8=
version: 1

API

要求:

POST https://iam.googleapis.com/v1/projects/my-project-123/serviceAccounts/my-sa-123@my-project-123.iam.gserviceaccount.com:setIamPolicy

要求主體必須包含要授予的政策:

{
    "policy":
    {
        "etag": "BwUqLaVeua8=",
        "bindings": [
        {
            "role": "roles/iam.serviceAccountUser",
            "members": [
                "user:alice@gmail.com"
            ]
        },
        {
            "role": "roles/owner",
            "members": [
                "user:bob@gmail.com"
            ]
        },
        ]
    },
}

回應包含更新後的政策:

{
    "etag": "BwUqMqbViM8=",
    "bindings": [
    {
        "role": "roles/iam.serviceAccountUser",
        "members": [
            "user:alice@gmail.com"
        ]
    },
    {
        "role": "roles/owner",
        "members": [
        "user:bob@gmail.com"
        ]
    }
    ]
}

查看服務帳戶現有的角色

您可以使用 serviceAccounts.getIamPolicy() 方法、GCP 主控台及 gcloud 工具,取得服務帳戶的 IAM 政策。

主控台

  1. 在 GCP 主控台中開啟「IAM & Admin」(IAM 與管理員) 頁面。

    開啟「IAM & Admin」(IAM 與管理員) 頁面

  2. 選取您的專案並點選 [Continue] (繼續)。這個頁面會列出這個專案的所有使用者與相對應的角色。

  3. 在左側導覽列中,點選 [Service accounts] (服務帳戶)。

  4. 請選擇一個服務帳戶,然後按一下頁面右上角的 [Show Info Panel] (顯示資訊面板)。資訊頁面中將顯示服務帳戶的所有角色。

gcloud

執行下列指令可取得服務帳戶的政策:

gcloud iam service-accounts get-iam-policy \
    my-sa-123@my-project-123.iam.gserviceaccount.com

輸出內容即為政策,與以下類似:

bindings:
- members:
  - user:bob@gmail.com
  role: roles/owner
- members:
  - user:alice@gmail.com
  role: roles/iam.serviceAccountUser
etag: BwUqLaVeua8=
version: 1

如果您尚未指派角色給服務帳戶,則輸出內容只會顯示 etag 值:

etag: ACAB

API

以下程式碼片段可取得服務帳戶的 my-sa-123@my-project-123.iam.gserviceaccount.com 的 IAM 政策。

要求:

POST https://iam.googleapis.com/v1/projects/my-project-123/serviceAccounts/my-sa-123@my-project-123.iam.gserviceaccount.com:getIamPolicy
Response:

{
    "etag": "BwUqLaVeua8=",
    "bindings": [
    {
        "role": "roles/iam.serviceAccountUser",
        "members": [
            "user:alice@gmail.com"
        ]
    }
    ]
}

如果您尚未指派角色給服務帳戶,則回應只會包含 etag 值:

{
  "etag": "ACAB"
}

如要進一步瞭解 IAM 政策,請參閱政策

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud IAM Documentation