Cloud Storage 的憑證存取權界線

本頁說明憑證存取權界線,您可以使用這項功能縮減或限制短期憑證可用的 Identity and Access Management (IAM) 權限,藉此控管憑證對 Cloud Storage 資源的存取權。

憑證存取邊界僅適用於 Cloud Storage。其他服務不支援這項功能。Google Cloud

您可以使用憑證存取範圍產生 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 bucket 完整資源名稱。使用格式 //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 存取權杖換成範圍縮減的權杖時,就會使用憑證存取邊界。

限制 bucket 的權限

以下範例顯示簡單的憑證存取權界線。這項政策適用於 Cloud Storage bucket example-bucket,並將上限設為 Storage 物件檢視者角色 (roles/storage.objectViewer) 包含的權限:

{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket"
      }
    ]
  }
}

限制多個 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 bucket 中的物件時,您是在 bucket 資源上呼叫方法,而不是在物件資源上呼叫。因此,如果系統評估清單要求的條件,且條件參照資源名稱,則資源名稱會識別值區,而非值區內的物件。舉例來說,當您列出 example-bucket 中的物件時,資源名稱為 projects/_/buckets/example-bucket

如果使用這個命名慣例,列出物件時可能會發生非預期的行為。舉例來說,假設您想要建立憑證存取邊界,允許檢視前置字元為 customer-a/invoices/example-bucket 物件。您可以在憑證存取權範圍中嘗試使用下列條件:

不完整:只檢查資源名稱的條件

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/')"
        }
      }
    ]
  }
}

限制資料夾權限

如果 bucket 啟用階層式命名空間,您可以使用 IAM 條件指定主體可存取的 Cloud Storage 資料夾。

在下列範例中,Storage 物件使用者角色 (roles/storage.objectUser) 的權限適用於資料夾和其中的物件。

{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectUser"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-folder",
        "availabilityCondition": {
          "expression" : "resource.name.startsWith('projects/_/buckets/example-bucket/objects/example-folder') || resource.name.startsWith('projects/_/buckets/example-bucket/folders/example-folder') || api.getAttribute('storage.googleapis.com/objectListPrefix', '').startsWith('{example-folder}')"
        }
      }
    ]
  }
}

後續步驟