使用 IAM 對機構進行存取權控管

Google Cloud Platform 提供「身分與存取權管理」(IAM) 功能,可讓您以更精細的方式授予使用者特定 Google Cloud Platform 資源的存取權限,避免其他資源遭到未經授權者擅自存取。IAM 可讓您採取最低權限的安全性原則,僅將必要的資源存取權限授予使用者。

設定身分與存取權管理政策之後,即可控管哪些人 (使用者) 具備何種存取權限 (角色),可以存取哪些資源。IAM 政策可授予使用者特定角色,讓對方擁有特定權限。

本頁面說明適用於機構等級的身分與存取權管理 (IAM) 角色,以及如何使用Resource Manager API 建立並管理機構的 IAM 政策。如需 Cloud Identity and Access Management 的詳細說明,請參閱 IAM 說明文件,其中以授予、變更及撤銷存取權的部分最為重要。

權限與角色

透過 Cloud Identity and Access Management,凡是需要帳戶發送 API 要求的 Google Cloud Platform 方法,皆具備使用該資源的適當權限。擁有權限的使用者才能對 Cloud 資源執行特定操作。例如:resourcemanager.organizations.list 權限可讓使用者列出自己擁有的機構;而 resourcemanager.organizations.update 則能讓使用者更新機構的中繼資料。

下表列出了呼叫機構方法時,呼叫者必須具備的權限:

方法 必要權限
cloudresourcemanager.organizations.get() resourcemanager.organizations.get
cloudresourcemanager.organizations.search() 傳回使用者擁有 resourcemanager.organizations.get 權限的所有機構。
cloudresourcemanager.organizations.getIamPolicy() resourcemanager.organizations.getIamPolicy
cloudresourcemanager.organizations.setIamPolicy() resourcemanager.organizations.setIamPolicy
cloudresourcemanager.organizations.testIamPermissions() 不需任何權限。

您並非直接為使用者授予權限,而是指派「角色」給他們,每個角色可能具備一或多項權限。

針對同一項資源,您可以授予一或多個角色。

使用預先定義的角色

下表列出了您可以授予的角色,擁有這些角色的使用者即可存取機構資源。此外,您也可以透過下表瞭解各個角色的作用和角色具備的權限。

角色 說明 權限
roles/
resourcemanager.organizationAdmin
有權管理機構擁有的所有資源。根據預設,此角色不包括帳單或機構角色管理的權限。
  • orgpolicy.policy.get
  • resourcemanager.folders.get
  • resourcemanager.folders.getIamPolicy
  • resourcemanager.folders.list
  • resourcemanager.folders.setIamPolicy
  • resourcemanager.organizations.get
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.organizations.setIamPolicy
  • resourcemanager.organizations.update
  • resourcemanager.projectInvites.get
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list
  • resourcemanager.projects.setIamPolicy
roles/
resourcemanager.organizationViewer
有權檢視機構的顯示名稱。將此角色授予使用者將允許該使用者在 Cloud Console 中查看機構,但無權限查看機構中的所有資源。
  • resourcemanager.organizations.get
roles/
browser
有權瀏覽機構資源
  • resourcemanager.folders.get
  • resourcemanager.folders.list
  • resourcemanager.organizations.get
  • resourcemanager.projectInvites.get
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list

建立自訂角色

除了本主題中描述的預設定義角色之外,您也可以建立自訂角色,角色的權限集合按照您的需求而訂。建立自訂角色與 Resource Manager 一起使用時,請注意以下幾點:
  • 「列出」及「取得」這兩項權限,例如 resourcemanager.projects.get/list,需一律同時授予。
  • 當您的自訂角色包含 folders.listfolders.get 權限時,同時也應包含 projects.listprojects.get
  • 請注意,機構、資料夾和專案的 setIamPolicy 權限允許使用者授予所有其他權限,因此應謹慎指派。

檢視機構的現有存取權

您可以取得機構層級的 IAM 政策來查看為機構授予的使用者角色。您可以使用 Cloud Platform 主控台、gcloud 指令列工具或 getIamPolicy() 方法來檢視組織政策。

主控台

如要使用 Google Cloud Platform 主控台檢視在機構層級所授予的角色:

  1. 前往 GCP 主控台的「Manage resources」(管理資源) 頁面:

    開啟「Manage resources」(管理資源) 頁面

  2. 在 [Organization] (機構) 下拉式清單中,選取您的機構。

  3. 選取機構資源旁的核取方塊。

  4. 在右側「Info panel」(資訊面板) 的「Permissions」(權限) 下方,點按以展開角色並顯示具有此角色的所有成員。

