本文說明條件運算式中支援的屬性。
支援的條件屬性
下列各節會摘要說明支援的屬性,並指出哪些Trusted Cloud by S3NS 服務可辨識各項屬性。
資源屬性
下列屬性與要求主體的資源相關。
屬性 | 使用摘要 | 支援的 Trusted Cloud 服務 |
---|---|---|
資源服務 屬性 |
根據 Trusted Cloud 使用的服務管理存取權。 您可以在允許政策角色繫結中使用這項屬性。 |
|
資源類型屬性 |
根據資源類型管理存取權。 您可以在允許政策角色繫結中使用這項屬性。 |
|
資源名稱屬性 |
依資源名稱管理存取權。 您可以在允許政策角色繫結中使用這項屬性。 |
|
資源標記 |
根據附加至資源的標記管理存取權。 你可以在下列位置使用這項屬性:
|
所有 Trusted Cloud 服務 (請參閱「支援的條件繼承」) |
如要進一步瞭解資源屬性,請參閱本頁的「資源屬性」一節。
要求屬性
下列屬性與要求的詳細資料相關。
屬性 | 使用摘要 | 支援的 Trusted Cloud 服務 |
---|---|---|
根據特定 Trusted CloudAPI 或服務提供的資料管理存取權。 您可以在允許政策角色繫結中使用這項屬性。 |
|
|
為 Trusted Cloud 資源設定有期限、排程或限時等存取方式。 您可以在允許政策角色繫結中使用這些屬性。 |
所有 Trusted Cloud 服務 (請參閱「支援的條件繼承」) |
|
指定主體可建立的轉送規則類型。舉例來說,您可以允許主體為內部 Trusted Cloud by S3NS 負載平衡器建立轉送規則,處理源自 Trusted Cloud 網路內的流量,但不允許為外部 Trusted Cloud 負載平衡器建立轉送規則,處理源自網際網路的流量。 您可以在允許政策角色繫結中使用這些屬性。 |
|
如要進一步瞭解要求屬性,請參閱本頁面的「要求屬性」一節。
支援繼承條件
部分類型的 Trusted Cloud 資源不允許在允許政策中加入條件。不過,您可以在機構、資料夾或專案層級新增條件式角色繫結,其他資源會透過資源階層沿用這些角色繫結。詳情請參閱「接受條件式角色繫結的資源類型」。
在機構、資料夾或專案層級使用屬性時,請注意大多數屬性僅適用於特定資源類型。如果條件的某個部分使用無效的屬性,則該部分永遠不會解讀為授予存取權。舉例來說,條件 resource.name.endsWith == devResource
永遠不會授予任何 IAM 資源的存取權,因為 IAM 資源不會提供資源名稱。
如要避免這個問題,請使用本頁說明的「資源類型」和「資源服務」屬性,限制條件的範圍。舉例來說,下列條件會針對 Compute Engine 執行個體以外的所有資源類型評估為 true
;相反地,對於 Compute Engine 執行個體,條件會檢查資源名稱:
resource.type != 'compute.googleapis.com/Disk' ||
resource.name.endsWith('devResource')
您不需要限制檢查附加至資源的標記的條件範圍。條件檢查標記鍵和值時,無法檢查任何其他屬性,包括資源類型和資源服務。
資源屬性
資源服務、資源類型和資源名稱屬性通常用於變更角色繫結提供的存取授權範圍。當角色包含適用於不同資源特定屬性的權限時,資源型條件可用於授予特定類型或特定服務類型之角色權限的子集。
resource.service 屬性
resource.service
屬性可讓您根據使用的Trusted Cloud 服務設定條件。舉例來說,您可以設定條件,限制使用者存取使用 cloudresourcemanager.googleapis.com
服務的資源。如需支援的值清單,請參閱「資源服務值」。
您可以在允許政策角色繫結中使用 resource.service
屬性。
屬性變數 | resource.service |
---|---|
屬性類型 |
如需支援的值清單,請參閱資源服務值。 |
支援的運算子 | , |
詳細資料 |
在條件中使用 resource.type 屬性時,請檢查屬性是否完全相等 ( ) 或完全不相等 ( )。其他比較 (例如檢查前置字元或後置字元) 可能會產生非預期的結果。
|
範例 |
傳回 Compute Engine 資源的 resource.service == "compute.googleapis.com" |
支援的服務 |
|
resource.type 屬性
resource.type
屬性可讓您根據資源類型設定條件。舉例來說,您可以設定條件,限制使用者存取 storage.googleapis.com/Object
類型的資源。如需支援的值清單,請參閱資源類型值。
如果條件使用 resource.name
屬性,強烈建議您使用 resource.type
屬性,控管條件適用的資源類型。詳情請參閱本頁的resource.name
屬性。
您可以在允許政策角色繫結中使用 resource.type
屬性。
屬性變數 | resource.type |
||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
屬性類型 |
如需支援的值清單,請參閱資源類型值。 |
||||||||||||||||||||||
支援的運算子 | , |
||||||||||||||||||||||
詳細資料 |
在條件中使用 resource.type 屬性時,請檢查屬性是否完全相等 ( ) 或完全不相等 ( )。其他比較方式 (例如檢查前置字元或後置字元) 可能會產生非預期的結果。 |
||||||||||||||||||||||
範例 |
除非資源是 Compute Engine 映像檔,否則會傳回 resource.type != "compute.googleapis.com/Image"
只有在資源是 Compute Engine 映像檔或永久磁碟時,才會傳回 (resource.type == "compute.googleapis.com/Image" || resource.type == "compute.googleapis.com/Disk") |
||||||||||||||||||||||
支援的資源類型 |
1 Cloud Key Management Service 會將這個資源類型做為金鑰環資源的父項。 |
resource.name 屬性
resource.name
屬性可讓您根據資源名稱的全部或部分內容設定條件。如需資源名稱格式清單,請參閱「資源名稱格式」。
resource.name
屬性僅適用於特定資源類型,詳情請參閱本節表格。強烈建議您將條件的適用範圍限制在預期資源類型。如果角色包含不提供 resource.name
屬性的資源類型權限,請確保這些權限不受條件中檢查 resource.name
的部分限制。
以下範例說明如何確保這種行為。在本例中,條件允許存取所有資源類型,但 Cloud Storage 值區和物件除外。相較之下,對於值區和物件,條件只允許存取值區 example-bucket
和其中包含的物件:
(resource.type != 'storage.googleapis.com/Bucket' &&
resource.type != 'storage.googleapis.com/Object') ||
resource.name.startsWith('projects/_/buckets/example-bucket')
請注意,條件的第一部分會檢查資源是否既不是值區也不是物件。如果資源類型不同,則無論資源名稱為何,整個條件都會評估為 true
。
此外,請注意條件會檢查 resource.type
屬性,而不是 resource.service
屬性。檢查 resource.type
屬性有幾項好處:
- 這樣可將
resource.name
檢查範圍限制為適當的資源集。舉例來說,如果您想授予特定名稱的 Compute Engine 執行個體存取權,排除 Compute Engine 執行個體以外的所有資源類型,就是合理的做法。 - 如果服務日後新增資源類型,這項設定可防止條件的範圍變更。
最後請注意,條件會使用 startsWith()
函式評估資源名稱,而非使用 運算子檢查是否相等。由於條件會檢查資源名稱的開頭,因此會比對值區和該值區中的物件。如果勾選「相等」,則只會比對 bucket。
您無法使用萬用字元 (例如 *
) 比對多個資源名稱。請考慮下列替代方案:
使用
extract()
函式從資源名稱擷取值。舉例來說,您可以從 Compute Engine VM 執行個體的資源名稱中擷取專案 ID,然後編寫參照該專案 ID 的條件運算式。詳情請參閱本頁的「從屬性擷取值」。
使用
startsWith()
或endsWith()
函式編寫條件,評估資源名稱的開頭或結尾。
您可以在允許政策角色繫結中使用 resource.name
屬性。
屬性變數 | resource.name |
||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
屬性類型 |
每種資源類型都有專屬的資源名稱格式。如需格式清單,請參閱資源名稱格式。 |
||||||||||||||||
支援的函式與運算子 |
startsWith(), endsWith(), extract(),
, |
||||||||||||||||
詳細資料 |
|
||||||||||||||||
範例 |
除非資源名稱識別名為 resource.name != "projects/_/buckets/secret-bucket-123"
如果資源名稱開頭為指定前置字元,則傳回 resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/prod-")
如果資源名稱開頭為指定前置字串,則傳回 resource.name.startsWith("projects/_/buckets/my_bucket/objects/test-object-")
如果資源名稱結尾為指定的後置字串,則傳回 resource.name.endsWith(".jpg") 如果專案名稱或編號存在,則傳回該名稱或編號: resource.name.extract("projects/{project}/") |
||||||||||||||||
支援的資源類型 |
|
資源標記
資源標記函式可讓您根據附加至支援資源的標記,或這些資源後代繼承的標記,設定條件。舉例來說,您可以設定條件,只針對附加 env: prod
標記的資源授予角色。如要進一步瞭解如何使用標記控管存取權,請參閱「標記和存取權控管」。
每個標記都包含鍵和值。每個鍵和值都有幾種不同類型的 ID:
-
永久 ID:全域不重複,且不得重複使用。舉例來說,標記鍵可能具有永久 ID
tagKeys/123456789012
,標記值可能具有永久 IDtagValues/567890123456
。 -
簡稱。每個鍵的簡稱在定義鍵的專案或機構中不得重複,且每個值的簡稱在相關聯的鍵中不得重複。舉例來說,標記鍵的簡稱可以是
env
,標記值的簡稱可以是prod
。 -
命名空間名稱:將機構的數字 ID 或專案 ID 新增至標記鍵的簡稱。舉例來說,為機構建立的標記鍵可能具有
123456789012/env
這個命名空間名稱。如要瞭解如何取得機構 ID,請參閱「取得機構資源 ID」。為專案建立的標記鍵可能具有命名空間名稱myproject/env
。如要瞭解如何取得專案 ID,請參閱「識別專案」。
如需在條件中選擇使用哪種 ID 的指引,請參閱「代碼定義和 ID」。
您可以使用以標記為準的條件,有條件地存取任何資源。這包括有自己標記的資源,以及從其他資源繼承標記的資源。如要進一步瞭解如何透過資源階層沿用標記,請參閱「標記沿用」。
不過, Trusted Cloud 控制台的某些區域無法辨識具有標記條件的允許政策角色繫結。因此,如果您擁有附有標記條件的角色, Trusted Cloud 控制台可能會錯誤地禁止您執行特定動作。如果遇到這個問題,請使用其他方法 (例如 gcloud CLI) 執行動作。
您可以在下列項目中使用以標記為準的條件:
- 允許政策角色繫結
- 拒絕政策拒絕規則
您可以使用下列函式,根據標記設定條件:
函式 | 說明 |
---|---|
resource.hasTagKey(
bool
|
檢查要求資源是否具有指定鍵的標記。系統會依命名空間名稱查詢標記鍵。如要使用永久 ID 檢查代碼鍵,請使用
|
resource.hasTagKeyId(
bool
|
檢查要求資源是否具有指定鍵的標記。系統會根據永久 ID 查詢代碼鍵。
如要使用命名空間名稱檢查標記鍵,請使用
|
resource.matchTag(
bool
|
檢查要求資源是否具有指定鍵和值的標記。系統會依命名空間名稱查詢鍵,並依簡稱查詢值。如要使用永久 ID 檢查代碼鍵和值,請使用
|
resource.matchTagId(
bool
|
檢查要求資源是否具有指定鍵和值的標記。系統會根據永久 ID 查詢索引鍵和值。如要使用命名空間限定名稱檢查標記鍵,並使用簡短名稱檢查值,請使用
|
要求屬性
要求屬性可讓您建立條件,評估要求詳細資料,例如要求修改的角色,或要求日期和時間。
API 屬性
API 屬性可協助您根據特定 API 或服務提供的資料管理存取權。Trusted Cloud 您可以在允許政策角色繫結中使用 API 屬性。
如需在條件中使用 API 屬性的範例,請參閱下列頁面:
並非所有服務都能辨識 API 屬性。以下各節說明哪些服務可辨識各項 API 屬性。
API 屬性的函式
您可以使用下列函式處理 API 屬性:
函式 | 說明 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
api.getAttribute(
V<T>
|
取得要求的 API 屬性。
|
||||||||||||
hasOnly(
bool |
檢查清單是否只包含允許的項目,或這些項目的子集。您可以對
|
IAM API 屬性
IAM 提供下列 API 屬性:
屬性變數 | iam.googleapis.com/modifiedGrantsByRole |
---|---|
屬性類型 | list<string> |
詳細資料 |
如要設定資源的允許政策,這項屬性會包含要求修改的角色繫結中的角色名稱。 如果是其他類型的要求,則不會定義屬性。 |
接受這項屬性的資源類型 |
下列資源類型會在允許政策中接受具有
|
可辨識這項屬性的服務 |
下列服務可識別
|
日期/時間屬性
日期/時間屬性可用來為 Trusted Cloud 資源設定有期限、已排定或限時等各類存取。您可以在允許政策角色繫結中使用日期/時間屬性。
所有 Trusted Cloud 服務和資源類型都支援這項屬性。如要瞭解如何對不直接支援日期/時間條件的資源套用這類條件,請參閱本頁的「支援繼承條件」一節。
request.time
屬性包含要求的時間戳記。您可以比較這個時間戳記與其他時間戳記,或是與一段時間。
以下各節列出可用於根據時間戳記和時間長度設定條件的函式。
建立、比較及修改時間戳記和時間長度
函式或運算子 | 說明 |
---|---|
date(
Timestamp |
將日期從
|
duration(
Duration |
將時間量從
|
timestamp(
Timestamp |
將
|
, , , |
比較兩個
|
|
|
從時間戳記擷取資訊
本節中的函式可讓您從時間戳記擷取資訊,例如時間戳記所屬的星期幾。
在 IAM Conditions 中,所有時間戳記均為世界標準時間。不過,您可能想根據其他時區擷取資訊。舉例來說,您可能想知道世界標準時間的時間戳記是否落在德國柏林時區的星期一。
如要指定其他時區,請將時區傳遞至函式。使用名稱或與 IETF 時區資料庫的世界標準時間 (UTC) 偏移量。舉例來說,您可以將中歐時間 (CET) 設為 Europe/Berlin
或 +01:00
。
支援的函式與運算子 | 說明 |
---|---|
Timestamp.getDate(
int
|
從
|
Timestamp.getDayOfMonth(
int
|
從
|
Timestamp.getDayOfWeek(
int
|
從
|
Timestamp.getDayOfYear(
int
|
從
|
Timestamp.getFullYear(
int
|
從
|
Timestamp.getHours(
int
|
從
您可以將這項函式與
|
Timestamp.getMilliseconds(
int
|
從
|
Timestamp.getMinutes(
int
|
從
|
Timestamp.getMonth(
int
|
從
|
Timestamp.getSeconds(
int
|
從
|
, , , |
比較這個表格中兩個函式的輸出內容。 |
轉送規則屬性
轉送規則屬性可讓您指定主體可建立的轉送規則類型。舉例來說,您可以允許主體為內部 Trusted Cloud by S3NS負載平衡器建立轉送規則,這類負載平衡器會處理源自 Trusted Cloud 網路內的流量,但不能為外部 Trusted Cloud負載平衡器建立轉送規則,這類負載平衡器會處理源自網際網路的流量。您可以在允許政策角色繫結中使用轉送規則屬性。
如果是 Cloud Load Balancing,轉送規則屬性不會影響建立負載平衡器其他元件的能力,例如後端服務、目標 Proxy、健康狀態檢查和網址對應。 Trusted Cloud
支援的函式
函式 | 說明 |
---|---|
compute.isForwardingRule
bool
|
檢查要求是否正在建立轉送規則。
|
compute.matchLoad
bool
|
檢查要求是否會影響指定類型的負載平衡架構。如要找出各負載平衡配置的 ID,以及更多詳細資料,請參閱在負載平衡器上使用 IAM 條件 Trusted Cloud 。
|
支援的資源類型
這項屬性適用於建立下列資源類型的要求:
服務 | 資源類型 |
---|---|
Cloud Load Balancing | 轉送規則 |
Cloud VPN | 轉送規則 (全球和區域) |
Compute Engine | 轉送規則 (適用於通訊協定轉送) |
Cloud Service Mesh1 | 轉送規則 |
1 使用 Compute Engine 的資源屬性。
從屬性擷取值
您可以使用 extract()
函式從屬性擷取值。舉例來說,您可以擷取資源名稱的任意部分,然後編寫參照所擷取文字的條件運算式。
如要使用 extract()
函式,請提供擷取範本,指定要擷取的屬性部分。舉例來說,如要從 Compute Engine VM 執行個體的資源名稱中擷取專案 ID,可以使用 projects/{project}/
範本。
擷取範本包含下列部分:
以大括號括住的識別碼,用於識別要擷取的子字串。
請選擇簡短且有意義的 ID,清楚說明要擷取的值。可以使用
A
到Z
的大小寫英文字母、數字和底線 (_
)。在範本
projects/{project}/
中,ID 是project
。選用:前置字元,必須出現在要擷取的子字串之前。
在範本
projects/{project}/
中,前置字串為projects/
。選用:後置字串,必須出現在要擷取的子字串之後。
在範本
projects/{project}/
中,後置字串為/
。
extract()
函式會根據擷取範本是否含有前置字串、後置字串或兩者,擷取屬性的不同部分:
有前置字串 | 有後置字串 | 擷取的值 |
---|---|---|
— | — | 整個屬性 |
— | 前置字元第一次出現後的所有字元,或前置字元後沒有任何字元時的空字串 | |
— | 後置字串第一次出現前的字元,如果後置字串前沒有任何字元,則為空字串 | |
前置字串第一次出現和後置字串第一次出現之間的所有字元,如果前置字串和後置字串之間沒有任何字元,則為空字串 |
如果指定的前置字串或後置字串未出現在屬性中,或後置字串只出現在前置字串之前,extract()
函式會傳回空字串。
以下範例顯示了幾種不同擷取範本的輸出內容。這些範例是指 Cloud Storage 物件的資源名稱,projects/_/buckets/acme-orders-aaa/objects/data_lake/orders/
:
擷取範本 | 輸出 |
---|---|
/order_date={date}/ |
2019-11-03 |
buckets/{name}/ |
acme-orders-aaa |
/orders/{empty}order_date |
清空「string 」 |
{start}/objects/data_lake |
projects/_/buckets/acme-orders-aaa |
orders/{end} |
order_date=2019-11-03/aef87g87ae0876 |
{all} |
projects/_/buckets/acme-orders-aaa/objects/data_lake/orders/ |
/orders/{none}/order_date= |
清空「string 」 |
/orders/order_date=2019-11-03/ |
清空「string 」 |
如果您擷取代表日期的字串,可以使用本頁的日期/時間函式和運算子,將擷取的值轉換為 Timestamp
。如需範例,請參閱「設定以資源為基礎的存取權」。