查看允許政策時,您可能會看到角色名稱包含 withcond
字串,後面接著雜湊值。舉例來說,您可能會看到 roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8
這類角色名稱。
本頁面說明在允許政策中看到 withcond
字串的時機和原因。如果看到這個字串,系統也會建議您採取哪些行動。
政策版本和條件式角色繫結
在使用版本 1
的允許政策中,部分角色繫結可能會在角色名稱中包含 withcond
字串,後面接著雜湊值:
{
"bindings": [
{
"members": [
"principal://iam.googleapis.com/locations/global/workforcePools/example-pool/subject/dana@example.com"
],
"role": "roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8"
}
],
"etag": "BwUjMhCsNvY=",
"version": 1
}
這個格式表示角色繫結是有條件的。換句話說,只有在符合特定條件時,系統才會授予角色。
1
版允許政策不會顯示這些條件。如果看到字串 withcond
和雜湊值,表示角色繫結包含您無法查看的條件。
解決方案:指定政策版本 3
為確保您能查看及更新整個允許政策 (包括政策條件),在取得或設定允許政策時,請務必指定版本 3
。如要指定版本 3
,請完成下列各節的任務。
更新 gcloud 工具
如果您使用 Google Cloud CLI,請執行 gcloud version
來檢查版本號碼。輸出內容會包含類似 Google Cloud CLI 279.0.0
的字串。
如果版本號碼小於 263.0.0,請執行 gcloud components update
更新 gcloud CLI。在 263.0.0 以上版本中,gcloud CLI 會自動指定支援條件的允許政策版本。
更新用戶端程式庫
如果應用程式使用用戶端程式庫,請按照下列步驟操作:
找出用戶端程式庫的名稱和版本號碼,然後查看支援允許政策版本的用戶端程式庫清單。
如果您已使用最新版本的用戶端程式庫,且該程式庫支援允許政策版本,則不必更新用戶端程式庫。繼續執行下一步。
如果您使用舊版用戶端程式庫,且較新版本支援允許政策版本,請將用戶端程式庫更新至最新版本。
如果您使用的用戶端程式庫不支援允許政策版本,可以將支援允許政策版本的其他用戶端程式庫新增至應用程式。使用該用戶端程式庫處理允許政策。 或者,您也可以直接使用 IAM REST API。
更新應用程式中取得及設定允許政策的所有程式碼:
- 收到允許政策時,請務必在要求中指定版本
3
。 設定允許政策時,請一律將允許政策的
version
欄位設為3
,並在要求中加入etag
欄位。
- 收到允許政策時,請務必在要求中指定版本
更新 REST API 呼叫
如果應用程式直接使用 IAM REST API,請更新所有取得及設定允許政策的程式碼:
- 收到允許政策時,請務必在要求中指定版本
3
。 設定允許政策時,請一律將允許政策的
version
欄位設為3
,並在要求中加入etag
欄位。
政策更新管理工具
如果您保留允許政策的本機副本 (例如將副本儲存在版本控制系統中,並視為程式碼),請確保使用的所有工具符合下列條件:
- 所有取得或設定允許政策的要求都會指定版本
3
- 所有設定允許政策的要求都會在要求中包含
etag
欄位
如果工具不符合這些條件,請檢查是否有更新版本。
此外,請確認管理工具會保留有條件的角色授予項目,而不是新增不含條件的重複角色授予項目。舉例來說,請參考以下情境:
您在資料夾
my-folder
上,將「建立服務帳戶」角色 (roles/iam.serviceAccountCreator
) 授予使用者 Mahan。資料夾的允許政策類似以下範例:{ "bindings": [ { "members": [ "principal://iam.googleapis.com/locations/global/workforcePools/example-pool/subject/mahan@example.com" ], "role": "roles/iam.serviceAccountCreator" } ], "etag": "BuFmmMhCsNY=", "version": 1 }
您可以使用工具擷取允許政策,並將其儲存在版本控制系統中。
您新增條件,讓 Mahan 只能在德國柏林的正常工作週期間建立服務帳戶。更新後的允許政策會類似以下範例:
{ "bindings": [ { "members": [ "principal://iam.googleapis.com/locations/global/workforcePools/example-pool/subject/mahan@example.com" ], "role": "roles/iam.serviceAccountCreator", "condition": { "title": "work_week_only", "expression": "request.time.getDayOfWeek('Europe/Berlin') >= 1 && request.time.getDayOfWeek('Europe/Berlin') <= 5" } } ], "etag": "BwWcR/B3tNk=", "version": 3 }
您可以使用工具擷取更新後的允許政策。這項工具要求允許政策時,不會指定允許政策版本,因此您會收到
1
版本的允許政策,且角色名稱已修改:{ "bindings": [ { "members": [ "principal://iam.googleapis.com/locations/global/workforcePools/example-pool/subject/mahan@example.com" ], "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379" } ], "etag": "BwWcR/B3tNk=", "version": 1 }
此時,管理工具可能會判斷 Mahan 與角色 roles/iam.serviceAccountCreator
的繫結已消失,因此應將原始角色繫結還原至允許政策:
避免:沒有條件的其他角色繫結
{
"bindings": [
{
"members": [
"principal://iam.googleapis.com/locations/global/workforcePools/example-pool/subject/mahan@example.com"
],
"role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
},
{
"members": [
"principal://iam.googleapis.com/locations/global/workforcePools/example-pool/subject/mahan@example.com"
],
"role": "roles/iam.serviceAccountCreator"
}
],
"etag": "BwWd3HjhKxE=",
"version": 1
}
這項變更不正確。無論星期幾,都會將 roles/iam.serviceAccountCreator
角色授予 Mahan。因此,第一個角色繫結中的條件不會生效。
如果管理工具嘗試進行這類變更,請勿核准變更。您必須更新管理工具,在要求中指定版本 3
。