gcloud

如要使用 get-iam-policy 指令取得機構的 IAM 政策:

gcloud alpha organizations get-iam-policy [ORGANIZATION_ID] --format json >
[FILENAME.JSON]

該指令會將政策輸出,內容與以下類似:

bindings:
- members:
  - user:testuser1@gcp-test.com
  role: roles/editor
- members:
  - user:admin@gcp-test.com
  role:roles/resourcemanager.organizationAdmin
- members:
  - user:testuser2@gcp-test.com
  role: roles/resourcemanager.projectCreator
etag": "BwU1aRxWk30="

API

以下程式碼片段能傳回機構資源 https://cloudresourcemanager.googleapis.com/v1/organizations/12345 的政策。

要求:

POST
https://cloudresourcemanager.googleapis.com/v1/organizations/12345:getIamPolicy

回應:

 {
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
        "user:email1@gmail.com"
    ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
}

Python

getIamPolicy() 方法可讓您取得之前設定的政策。

...

crm = discovery.build(
    'cloudresourcemanager', 'v1', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()
print json.dumps(policy, indent=2)

...

授予機構的存取權限

機構管理員可以將 IAM 角色授予團隊成員,以授予團隊成員存取機構資源和 API 的權限。您可以使用 Cloud Platform 主控台、gcloud 工具或 setIamPolicy() 方法將角色授予團隊成員。

主控台

如要使用 Google Cloud Platform 主控台設定機構層級的存取權控管:

  1. 前往 GCP 主控台的「Manage resources」(管理資源) 頁面:

    開啟「Manage resources」(管理資源) 頁面

  2. 在 [Organization] (機構) 下拉式清單中,選取您的機構。

  3. 選取機構資源旁的核取方塊。如果您沒有資料夾資源,則無法顯示機構資源。如要繼續,請參考透過 Cloud IAM 頁面授予角色的操作說明。

  4. 如果右測的「Info Panel」(資訊面板) 是隱藏的,請選取位於右上方的 [Show Info Panel] (顯示資訊面板) 按鈕。

  5. 在右側「Info panel」(資訊面板) 的「Permissions」(權限) 下方,輸入要新增的成員的電子郵件地址。

  6. 在 [Select a role] (請選擇角色) 下拉式清單中,選取要授予該使用者的角色。

  7. 按一下 [Add] (新增)。系統會顯示對話方塊,確認新增或更新成員的新角色。

gcloud

如要使用 gcloud 指令設定機構的 IAM 政策:

  1. 透過執行 get-iam-policy 指令並將政策輸出至 JSON 檔案,取得機構的 IAM 政策:

    gcloud alpha organizations get-iam-policy [ORGANIZATION_ID]
    --format json > [FILENAME.JSON]
    
  2. JSON 檔案的內容與以下類似:

    {
        "bindings": [
        {
            "members": [
                "user:testuser1@gcp-test.com"
            ],
            "role": "roles/editor"
        },
        {
            "members": [
                "user:admin@gcp-test.com",
            ],
            "role": "roles/resourcemanager.organizationAdmin"
        },
        {
            "members": [
                "user:testuser2@gcp-test.com"
            ],
            "role": "roles/resourcemanager.projectCreator"
        },
        ],
        "etag": "BwU1aRxWk30="
    }
    
  3. 使用文字編輯器打開 JSON 檔案,並在 bindings 陣列中新增項目以定義機構管理員。例如,如要將 anotheradmin@gcp-test.com 設為機構管理員,上方的範例要變更為如下:

    {
        "bindings": [
        {
            "members": [
                "user:testuser1@gcp-test.com"
            ],
            "role": "roles/editor"
        },
        {
            "members": [
                "user:admin@gcp-test.com",
                "user:anotheradmin@gcp-test.com"
            ],
            "role": "roles/resourcemanager.organizationAdmin"
        },
        {
            "members": [
                "user:testuser20@gcp-test.com"
            ],
            "role": "roles/resourcemanager.projectCreator"
        },
        ],
        "etag": "BwU1aRxWk30="
    }
    
  4. 執行下列指令以更新機構的政策:

    gcloud alpha organizations set-iam-policy [ORGANIZATION_ID] policy.json
    

API

要求:

POST https://cloudresourcemanager.googleapis.com/v1/organizations/12345:setIamPolicy
{
    "policy": {
    "version": "0",
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
        "user:email2@gmail.com",
        "user:email3@gmail.com",
        "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
    }
}

回應:

{
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKJUiQ="
}

setIamPolicy() 方法可讓您透過將 Cloud IAM 政策附加至機構的方式來授予使用者角色。IAM 政策由一組定義誰擁有哪些存取權的陳述式組成。

讀取 - 修改 - 寫入:常見的資源中繼資料 (如政策) 更新模式是讀取目前的狀態,更新本機資料,然後再傳送已修改的資料進行寫入。如果有兩個以上的獨立程序同時嘗試相同順序,這個模式可能會產生衝突。例如,如果專案有兩位擁有者同時嘗試對政策執行互相衝突的變更。在某些情況下,其中一個專案擁有者所做的變更可能會失敗。Cloud Identity and Access Management 透過在 Cloud IAM 政策中使用 etag 屬性來解決這個問題。此屬性可用來驗證政策在上次要求後是否已變更。當您用 etag 值對 Cloud IAM 發送要求時,Cloud IAM 會將要求中的 etag 值與既有的政策相關 etag 值進行比較。只有在兩個 etag 值彼此相符時,系統才會執行寫入政策的作業。

如要更新政策,請先使用 getIamPolicy() 取得政策,更新政策,然後再使用 setIamPolicy() 寫入已更新的政策。只有當 GetPolicyResponse 中的對應政策包含 etag 值時,您才可以在設定政策時使用 etag 值。

Python

setIamPolicy() 方法可讓您將政策附加至資源。setIamPolicy 方法需要 SetIamPolicyRequest,它包含要設定的政策及要附加政策的資源。方法會傳回產生的政策。建議您在使用 setIamPolicy() 更新政策時,按照讀取 - 修改 - 寫入的模式進行。

以下是設定機構政策的一些程式碼範例:

...

crm = discovery.build(
    'cloudresourcemanager', 'v1', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()

admin_binding = next(
    (binding
        for binding in policy['bindings']
        if binding['role'] == 'roles/resourcemanager.organizationAdmin'),
        None)

# Add an empty Organization Admin binding if not present.
if not admin_binding:
    admin_binding = {
        'role': 'roles/resourcemanager.organizationAdmin',
        'members': []
    }
policy['bindings'].append(admin_binding)

# Add the new Admin (if necessary).
new_admin = 'user:' + flags.adminEmail
if new_admin not in admin_binding['members']:
    admin_binding['members'].append(new_admin)
policy = crm.organizations().setIamPolicy(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'policy': policy
    }).execute()

print json.dumps(policy, indent=2)

...

測試權限

您可以使用 testIamPermissions() 方法測試機構使用者的 Cloud IAM 權限。此方法會將您要測試的資源網址和權限當做輸入參數,並傳回使用者可以存取的權限子集。

如果您直接使用 Cloud Platform 主控台來管理權限,則不需要叫用 testIamPermission()testIamPermissions() 通常適合與您的專屬軟體 (如自訂圖形使用者介面) 整合使用。舉例來說,Cloud Platform 主控台於內部使用 testIamPermissions() 以決定哪些 UI 應開放提供已登入的使用者操作。

API

您可以使用 testIamPermissions() 方法查看呼叫者針對指定資源擁有的指定權限。這個方法會將資源名稱與一組權限當做參數,並傳回呼叫者擁有的權限子集。

以下是測試機構權限的一些程式碼範例:

Request:

POST https://cloudresourcemanager.googleapis.com/v1/organization/12345:testIamPermissions

{
    "permissions":  [
        "resourcemanager.organizations.get",
        "resourcemanager.organizations.update"
    ]
}

Response:

{
    "permissions": [
        "resourcemanager.organizations.get"
    ]
}

Python

...

crm = discovery.build(
    'cloudresourcemanager', 'v1', http=creds.authorize(httplib2.Http()))

response = crm.organizations().testIamPermissions(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'permissions': [
            'resourcemanager.organizations.setIamPolicy',
            'resourcemanager.projects.update'
        ]
    }).execute()

print json.dumps(response, indent=2)

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

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

這個網頁
Resource Manager 說明文件