授予、變更及撤銷資源的存取權

本頁說明如何授予、變更及撤銷資源的存取權。您可以使用精密控制權限的 Cloud IAM 角色,將您所擁有資源的不同層級存取權授予不同的使用者。

您可以透過 GCP 主控台、gcloud 指令列工具、REST API 或用戶端程式庫管理使用者角色。使用 GCP 主控台是最簡單的方法,本文前半部將會加以說明。稍後則會介紹如何透過程式來處理較複雜的情境。

如果您要將 Cloud IAM 與 Cloud Identity-Aware Proxy (Cloud IAP) 搭配使用,以保障應用程式的存取安全,請參閱 Cloud IAP 文件

事前準備

使用 GCP 主控台

使用 GCP 主控台是簡單快速的使用者角色管理方法。授予使用者角色時,使用者並不會收到邀請電子郵件。系統會直接更新他們的存取權。

授予存取權

如要將小組成員新增至專案,並且授予 Cloud IAM 角色:

  1. 在 GCP 主控台中開啟「IAM」頁面。

    開啟 IAM 頁面

  2. 按一下 [選取專案],選擇專案,然後按一下 [開啟]

  3. 按一下 [新增]。

  4. 輸入電子郵件地址。您可以將個人、服務帳戶或 Google 網路論壇新增為成員,但每個專案必須至少有一個人做為成員。

  5. 選取一個角色。角色可為成員提供適當層級的權限。建議您為成員提供所需的最低權限。具有擁有者層級權限的成員也是專案的擁有者,他們可以全方位地管理專案,包括關閉專案。

  6. 按一下 [儲存]

如要為多個專案的成員授予角色:

  1. 在 GCP 主控台中開啟「IAM 與管理員專案」頁面。

    開啟「IAM 管理員專案」頁面

  2. 選取要為其授予權限的所有專案。

  3. 依序按一下 [顯示資訊面板] 和 [權限] 分頁標籤。

  4. 在「新增成員」欄位中輸入電子郵件地址,然後從下拉式選單中選取所需的角色。

  5. 按一下 [新增] 按鈕。該成員將獲授予每個所選專案中的選定角色。

撤銷存取權

  1. 在 Google Cloud Platform 主控台開啟「IAM」頁面。

    開啟 IAM 頁面

  2. 按一下 [選取專案]

  3. 選取專案並按一下 [開啟]

  4. 找到您要撤銷存取權的成員,然後按一下右側的 [編輯] edit 按鈕。

  5. 針對您要撤銷的每個角色按一下 [刪除] delete 按鈕,然後按一下 [儲存]

修改存取權

修改存取權沒有任何特殊的程序。只要按照授予和撤銷存取權的步驟操作,直到使用者擁有所需的角色即可。

使用 gcloud、REST API 或用戶端程式庫

在某些用途中,透過程式管理存取權控管比使用 GCP 主控台更容易。您可以使用 gcloud 指令列工具、REST API 或適用於 Cloud IAM 的用戶端程式庫。在進行大規模或自動更新時,程式輔助方法特別有用,因為這些更新在 GCP 主控台中執行時將會非常耗時。

使用 gcloud 指令列工具進行快速更新

如果您只想使用指令列快速地授予一位使用者角色或撤銷其角色,請使用 add-iam-policy-bindingremove-iam-policy-binding 指令。為想要新增或刪除的每個角色傳送一個 --role 標記。

如要授予角色:

gcloud [GROUP] add-iam-policy-binding [RESOURCE-NAME]
  --member user:[USER-EMAIL] --role [ROLE-ID]

如要撤銷角色:

gcloud [GROUP] remove-iam-policy-binding [RESOURCE-NAME]
  --member user:[EMAIL] --role [ROLE-ID]

[GROUP] 是您要授予其權限之資源的 gcloud 群組,例如 projectsorganizations。[RESOURCE] 是資源的名稱。[EMAIL] 是要授予其角色的使用者。[ROLE-ID] 是要授予之角色的 ID。

以下範例會將「my-project」專案的擁有者角色授予「user-1@gmail.com」

gcloud projects add-iam-policy-binding my-project
  --member user:user-1@gmail.com --role roles/owner

Cloud IAM 政策總覽

