使用一般運算語言

本頁說明如何在 CA 集區中,搭配憑證核發政策、憑證範本和 Identity and Access Management (IAM) 條件使用通用運算式語言 (CEL)。

總覽

一般運算語言 (CEL) 是一種開放原始碼的非圖靈完備語言,可實作運算式評估的常見語意。憑證授權單位服務支援 CEL,可針對憑證核發作業強制執行各種政策控管。

您可以使用兩種 CEL 方言搭配 CA 服務:

  • 彈性方言,可用於 CA 集區的憑證核發政策和憑證範本。
  • 可用於 IAM 條件的方言較為受限。

憑證核發政策和憑證範本的 CEL 方言

建立 CA 集區或憑證範本時,您可以指定 CEL 運算式做為憑證身分限制的一部分。您可以使用 CEL 運算式驗證「主體」和「主體別名」(SAN) 欄位。

如要進一步瞭解核發政策,請參閱「新增憑證核發政策」一文。

如要進一步瞭解憑證範本,請參閱「政策控制項總覽」。

CA 集區和憑證範本的身分限制 CEL 方言會公開下列變數,用於存取及驗證主體和 SAN 欄位:

  • 主旨:subject
  • SAN:subject_alt_names

主旨

您可以使用 Subject 類型和 subject 名稱的變數,驗證憑證主體網域名稱中的所有欄位 (包括通用名稱),如憑證要求中所指定。

Subject 是一種結構,包含下列欄位:

類型 名稱
String common_name
String country_code
String 組織
String organizational_unit
String 縣市
String
String street_address
String postal_code

主體別名 (SAN)

您可以使用 subject_alt_names 變數,驗證憑證要求中指定的所有 SAN。subject_alt_names 變數包含 SAN struct 清單,每個 SAN 的類型都是 SubjectAltName

SubjectAltName 是包含下列欄位的結構體:

類型 名稱
String
[]Int32 oid
Enum 類型

你可以為 SubjectAltName 類型使用下列值:

  • DNS
  • URI
  • EMAIL
  • IP_ADDRESS
  • CUSTOM

subject_alt_names 變數包含所有要求的 SAN 清單。

您可以在 SAN 上使用下列巨集:

  • subject_alt_names.all(san, predicate)
  • subject_alt_names.exists(san, predicate)
  • subject_alt_names.exists_one(san, predicate)
  • subject_alt_names.filter(san, predicate)

如要進一步瞭解巨集,請參閱「語言定義:巨集」。

運算式範例

確保特定通用名稱和一組國家/地區

subject.common_name == "google.com" && (subject.country_code == "US" || subject.country_code == "IR")

確保所有 DNS 名稱都以自訂字串結尾

subject_alt_names.all(san, san.type == DNS && san.value.endsWith(".test.com"))

確保所有 SAN 都是 DNS 或電子郵件類型

subject_alt_names.all(san, san.type == DNS || san.type == EMAIL )

確保只有一個具有特定 OID 的自訂 SAN

subject_alt_names.size() == 1 && subject_alt_names[0].oid == [1, 2, 3, 5, 17]

確保自訂 SAN 僅為一組 OID

subject_alt_names.all(san, san.oid == [1, 2, 4, 5, 55] || san.oid == [1, 2, 4, 5, 54])

IAM 政策的 CEL 方言

使用 IAM 條件,讓 IAM 角色繫結受條件運算式限制。如果條件評估結果為 true,則 IAM 角色繫結會生效,否則會遭到忽略。憑證授權單位服務可讓您將 IAM 條件式繫結新增至 CA 集區。

IAM 條件是 CEL 運算式,會參照一組與要求相關的內容屬性,並評估為布林值。使用者會在 IAM 政策的角色繫結中設定條件,而 IAM 會儲存並評估這些條件,判斷是否允許即將執行的作業。

如要進一步瞭解 IAM 條件,請參閱「IAM 條件總覽」。

在評估 IAM 條件的 CEL 時,會公開下列屬性:

  • privateca.googleapis.com/subject

    privateca.googleapis.com/subject 可做為 api.getAttribute('privateca.googleapis.com/subject', {}) 存取。

類型 說明
map{string, string} 這個欄位包含傳入憑證要求中指定的主體識別名稱 (包括通用名稱)。

範例

{
 'common_name': 'Foobar',
 'organization': 'Example LLC'
 'country_code' :'US'
 'organizational_unit':'Foobar'
 'locality':'Mountain View'
 'Province':'California'
 'street_address':'Foobar 22'
 'postal_code':55555
}
  • privateca.googleapis.com/subject_alt_names

    privateca.googleapis.com/subject_alt_names 可做為 api.getAttribute('privateca.googleapis.com/subject_alt_names', []) 存取。

類型 說明
list{string} 這個欄位包含所有要求的 SAN,如傳入的憑證要求中所指定。每個要求的 SAN 都會加上前置字元,表示其類型。類型不明的 SAN 會以類型序列化的 OID 為前置字元。

範例

{
 'dns:foo.bar.com',
 'uri:spiffe://foo/ns/bar/sa/baz'
 'email:foo@bar.com'
 'ip:169.169.254.254'
 'custom:1.2.3.4.5.6.3:foobar'
}
  • privateca.googleapis.com/template

    privateca.googleapis.com/template 可做為 api.getAttribute('privateca.googleapis.com/template', '') 存取。

類型 說明
String 使用的憑證範本 (如有)。格式為 {project_id}/-/{template_id}

範例my-project-pki/-/workload_tls

範本語法會使用 {project_id}/-/{template_id},而不是標準完整資源名稱 projects/{project_id}/locations/{location}/certificateTemplates/{template_id},因為憑證範本必須與 CA 集區位於相同位置。在這個格式中,連字號 (-) 可做為位置萬用字元,讓 CEL 條件保持簡潔、易讀,且與位置無關。

IAM 條件中提供的範本名稱,必須與憑證要求中的範本名稱相符。因此,如果您在 CEL 運算式的 privateca.googleapis.com/template 屬性中提供專案 ID,要求憑證時也必須提供專案 ID。如果您在 CEL 運算式中提供專案編號,也必須在憑證要求中提供專案編號。

運算式範例

確認所有主體的機構都設為「Example」,且國家/地區代碼設為 USUK

api.getAttribute('privateca.googleapis.com/subject', {})['organization'] == 'Example' &&
api.getAttribute('privateca.googleapis.com/subject', {})['country_code'] in ['US', 'UK']

確保憑證要求只包含指定的 DNS SAN

api.getAttribute('privateca.googleapis.com/subject_alt_names', [])
        .hasOnly(['dns:sample1.prod.example.com', 'dns:sample2.prod.example.com'])

確保所有憑證都使用特定範本

api.getAttribute('privateca.googleapis.com/template', '') == 'my-project-pki/-/leaf-server-tls'

後續步驟