Identity and Access Management (IAM) 可讓您對特定 Cloud de Confiance by S3NS 資源授予精細的存取權,避免未經授權者存取其他資源。套用最小權限原則,只授予工作負載所需的權限。
IAM 透過允許政策,將特定角色繫結至使用者,控管哪些使用者具備哪些資源的何種存取權 (角色)。如要管理整個資源階層的存取權,您可以使用 Cloud Resource Manager API,設定組織層級的 IAM 角色和允許政策。您也可以定義拒絕政策,防止主體使用特定權限。詳情請參閱「管理專案、資料夾和組織的存取權」。
權限與角色
為控管資源存取權, Cloud de Confiance by S3NS 要求提出 API 要求的帳戶必須具備適當的 IAM 角色。IAM 角色包含權限,可讓使用者對Cloud de Confiance 資源執行特定動作。例如,resourcemanager.organizations.get 權限可讓使用者取得組織資源的詳細資料。
您並非直接為使用者授予權限,而是指派「角色」給他們,每個角色可能具備一或多項權限。
針對同一項資源,您可以授予一或多個角色。
使用預先定義的角色
下表列出可授予哪些角色來存取組織資源的屬性、角色功能說明,以及該角色內含的權限。
| 角色 | 權限 |
|---|---|
組織管理員( 可管理 IAM 政策,以及查看關於組織、資料夾和專案的組織政策。 可授予這個角色的最低層級資源:
|
|
組織檢視者( 提供檢視機構的權限。 可授予這個角色的最低層級資源:
|
|
組織政策管理員( 可設定組織政策,以便定義機構對於雲端資源配置的限制。 可授予這個角色的最低層級資源:
|
|
Browser( 瀏覽專案階層的讀取權限,包括資料夾、組織和允許政策。本角色不包含查看專案資源的權限。 可授予這個角色的最低層級資源:
|
|
建立自訂角色
除了本主題所述的預先定義角色外,您也可以建立自訂角色,也就是根據需求自訂的權限集合。建立要與 Resource Manager 搭配使用的自訂角色時,請注意下列事項:- 列出和取得權限 (例如
resourcemanager.projects.get/list) 應一律成對授予。 - 如果自訂角色包含
folders.list和folders.get權限,也應包含projects.list和projects.get。 - 請注意,如果使用者具備組織、資料夾和專案資源的
setIamPolicy權限,就能授予所有其他權限,因此請謹慎指派。
查看組織資源的現有存取權
您可以取得組織資源的允許政策,查看使用者獲派的組織資源角色。您可以使用 Cloud de Confiance 控制台、Google Cloud CLI 或 getIamPolicy() 方法,查看組織資源的允許政策。
控制台
如要使用 Cloud de Confiance 控制台查看組織資源層級授予的角色,請按照下列步驟操作:
前往 Cloud de Confiance 控制台的「Manage resources」(管理資源) 頁面:
在「Organization」(組織) 下拉式選單中,選取組織資源。
勾選組織資源的核取方塊。
在「資訊面板」的「權限」下方,按一下「展開」角色,即可顯示具備該角色的所有成員。
gcloud
使用 get-iam-policy 指令,取得組織資源的允許政策:
gcloud 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/v3/organizations/12345 的允許政策。
要求:
POST
https://cloudresourcemanager.googleapis.com/v3/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.s3ns-system.iam.gserviceaccount.com"
]
}
]
"etag": "BwUjHYKHHiQ="
}
Python
getIamPolicy() 方法可讓您取得先前設定的允許政策。
crm = discovery.build(
'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
resource=flags.organizationId, body={}).execute()
print json.dumps(policy, indent=2)
授予組織資源存取權
組織管理員可以將 IAM 角色授予團隊成員,讓他們存取組織的資源和 API。您可以將角色授予使用者帳戶電子郵件、Google 群組、服務帳戶或 G Suite 網域。您可以使用 Cloud de Confiance 控制台、gcloud CLI 或 setIamPolicy() 方法授予角色。
控制台
如要使用 Cloud de Confiance 控制台,在組織資源層級設定存取控管,請按照下列步驟操作:
前往 Cloud de Confiance 控制台的「Manage resources」(管理資源) 頁面:
在「Organization」(組織) 下拉式選單中,選取組織資源。
勾選組織資源的核取方塊。如果您沒有資料夾資源,就不會看到組織資源。如要繼續操作,請參閱透過 IAM 頁面授予角色的操作說明。
如果右側的「Info Panel」(資訊面板) 處於隱藏狀態,請按一下右上角的「Show Info Panel」(顯示資訊面板)。
在「Info Panel」(資訊面板) 的「Permissions」(權限) 分頁中,按一下「Add Member」(新增成員)。
在「新增成員」欄位中,輸入要新增的團隊成員。您可以指定使用者帳戶電子郵件、Google 群組、服務帳戶或 G Suite 網域。
在「Select a role」(選取角色) 下拉式選單中,選取要授予團隊成員的角色。
按一下「新增」。
gcloud
如要使用 gcloud 指令設定組織資源的允許政策,請按照下列步驟操作:
使用
get-iam-policy指令取得組織資源的允許政策,並將政策輸出至 JSON 檔案:gcloud organizations get-iam-policy \ ORGANIZATION_ID \ --format json > FILENAME.JSONJSON 檔案的內容與以下類似:
{
"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="
}
- 在文字編輯器中開啟 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="
}
- 執行下列指令,更新組織資源的允許政策:
gcloud organizations set-iam-policy \
ORGANIZATION_ID policy.json
API
要求:
POST https://cloudresourcemanager.googleapis.com/v3/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.s3ns-system.iam.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.s3ns-system.iam.gserviceaccount.com"
]
}
]
"etag": "BwUjHYKJUiQ="
}
setIamPolicy() 方法可讓您將允許政策附加至組織資源,藉此將角色授予使用者。允許政策是一組繫結
讀取-修改-寫入:更新資源中繼資料 (例如允許政策) 的常見模式,包括讀取資源的目前狀態、在本機更新資料,然後傳送修改後的資料以供寫入。如果有兩個以上的獨立程序同時嘗試相同順序,這個模式可能會產生衝突。舉例來說,如果兩位專案擁有者同時嘗試對允許政策進行不一致的變更,其中一位擁有者的變更可能會失敗。IAM 解決這個問題的方法,是在允許政策中使用 etag 屬性。這項屬性會驗證允許政策自上次要求以來是否有所變更。當您使用 etag 值提出要求時,系統會比較要求中的 etag 值和與政策相關聯的現有 etag 值。只有在 etag 值相符時,系統才會寫入允許政策。
更新允許政策時,請先使用 getIamPolicy() 取得允許政策,更新允許政策,然後使用 setIamPolicy() 寫入更新後的允許政策。設定允許政策時,只有在 GetPolicyResponse 中對應的允許政策包含 etag 值時,才使用 etag 值。
Python
setIamPolicy() 方法可讓您將允許政策附加至資源。setIamPolicy 方法會採用 SetIamPolicyRequest,其中包含要設定的允許政策,以及附加允許政策的資源。並傳回產生的允許政策。使用 setIamPolicy() 更新允許政策時,建議遵循讀取-修改-寫入模式。
以下是為組織資源設定允許政策的程式碼範例:
crm = discovery.build(
'cloudresourcemanager', 'v3', 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 Administrator 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)
限制使用者的專案瀏覽權限
使用者可以在 Cloud de Confiance 控制台和搜尋查詢中,查看自己有權存取的所有專案,無論這些專案是否位於使用者選取的組織資源中。您可以使用組織政策服務,限制查詢和 Cloud de Confiance 控制台中傳回的專案組合。這樣一來,使用者就只能查看網域內的專案。
組織政策限制 constraints/resourcemanager.accessBoundaries 是對組織資源強制執行的清單限制。這項限制接受組織資源 ID 清單,定義一組組織資源,讓使用者在查詢或 Cloud de Confiance 控制台中查看這些資源。
如果使用者對專案的上層組織資源沒有 resourcemanager.organizations.get 權限,專案就會顯示在 No organization 下方。這可能會讓不屬於組織資源的專案,看起來與任何組織資源都沒有關聯。如果您使用 resourcemanager.accessBoundaries 限制不允許組織資源,則屬於該組織資源的專案不會顯示在查詢或 Cloud de Confiance 控制台中。如果強制執行這項限制,就無法查看尚未遷移至組織資源的專案。
建議您先將 No organization 底下的專案遷移至組織資源,再強制執行這項限制。如要瞭解如何將專案移至組織資源,請參閱「移動專案」。
如要瞭解如何設定組織政策,請參閱「使用限制」。
授予條件式存取權
某些 IAM 角色 (例如組織政策管理員 (roles/orgpolicy.policyAdmin)) 只能在組織資源上授予。基於政策繼承,組織中的所有資源通常都會繼承這個角色。
如要進一步控管授予角色的資源,可以使用 IAM 條件。使用標記和條件,即可只在資源具有指定標記時授予存取權。舉例來說,下列允許政策只會對具有 environment: dev 標記的資源授予組織政策管理員角色,不會對其他資源授予該角色:
{
"bindings": [
{
"members": [
"{dynamic print variables.examples.principal_group_api}"
],
"role": "roles/orgpolicy.policyAdmin",
"condition": {
"title": "Dev_environment_only",
"description": "Only granted in the development environment",
"expression":
"resource.matchTag('123456789012/env', 'dev')"
}
}
],
"etag": "BwWKmjvelug=",
"version": 3
}
測試權限
您可以使用 testIamPermissions() 方法,測試使用者對組織資源的 IAM 權限。這個方法會採用資源網址和要測試的權限組合。並傳回使用者可存取的權限子集。
如果您直接使用Cloud de Confiance 控制台管理權限,通常不會叫用 testIamPermissions()。testIamPermissions() 旨在與您的專屬軟體整合,例如自訂圖形使用者介面。舉例來說, Cloud de Confiance 控制台會在內部使用 testIamPermissions(),判斷登入的使用者可以使用哪些 UI。
API
您可以使用 testIamPermissions() 方法,檢查呼叫端對指定資源擁有哪些指定權限。這個方法會將資源名稱與一組權限當做參數,並傳回呼叫者擁有的權限子集。
以下是測試組織資源權限的程式碼範例:
Request:
POST https://cloudresourcemanager.googleapis.com/v3/organizations/12345:testIamPermissions
{
"permissions": [
"resourcemanager.organizations.get",
"resourcemanager.organizations.setIamPolicy"
]
}
Response:
{
"permissions": [
"resourcemanager.organizations.get"
]
}
Python
crm = discovery.build(
'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
response = crm.organizations().testIamPermissions(
resource=flags.organizationId,
body={
'resource': flags.organizationId,
'permissions': [
'resourcemanager.organizations.setIamPolicy',
'resourcemanager.projects.patch'
]
}).execute()
print json.dumps(response, indent=2)