憑證存取權範圍總覽

本頁說明憑證存取權界線,可用於downscope或限制短期憑證可用的 Identity and Access Management (IAM) 權限。

您可以使用憑證存取範圍產生 OAuth 2.0 存取權杖,代表服務帳戶,但權限比服務帳戶少。舉例來說,如果某位客戶需要存取您控管的 Cloud Storage 資料,您可以採取下列做法:

  1. 建立可存取您擁有的每個 Cloud Storage bucket 的服務帳戶。
  2. 為服務帳戶產生 OAuth 2.0 存取權杖。
  3. 套用憑證存取邊界,只允許存取包含客戶資料的 bucket。

憑證存取權範圍的運作方式

如要縮小權限範圍,請定義憑證存取權範圍,指定短期憑證可存取的資源,以及每個資源可用的權限上限。接著,您可以建立短期憑證,然後換取符合憑證存取邊界的憑證。

如果您需要為每個工作階段授予主體一組不同的權限,使用憑證存取權界線會比建立多個不同的服務帳戶,並為每個服務帳戶授予一組不同的角色更有效率。

憑證存取權範圍的元件

憑證存取權範圍是包含存取權範圍規則清單的物件。每項規則都包含下列資訊:

  • 規則套用的資源。
  • 該資源可用的權限上限。
  • 選用:進一步限制權限的條件。條件包括:
    • 評估結果為 truefalse 的條件運算式。如果評估結果為 true,系統會允許存取;否則會拒絕存取。
    • 選填:識別條件的標題。
    • 選填:提供條件的詳細說明。

如果將憑證存取權範圍套用至短期憑證,則該憑證只能存取憑證存取權範圍內的資源。其他資源沒有權限。

憑證存取權範圍最多可包含 10 項存取權範圍規則。每個短期憑證只能套用一個憑證存取邊界。

以 JSON 物件表示時,憑證存取邊界包含下列欄位:

欄位
accessBoundary

object

憑證存取權範圍的包裝函式。

accessBoundary.accessBoundaryRules[]

object

要套用至短期憑證的存取權範圍規則清單。

accessBoundary.accessBoundaryRules[].availablePermissions[]

string

這份清單會定義資源可用權限的上限。

每個值都是 IAM 預先定義角色自訂角色的 ID,並以 inRole: 前置字串開頭。例如: inRole:roles/storage.objectViewer。只有這些角色中的權限可用。

accessBoundary.accessBoundaryRules[].availableResource

string

規則適用的 Cloud Storage 值區完整資源名稱。請使用「//storage.googleapis.com/projects/_/buckets/bucket-name」格式。

accessBoundary.accessBoundaryRules[].availabilityCondition

object

(選用步驟) 限制權限僅適用於特定 Cloud Storage 物件的條件。

如果您想為特定物件 (而非 Cloud Storage 值區中的所有物件) 提供權限,請使用這個欄位。

accessBoundary.accessBoundaryRules[].availabilityCondition.expression

string

條件運算式,用於指定可使用權限的 Cloud Storage 物件。

如要瞭解如何在條件運算式中參照特定物件,請參閱resource.name 屬性api.getAttribute("storage.googleapis.com/objectListPrefix")屬性

accessBoundary.accessBoundaryRules[].availabilityCondition.title

string

(選用步驟) 簡短字串,用於識別條件的用途。

accessBoundary.accessBoundaryRules[].availabilityCondition.description

string

(選用步驟) 條件目的的詳細資料。

如需 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
  • 當主體嘗試列出具有該前置字串的物件時,條件會評估為 falseresource.name 的值為 projects/_/buckets/example-bucket,開頭不是 projects/_/buckets/example-bucket/objects/customer-a/invoices/

為避免發生這個問題,除了使用 resource.name.startsWith() 之外,條件也可以檢查名為 storage.googleapis.com/objectListPrefixAPI 屬性。這個屬性包含用於篩選物件清單的 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/')"
        }
      }
    ]
  }
}

後續步驟