Trusted Cloud by S3NS 提供身分與存取權管理 (IAM) 功能,可讓您以更精細的方式授予特定 Trusted Cloud 資源的存取權,避免其他資源遭到未經授權者擅自存取。IAM 能讓您採用最低權限安全性原則,僅授予必要的資源存取權限給使用者。
設定允許政策之後,即可控管哪些使用者具備何種存取權限 (角色),可以存取哪些資源。允許政策可授予使用者特定角色,讓對方擁有特定權限。
本頁說明機構資源適用的 IAM 角色,以及如何使用 Cloud Resource Manager API 建立及管理機構資源的允許政策。詳情請參閱「管理專案、資料夾和機構的存取權」。
權限與角色
如要控管資源存取權, Trusted Cloud by S3NS 發送 API 要求的帳戶必須具備適當的 IAM 角色。身分與存取權管理角色包含權限,可讓使用者對Trusted Cloud 資源執行特定操作。舉例來說,resourcemanager.organizations.get
權限可讓使用者取得機構資源的詳細資料。
您並非直接為使用者授予權限,而是指派「角色」給他們,每個角色可能具備一或多項權限。
針對同一項資源,您可以授予一或多個角色。
使用預先定義的角色
下表列出了您可以授予的角色,擁有這些角色的使用者即可存取機構資源的屬性。此外,您也可以透過下表瞭解各個角色的作用和角色具備的權限。
角色 | 權限 |
---|---|
機構管理員( 可管理 IAM 政策,以及查看關於機構、資料夾和專案的機構政策。 可授予此角色的最低層級資源:
|
|
機構檢視者( 提供檢視機構的權限。 可授予此角色的最低層級資源:
|
|
機構政策管理員( 可設定組織政策,以便定義機構對於雲端資源配置的限制。 可授予此角色的最低層級資源:
|
|
瀏覽器( 瀏覽專案階層的讀取權限,包括資料夾、機構和允許政策。本角色不包含查看專案資源的權限。 可授予此角色的最低層級資源:
|
|
建立自訂角色
除了本主題中描述的預先定義角色之外,您也可以建立自訂角色,角色的權限集合按照您的需求而訂。建立自訂角色與 Resource Manager 一起使用時,請注意以下幾點:- 「列出」及「取得」這兩項權限,例如
resourcemanager.projects.get/list
,需一律同時授予。 - 當您的自訂角色包含
folders.list
和folders.get
權限時,同時也應包含projects.list
和projects.get
。 - 請注意,機構、資料夾和專案資源的
setIamPolicy
權限允許使用者授予所有其他權限,因此應謹慎指派。
檢視機構資源的現有存取權
您可以取得機構資源的允許政策,查看為該資源授予的使用者角色。您可以使用 Trusted Cloud 控制台、Google Cloud CLI 或 getIamPolicy()
方法,查看機構資源的允許政策。
主控台
如要使用 Trusted Cloud 控制台檢視在機構資源層級所授予的角色:
前往 Trusted Cloud 控制台的「管理資源」頁面:
在「Organization」(機構) 下拉式選單中,選取您的機構資源。
勾選機構資源的核取方塊。
在右側「Info panel」(資訊面板) 的「Permissions」(權限) 下方,點按以展開角色並顯示具有此角色的所有成員。
gcloud
使用 get-iam-policy 指令取得機構資源的允許政策:
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/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 網域。您可以使用 Trusted Cloud 主控台、gcloud CLI 或 setIamPolicy()
方法授予角色。
主控台
如要使用 Trusted Cloud 主控台,在機構資源層級設定存取權控管,請按照下列步驟操作:
前往 Trusted Cloud 控制台的「管理資源」頁面:
在「Organization」(機構) 下拉式選單中,選取您的機構資源。
選取機構資源旁的核取方塊。如果您沒有資料夾資源,則無法顯示機構資源。如要繼續,請參考透過 IAM 頁面授予角色的操作說明。
如果右側的資訊面板窗格未顯示,請按一下右上角的 [Show Info Panel] (顯示資訊面板)。
在「資訊面板」窗格的「權限」分頁中,按一下「新增成員」。
在「New members」(新增成員) 欄位中,輸入要新增的團隊成員。 您可以指定使用者帳戶電子郵件、Google 群組、服務帳戶或 G Suite 網域。
在「Select a role」(選擇角色) 下拉式選單中,選取要授予團隊成員的角色。
按一下「新增」。
gcloud
如要使用 gcloud
指令設定機構資源的允許政策:
使用
get-iam-policy
指令取得機構資源的允許政策,並將政策輸出至 JSON 檔案:gcloud alpha organizations get-iam-policy [ORGANIZATION_ID] --format json > [FILENAME.JSON]
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="
}
- 使用文字編輯器打開 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 alpha 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()
方法可讓您透過將允許政策附加至機構資源的方式來授予使用者角色。允許政策是一組繫結,可定義。
讀取 - 修改 - 寫入:這是更新資源中繼資料的常見模式,以允許政策為例:首先讀取政策的目前狀態,在本機上更新資料,然後傳送已修改的資料以供寫入。如果有兩個以上的獨立程序同時嘗試相同順序,這個模式可能會產生衝突。舉例來說,如果專案有兩位擁有者同時嘗試對允許政策執行互相衝突的變更,在某些情況下,其中一個專案擁有者所做的變更可能會失敗。身分與存取權管理服務會透過在允許政策中使用 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)
限制使用者可見的專案
使用者可以在 Trusted Cloud 控制台和搜尋查詢中,查看他們有權存取的所有專案,無論這些專案是否位於使用者選取的機構資源中。您可以使用機構政策服務,限制查詢和 Trusted Cloud 控制台中傳回的專案集。這項設定可用於限制使用者只能查看自己網域內的專案。
機構政策限制 constraints/resourcemanager.accessBoundaries
是對機構資源強制執行的清單限制。這項限制會接受機構資源 ID 清單,定義一組機構資源,讓這些資源在查詢或 Trusted Cloud 控制台中對使用者顯示。
如果使用者沒有專案上層機構資源的 resourcemanager.organizations.get
權限,專案就會顯示在 No organization
下方。這可能會導致不屬於機構資源的專案,看起來完全沒有與機構資源建立關聯。如果您使用 resourcemanager.accessBoundaries
限制條件禁止使用機構資源,則屬於該機構資源的專案不會顯示在查詢或 Trusted Cloud 控制台中。如果強制執行這項限制,系統就不會顯示尚未遷移至機構資源的任何專案。
建議您先將 No organization
下的專案遷移至機構資源,再強制執行這項限制。如要瞭解如何將專案遷移至機構資源,請參閱「移動專案」。
如要瞭解如何設定機構政策,請參閱「使用限制」。
授予條件式存取權
某些 IAM 角色 (例如「機構政策管理員」roles/orgpolicy.policyAdmin
) 只能授予機構資源。由於政策繼承,機構中的所有資源通常都會繼承這個角色。
如要進一步控管角色可存取的資源,可以使用 IAM 條件。使用附帶條件的標記,可讓您只在資源具有指定標記時授予存取權。舉例來說,下列允許政策只會將機構政策管理員角色授予具有 environment: dev
標記的資源,不會授予任何其他資源:
{
"bindings": [
{
"members": [
"principalSet://iam.googleapis.com/locations/global/workforcePools/my-pool/group/my-group"
],
"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 權限。此方法會將您要測試的資源網址和權限當做輸入參數,並傳回使用者可以存取的權限子集。
如果直接使用Trusted Cloud 控制台管理權限,通常不會叫用 testIamPermission()
。testIamPermissions()
適合與您的專屬軟體 (如自訂圖形使用者介面) 整合。舉例來說, Trusted Cloud 主控台會在內部使用 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)