資源的存取權可透過 Cloud IAM 政策進行管理。政策是一組可讓成員 (例如使用者帳戶或服務帳戶) 與角色產生關聯的繫結。政策可使用 JSON 或 YAML 來表示。

下列為範例政策,其中「user-1@gmail.com」已獲授予擁有者角色,而「user-2@gmail.com」和「service-account-13@appspot.gserviceaccount.com」則已獲授予編輯者角色:

{
  "bindings":[
    {
      "members":[
        "user:user-1@gmail.com"
      ],
      "role":"roles/owner"
    },
    {
      "members":[
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:user-2@gmail.com"
      ],
      "role":"roles/editor"
    }
  ],
  "etag":"BwUjMhCsNvY=",
  "version":1
}

您可以利用「讀取 - 修改 - 寫入」模式來更新資源的政策。這表示建立、修改或撤銷使用者存取權並沒有不同的方法,所有的修改作業都是透過下列方式進行:

  1. 透過呼叫 getIamPolicy() 來讀取目前的政策。
  2. 使用文字編輯器或透過程式來編輯傳回的政策,藉此新增或移除任何所需的成員及其授予的角色。
  3. 透過呼叫 setIamPolicy() 寫入更新的政策。

為整個專案或機構授予權限是很常見的做法。但是,您也可以針對各種 GCP 資源 (例如 Compute Engine 執行個體Cloud Storage 值區) 設定更精確的政策。如需各種角色以及可以授予每個角色的最低資源層級的完整清單,請參閱瞭解角色

以下各節示範如何取得、修改和設定專案的政策。

取得政策

GCLOUD 指令

執行 get-iam-policy 指令:

gcloud projects get-iam-policy [PROJECT] --format [FORMAT] > [FILE-PATH]

[PROJECT] 是專案的名稱。[FORMAT] 是 JSON 或 YAML。 [FILE-PATH] 是在磁碟上儲存政策的路徑。

例如,以下指令會以 JSON 格式取得「my-project」專案的政策,並將其儲存至使用者的主目錄。

gcloud projects get-iam-policy my-project --format json > ~/policy.json

回應將會是一項政策。

REST API

呼叫 getIamPolicy()

POST https://cloudresourcemanager.googleapis.com/v1/[PROJECT]:getIamPolicy

[PROJECT] 是要取得其政策之資源的名稱,例如「projects/my-project」

回應將會是一項政策。

C#

在嘗試這個範例之前,請先按照 Cloud IAM 快速入門:使用用戶端程式庫中的操作說明設定 C# 環境。詳情請參閱 Cloud IAM C# API 參考文件

using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Python

在嘗試這個範例之前,請先按照 Cloud IAM 快速入門:使用用戶端程式庫中的操作說明設定 Python 環境。詳情請參閱 Cloud IAM Python API 參考文件

def get_policy(project_id):
    """Gets IAM policy for a project."""

    # pylint: disable=no-member
    policy = service.projects().getIamPolicy(
        resource=project_id, body={}).execute()
    print(policy)
    return policy

修改政策

透過程式或使用文字編輯器修改政策,以將角色授予特定使用者或撤銷其角色。

如要將現有角色授予使用者:

GCLOUD 指令

以下範例使用文字編輯器,透過將其電子郵件地址附加至該繫結之下的 members 陣列,將「Editor」(編輯者) 角色授予 user-3@gmail.com

{
  "members":[
    "serviceAccount:service-account-13@appspot.gserviceaccount.com",
    "user:user-2@gmail.com",
    "user:user-3@gmail.com"
  ],
  "role":"roles/editor"
}

REST API

以下範例使用文字編輯器,透過將其電子郵件地址附加至該繫結之下的 members 陣列,將「Editor」(編輯者) 角色授予 user-3@gmail.com

{
  "members":[
    "serviceAccount:service-account-13@appspot.gserviceaccount.com",
    "user:user-2@gmail.com",
    "user:user-3@gmail.com"
  ],
  "role":"roles/editor"
}

C#

在嘗試這個範例之前,請先按照 Cloud IAM 快速入門:使用用戶端程式庫中的操作說明設定 C# 環境。詳情請參閱 Cloud IAM C# API 參考文件

using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public Policy AddMember(Policy policy, string role, string member)
    {
        var binding = policy.Bindings.First(x => x.Role == role);
        binding.Members.Add(member);
        return policy;
    }
}

