Cloud IAM Conditions 總覽

簡介

本頁說明 Cloud Identity and Access Management (Cloud IAM) 的 Conditions 功能。這項功能可讓您針對 Google Cloud Platform (GCP) 資源定義和強制執行以屬性為基礎的條件式存取權控管。

使用 Cloud IAM Conditions 功能,您可以選擇僅在符合設定的條件時才將權限授予那些身分 (成員)。舉例來說,這樣做可以在發生生產問題時,為使用者設定暫時的存取權,或者僅限位於總部辦公室的員工才有資源的存取權。

條件可在資源的 Cloud IAM 政策的角色繫結中指定。當條件存在時,只有在條件運算式評估為 true 時才會授予該角色。每個條件運算式都定義為一組邏輯陳述式,可讓您指定一或多個要檢查的屬性。

申請非公開 Beta 版

就目前而言,如要使用 Cloud IAM Conditions,您必須取得使用非公開 Beta 版的資格。如要申請,請填寫這份表單

包含條件的 Cloud IAM 政策

Cloud IAM 政策由一或多個角色繫結組成,其結構如下:

"bindings": [
  {
    "role": ...
    "members": ...
    "condition": ...
  },
  ...
]

condition 為選用物件,每個角色繫結只能包含一個。但是,條件運算式可以包含多個用於評估許多不同屬性的陳述式。系統一律會將不含 condition 物件的角色繫結授予指定的成員,因為不需要進行條件檢查。condition 物件的結構如下:

"condition": {
    "title": ...
    "description": ...
    "expression": ...
}

該條件的 title 為必要項目,但 description 則為選用項目。標題和說明都是僅供參考的資訊欄位,可協助您識別和描述條件。expression 欄位可使用部分一般運算語言 (CEL) 來定義以屬性為基礎的邏輯運算式。詳情請參閱 CEL 規格與相關語言定義說明頁面。

一般而言,條件運算式由一或多個使用邏輯運算子 (&&||!) 聯結在一起的子句組成。每個子句表示以屬性為基礎的控制規則,適用於該項繫結。

條件屬性

對此非公開 Beta 版而言,支援的條件屬性不是以要求資源為依據 (例如其類型或名稱),就是以要求詳細資料為依據 (例如其時間戳記、原始 IP 位址或目標運算執行個體的目的地 IP 位址)。以下是這兩種屬性類型的範例和說明。

資源屬性

資源屬性會根據存取要求中的資源提供限制,例如資源類型、資源名稱或正在使用的 GCP 服務。

運算式範例

允許存取運算執行個體,但不允許存取其他類型的資源:

resource.type == “google.cloud.compute.Instance”

允許存取 Cloud Storage 資源,但不允許存取其他服務的資源:

resource.service == “google.cloud.storage”

僅允許存取名稱開頭為指定字串的資源:

resource.name.startsWith("projects/_/buckets/exampleco-site-assets-")

要求屬性

要求屬性會根據存取要求的相關詳細資料提供限制,例如其日期/時間、預期的網址主機/路徑 (適用於 Cloud IAP)、目的地 IP 位址和通訊埠 (適用於 Cloud IAP TCP Tunneling) 或存取層級。存取層級衍生自機構的設定,目前允許對許可的原始 IP 位址進行限制。詳情請參閱 Access Context Manager 說明文件

日期/時間運算式範例

暫時允許存取,直到指定的到期日期/時間為止:

request.time < timestamp("2019-01-01T07:00:00Z")

僅允許在指定的工作時段內存取:

request.time.getHours("Europe/Berlin") >= 9 &&
request.time.getHours("Europe/Berlin") <= 17 &&
request.time.getDayOfWeek("Europe/Berlin") >= 1 &&
request.time.getDayOfWeek("Europe/Berlin") <= 5

僅允許在指定的月份和年份存取:

request.time.getFullYear("Europe/Berlin") == 2018
request.time.getMonth("Europe/Berlin") < 6

有效格式包括:

網址主機/路徑運算式範例 (適用於 Cloud IAP)

僅允許存取要求中的某些子網域或 URL 路徑:

request.host == "hr.example.com"
request.host.endsWith(".example.com")
request.path == "/admin/payroll.js"
request.path.startsWith("/admin")

目的地 IP/通訊埠運算式範例 (適用於 Cloud IAP for TCP Tunneling)

允許存取要求中的某個目的地 IP 或通訊埠:

destination.ip == "14.0.0.1"
destination.ip != "127.0.0.1"
destination.port == 22
destination.port > 21 && destination.port <= 23

存取層級運算式範例

只有在要求符合客戶定義的存取層級時才允許存取;在這種情況下,公司網路的 IP 範圍可在「TrustedCorpNet」存取層級中指定:

"accessPolicies/199923665455/accessLevels/TrustedCorpNet" in
request.auth.access_levels

包含不同屬性的運算式範例

如果要求是在特定時段發出、符合資源名稱前置字串、具有所需的存取層級,並且是針對特定資源類型,則允許存取:

request.time > timestamp("2018-08-03T16:00:00-07:00") &&
request.time < timestamp("2018-08-03T16:05:00-07:00") &&
((resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/dev") ||
 (resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/prod") &&
  "accessPolicies/34569256/accessLevels/CorpNetwork2" in request.auth.access_levels)) ||
 resource.type != "google.cloud.compute.Instance")

如何設定條件

如要設定條件式角色繫結,您可以透過用於設定任何其他角色繫結的同一個 setIamPolicy 方法來進行設定。舉例來說,如要在專案中設定包含條件的角色繫結,您可以使用 REST APIgcloud 指令列工具Cloud Console 中的「IAM」頁面

以下 JSON 範例示範了完整的 Cloud IAM 政策中的條件:

{
  "bindings": [
    {
      "role": "roles/storage.objectViewer",
      "members": "user:jane@example.com",
      "condition": {
          "title": "expires_end_of_2018",
          "description": "Expires at midnight on 2018-12-31",
          "expression": "request.time < timestamp(\"2019-01-01T00:00:00Z\")"
      }
    }
  ]
}