本頁說明憑證存取權界線,可用於downscope或限制短期憑證可用的 Identity and Access Management (IAM) 權限。
您可以使用憑證存取範圍產生 OAuth 2.0 存取權杖,代表服務帳戶,但權限比服務帳戶少。舉例來說,如果某位客戶需要存取您控管的 Cloud Storage 資料,您可以採取下列做法:
- 建立可存取您擁有的每個 Cloud Storage bucket 的服務帳戶。
- 為服務帳戶產生 OAuth 2.0 存取權杖。
- 套用憑證存取邊界,只允許存取包含客戶資料的 bucket。
憑證存取權範圍的運作方式
如要縮小權限範圍,請定義憑證存取權範圍,指定短期憑證可存取的資源,以及每個資源可用的權限上限。接著,您可以建立短期憑證,然後換取符合憑證存取邊界的憑證。
如果您需要為每個工作階段授予主體一組不同的權限,使用憑證存取權界線會比建立多個不同的服務帳戶,並為每個服務帳戶授予一組不同的角色更有效率。
憑證存取權範圍的元件
憑證存取權範圍是包含存取權範圍規則清單的物件。每項規則都包含下列資訊:
- 規則套用的資源。
- 該資源可用的權限上限。
- 選用:進一步限制權限的條件。條件包括:
- 評估結果為
true
或false
的條件運算式。如果評估結果為true
,系統會允許存取;否則會拒絕存取。 - 選填:識別條件的標題。
- 選填:提供條件的詳細說明。
- 評估結果為
如果將憑證存取權範圍套用至短期憑證,則該憑證只能存取憑證存取權範圍內的資源。其他資源沒有權限。
憑證存取權範圍最多可包含 10 項存取權範圍規則。每個短期憑證只能套用一個憑證存取邊界。
以 JSON 物件表示時,憑證存取邊界包含下列欄位:
欄位 | |
---|---|
accessBoundary |
憑證存取權範圍的包裝函式。 |
accessBoundary.accessBoundaryRules[] |
要套用至短期憑證的存取權範圍規則清單。 |
accessBoundary.accessBoundaryRules[].availablePermissions[] |
這份清單會定義資源可用權限的上限。
每個值都是 IAM 預先定義角色或自訂角色的 ID,並以 |
accessBoundary.accessBoundaryRules[].availableResource |
規則適用的 Cloud Storage 值區完整資源名稱。請使用「 |
accessBoundary.accessBoundaryRules[].availabilityCondition |
(選用步驟) 限制權限僅適用於特定 Cloud Storage 物件的條件。 如果您想為特定物件 (而非 Cloud Storage 值區中的所有物件) 提供權限,請使用這個欄位。 |
accessBoundary.accessBoundaryRules[].availabilityCondition.expression |
條件運算式,用於指定可使用權限的 Cloud Storage 物件。
如要瞭解如何在條件運算式中參照特定物件,請參閱
|
accessBoundary.accessBoundaryRules[].availabilityCondition.title |
(選用步驟) 簡短字串,用於識別條件的用途。 |
accessBoundary.accessBoundaryRules[].availabilityCondition.description |
(選用步驟) 條件目的的詳細資料。 |
如需 JSON 格式的範例,請參閱本頁的「憑證存取權界線範例」。
憑證存取權範圍範例
以下各節將針對常見用途,提供憑證存取權界線的範例。當您以 OAuth 2.0 存取權杖換取範圍縮減的權杖時,就會使用憑證存取邊界。
限制值區的權限
以下範例顯示簡單的憑證存取權界線。這項限制適用於 Cloud Storage 值區 example-bucket
,並將權限上限設為 Storage 物件檢視者角色 (roles/storage.objectViewer
) 包含的權限:
{
"accessBoundary": {
"accessBoundaryRules": [
{
"availablePermissions": [
"inRole:roles/storage.objectViewer"
],
"availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket"
}
]
}
}
限制多個值區的權限
以下範例顯示的憑證存取邊界包含多個值區的規則:
- Cloud Storage 值區
example-bucket-1
:這個值區只能使用「Storage 物件檢視者」角色 (roles/storage.objectViewer
) 的權限。 - Cloud Storage 值區
example-bucket-2
:這個值區只能使用「Storage 物件建立者」角色 (roles/storage.objectCreator
) 的權限。
{
"accessBoundary": {
"accessBoundaryRules": [
{
"availablePermissions": [
"inRole:roles/storage.objectViewer"
],
"availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-1"
},
{
"availablePermissions": [
"inRole:roles/storage.objectCreator"
],
"availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-2"
}
]
}
}
限制特定物件的權限
您也可以使用 IAM 條件,指定主體可存取的 Cloud Storage 物件。舉例來說,您可以新增條件,讓名稱開頭為 customer-a
的物件可使用權限:
{ "accessBoundary": { "accessBoundaryRules": [ { "availablePermissions": [ "inRole:roles/storage.objectViewer" ], "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket", "availabilityCondition": { "expression" : "resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a')" } } ] } }
列出物件時限制權限
列出 Cloud Storage 值區中的物件時,您是在呼叫值區資源的方法,而非物件資源。因此,如果系統評估清單要求的條件,且條件參照資源名稱,則資源名稱會識別值區,而非值區內的物件。舉例來說,當您列出 example-bucket
中的物件時,資源名稱為 projects/_/buckets/example-bucket
。
如果您列出物件,這個命名慣例可能會導致非預期的行為。舉例來說,假設您想要建立憑證存取權界線,允許檢視存取 example-bucket
中前置字串為 customer-a/invoices/
的物件。您可以在憑證存取權範圍中嘗試使用下列條件:
不完整:只檢查資源名稱的條件
resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/')
這項條件適用於讀取物件,但不適用於列出物件:
- 如果主體嘗試讀取
example-bucket
中含有customer-a/invoices/
前置字元的物件,條件會評估為true
。 - 當主體嘗試列出具有該前置字串的物件時,條件會評估為
false
。resource.name
的值為projects/_/buckets/example-bucket
,開頭不是projects/_/buckets/example-bucket/objects/customer-a/invoices/
。
為避免發生這個問題,除了使用 resource.name.startsWith()
之外,條件也可以檢查名為 storage.googleapis.com/objectListPrefix
的 API 屬性。這個屬性包含用於篩選物件清單的 prefix
參數值。因此,您可以編寫參照 prefix
參數值的條件。
以下範例說明如何在條件中使用 API 屬性。可讀取和列出 example-bucket
中具有前置字串 customer-a/invoices/
的物件:
完成:檢查資源名稱和前置字串的條件
resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/') || api.getAttribute('storage.googleapis.com/objectListPrefix', '') .startsWith('customer-a/invoices/')
您現在可以在憑證存取權範圍中使用這項條件:
{
"accessBoundary": {
"accessBoundaryRules": [
{
"availablePermissions": [
"inRole:roles/storage.objectViewer"
],
"availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket",
"availabilityCondition": {
"expression":
"resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/') || api.getAttribute('storage.googleapis.com/objectListPrefix', '').startsWith('customer-a/invoices/')"
}
}
]
}
}
後續步驟
- 瞭解如何建立範圍縮減的短期憑證。
- 瞭解 Cloud Storage 的存取權控管機制。
- 請參閱每個預先定義角色中的權限。
- 瞭解自訂角色。