Python

在嘗試這個範例之前,請先按照 Cloud IAM 快速入門:使用用戶端程式庫中的操作說明設定 Python 環境。詳情請參閱 Cloud IAM Python API 參考文件

def modify_policy_add_member(policy, role, member):
    """Adds a new member to a role binding."""
    binding = next(b for b in policy['bindings'] if b['role'] == role)
    binding['members'].append(member)
    print(binding)
    return policy

若要將使用者新增至尚未存在的新角色,請新增 binding

GCLOUD 指令

使用文字編輯器,將新的 binding 新增至 bindings 陣列。以下指令會授予「user-3@gmail.com」「讀取者」角色:

{
  "members":[
    "user:user-3@gmail.com"
  ],
  "role":"roles/reader"
}

REST API

使用文字編輯器,將新的 binding 新增至 bindings 陣列。以下指令會授予「user-3@gmail.com」「讀取者」角色:

{
  "members":[
    "user:user-3@gmail.com"
  ],
  "role":"roles/reader"
}

C#

在嘗試這個範例之前,請先按照 Cloud IAM 快速入門:使用用戶端程式庫中的操作說明設定 C# 環境。詳情請參閱 Cloud IAM C# API 參考文件

using System.Collections.Generic;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddBinding(Policy policy, string role, string member)
    {
        var binding = new Binding
        {
            Role = role,
            Members = new List<string> { member }
        };
        policy.Bindings.Add(binding);
        return policy;
    }
}

Python

在嘗試這個範例之前,請先按照 Cloud IAM 快速入門:使用用戶端程式庫中的操作說明設定 Python 環境。詳情請參閱 Cloud IAM Python API 參考文件

def modify_policy_add_role(policy, role, member):
    """Adds a new role binding to a policy."""
    binding = {
        'role': role,
        'members': [member]
    }
    policy['bindings'].append(binding)
    print(policy)
    return policy

如要撤銷存取權,請完全刪除所需的成員或繫結。系統不允許沒有任何成員的空繫結。

您只能授予與已啟用的 API 服務相關的角色。如果某個服務 (例如 Compute Engine) 不在使用中狀態,則無法授予與 Compute Engine 完全相關的角色。詳情請參閱啟用和停用 API

在授予專案的權限時,您必須遵守一些獨特的限制,尤其是在授予「擁有者」角色時。詳情請參閱 projects.setIamPolicy() 參考文件

設定政策

修改政策以授予所需的角色後,請呼叫 setIamPolicy() 以進行更新。

GCLOUD 指令

使用包含已更新政策的 JSON 檔案路徑執行 set-iam-policy 指令:

gcloud projects set-iam-policy [PROJECT] [FILE-PATH]

和使用 get-iam-policy 一樣,[PROJECT] 是要為其設定政策之專案的名稱。[FILE-PATH] 是包含新政策之檔案的路徑。

回應將會是更新的政策。

REST API

呼叫 setIamPolicy()

POST https://cloudresourcemanager.googleapis.com/v1/[PROJECT]:setIamPolicy

[PROJECT] 是要為其設定政策之資源的名稱,例如「projects/my-project」

要求的主體應包含更新的 IAM 政策。

回應將會是更新的政策。

C#

using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy SetPolicy(string projectId, Policy policy)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        return service.Projects.SetIamPolicy(new SetIamPolicyRequest
        {
            Policy = policy
        }, projectId).Execute();
    }
}

Python

在嘗試這個範例之前,請先按照 Cloud IAM 快速入門:使用用戶端程式庫中的操作說明設定 Python 環境。詳情請參閱 Cloud IAM Python API 參考文件

def set_policy(project_id, policy):
    """Sets IAM policy for a project."""

    # pylint: disable=no-member
    policy = service.projects().setIamPolicy(
        resource=project_id, body={
            'policy': policy
        }).execute()
    print(policy)
    return policy

為了防止多個來源嘗試同時更新政策時發生衝突,政策會包含 etag 值。當您呼叫 setIamPolicy() 時,Cloud IAM 會將要求中的 etag 值與現有的 etag 進行比較,並且只會在兩個值相符時才寫入政策。

後續步驟

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

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

這個網頁
Cloud IAM Documentation