Common Expression Language 사용

이 페이지에서는 Common Expression Language(CEL)를 사용하여 CA 풀에서 인증서 발급 정책, 인증서 템플릿, Identity and Access Management(IAM) 조건을 관리하는 방법을 설명합니다.

개요

Common Expression Language(CEL)는 표현식 평가를 위한 공통 시맨틱스를 구현하는 오픈소스 비튜링 완전 언어입니다. Certificate Authority Service는 인증서 발급을 위해 여러 정책 제어를 적용하도록 CEL을 지원합니다.

CA 서비스에 사용할 수 있는 두 가지 CEL 언어는 다음과 같습니다.

  • CA 풀의 인증서 발급 정책 및 인증서 템플릿에서 사용할 수 있는 유연한 언어
  • IAM 조건에 사용할 수 있는 보다 제한적인 언어

인증서 발급 정책 및 인증서 템플릿을 위한 CEL 언어

CA 풀 또는 인증서 템플릿을 만들 때는 인증서 ID 제약조건의 일부로 CEL 표현식을 지정할 수 있습니다. CEL 표현식을 사용하면 주체 및 주체 대체 이름(SAN) 필드를 검증할 수 있습니다.

발급 정책에 대한 자세한 내용은 CA 풀에 인증서 발급 정책 추가를 참조하세요.

인증서 템플릿에 대한 자세한 내용은 인증서 템플릿 및 발급 정책 개요를 참조하세요.

CA 풀 및 인증서 템플릿의 ID 제약조건을 위한 CEL 언어에서는 다음과 같은 변수를 사용해서 주체 및 SAN 필드를 액세스하고 검증할 수 있습니다.

  • 제목: subject
  • SAN: subject_alt_names

주체

유형이 Subject이고 이름이 subject인 변수를 사용해서 인증서 요청에 지정된 대로 인증서의 주체 도메인 이름(공통 이름 포함)에서 모든 필드를 검증할 수 있습니다.

Subject는 다음 필드가 포함된 구조체입니다.

유형 이름
String common_name
String country_code
String organization
String organizational_unit
String locality
String province
String street_address
String postal_code

주체 대체 이름(SAN)

subject_alt_names 변수를 사용하여 인증서 요청에 지정된 대로 모든 SAN을 검증할 수 있습니다. subject_alt_names 변수에는 각 SAN이 SubjectAltName 유형인 SAN 구조체 목록이 포함됩니다.

SubjectAltName은 다음 필드가 포함된 구조체입니다.

유형 이름
String value
[]Int32 oid
Enum type

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 또는 EMAIL 유형인지 확인

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

하나의 커스텀 SAN만 특정 OID를 포함하는지 확인

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 역할 바인딩이 적용되고, 그렇지 않으면 무시됩니다. CA 서비스를 사용하면 CA 풀에 IAM 조건부 바인딩을 추가할 수 있습니다.

IAM 조건은 요청에 대한 컨텍스트 속성 집합을 참조하고 불리언으로 평가되는 CEL 표현식입니다. 사용자는 IAM 정책의 역할 바인딩에 조건을 설정합니다. 이러한 조건은 IAM에 저장되고 평가되어 수행하려는 작업이 허가되었는지 여부를 확인합니다.

IAM 조건에 대한 자세한 내용은 IAM 조건 개요를 참조하세요.

다음 속성은 CEL로 IAM 조건을 평가하는 동안 사용할 수 있습니다.

  • privateca.googleapis.com/subject

    privateca.googleapis.com/subjectapi.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_namesapi.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/templateapi.getAttribute('privateca.googleapis.com/template', '')로 액세스할 수 있습니다.

유형 설명
String 사용된 인증서 템플릿입니다(있는 경우). 형식은 {project_id}/-/{template_id}입니다.

: my-project-pki/-/workload_tls

IAM 조건에 제공된 템플릿 이름이 인증서 요청의 템플릿 이름과 일치해야 합니다. 따라서 CEL 표현식의 privateca.googleapis.com/template 속성에 프로젝트 ID를 제공하는 경우 인증서를 요청할 때 프로젝트 ID를 제공해야 합니다. CEL 표현식에 프로젝트 번호를 제공할 경우 인증서 요청에도 프로젝트 번호를 제공해야 합니다.

표현식 예시

모든 주체의 조직이 'Example'로 설정되었고 국가 코드가 US 또는 UK로 설정되었는지 확인

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'

다음 단계