Teleport의 술어 언어는 동적 구성 리소스에서 필터링 조건을 정의하는 데 사용됩니다.
또한 선택된 리소스 목록을 필터링하고 검색하는 쿼리 언어로도 사용됩니다.
술어 언어는 사용되는 위치에 따라 약간 다른 구문을 사용합니다:
역할 리소스에서 허용/거부 규칙 스코프 정의
Teleport의 역할 리소스의 일부 필드는 술어 언어를 사용하여 역할의 권한 범위를 정의합니다:
역할 리소스에서 사용될 때, 술어 언어는 다음 연산자를 지원합니다:
연산자 | 의미 | 예시 |
---|---|---|
&& | 그리고 (모든 조건이 일치해야 함) | contains(field1, field2) && equals(field2, "val") |
|| | 또는 (하나의 조건만 일치해야 함) | contains(field1, field2) || contains(field1, "val2") |
! | 아니다 (함수와 함께 사용됨, 아래에서 더 설명) | !equals(field1, field2) |
언어는 또한 다음 함수를 지원합니다:
함수 | 설명 |
---|---|
contains(<field>, <field2>) | <field> 의 문자열 목록에 <field2> 의 값이 포함되어 있는지 확인합니다. |
contains(<field>, "<value>") | <field> 의 문자열 목록에 <value> 가 포함되어 있는지 확인합니다. |
equals(<field>, <field2>) | <field> 의 값이 <field2> 의 값과 같은지 확인합니다. |
equals(<field>, "<value>") | <field> 의 값이 <value> 와 같은지 확인합니다. |
리소스 필터링
tsh
및 tctl
CLI 도구는 --query
플래그를 사용하여 노드, 애플리케이션, 데이터베이스 및 Kubernetes 리소스를 필터링할 수 있습니다. --query
플래그를 사용하면 술어 언어를 사용하여 더 정교한 검색을 수행할 수 있습니다.
일반 리소스 필드에 대해, 다음과 같은 단축 필드 이름이 정의되어 쉽게 접근할 수 있습니다:
단축 필드 | 실제 필드 방정식 | 예시 |
---|---|---|
labels["<key>"] | resource.metadata.labels + resource.spec.dynamic_labels | labels["env"] == "staging" |
name | resource.spec.hostname (서버 리소스에만 적용) 또는 resource.metadata.name | name == "jenkins" |
언어는 다음 연산자를 지원합니다:
연산자 | 의미 | 예시 |
---|---|---|
== | 같다 | labels["env"] == "prod" 또는 labels[`env`] == "prod" |
!= | 같지 않다 | labels["env"] != "prod" |
&& | 그리고 (모든 조건이 일치해야 함) | labels["env"] == "prod" && labels["os"] == "mac" |
|| | 또는 (하나의 조건만 일치해야 함) | labels["env"] == "dev" || labels["env"] == "qa" |
! | 아니다 (함수와 함께 사용됨) | !equals(labels["env"], "prod") |
언어는 또한 다음 함수를 지원합니다:
함수 (예제 포함) | 설명 |
---|---|
equals(labels["env"], "prod") | env 레이블 키가 prod 레이블 값과 같은 리소스 |
exists(labels["env"]) | 레이블 키 env 가 있는 리소스; 레이블 값은 확인되지 않음 |
!exists(labels["env"]) | 레이블 키 env 가 없는 리소스; 레이블 값은 확인되지 않음 |
search("foo", "bar", "some phrase") | 일반 리소스 필드에 대한 퍼지 일치 |
hasPrefix(name, "foo") | 이름이 foo 로 시작하는 리소스 |
split(labels["foo"], ",") | 구분된 문자열을 목록으로 변환 |
contains(split(labels["foo"], ","), "bar") | 목록에 값이 존재하는지 확인 |
다양한 리소스를 필터링하는 방법에 대한 예제를 확인하세요.
레이블 표현식
레이블 표현식은 Teleport 버전 13.1.1
부터 사용 가능합니다.
Teleport 클러스터의 모든 구성 요소는 레이블 표현식을 사용하기 전에 13.1.1
버전 이상으로 업그레이드해야 합니다.
여기에는 인증 서비스 및 모든 Teleport 에이전트가 포함됩니다.
레이블 표현식은 Teleport 역할에서 사용자 정의 논리를 사용하여 리소스에 대한 액세스를 정의하는 데 사용할 수 있습니다.
액세스 제어 참고 페이지를 확인하여 레이블 표현식과 사용 가능한 위치에 대한 개요를 확인하세요.
레이블 표현식은 사용 가능한 다음 필드를 포함하는 술어 언어를 지원합니다:
필드 | 유형 | 설명 |
---|---|---|
labels | map[string]string | 접근하는 리소스(서버, 애플리케이션 등)의 정적 및 동적 레이블의 결합입니다. |
user.spec.traits | map[string][]string | 리소스에 접근하는 사용자의 모든 특성 (역할 템플릿 표현식에서 external 또는 internal 으로 언급됨). |
언어는 다음 함수를 지원합니다:
구문 | 반환 유형 | 설명 | 예시 |
---|---|---|---|
contains(list, item) | Boolean | list 가 item 과 정확히 일치하는 경우 true를 반환합니다. | contains(user.spec.traits[teams], labels["team"]) |
regexp.match(list, re) | Boolean | list 가 re 와 일치하는 경우 true를 반환합니다. | regexp.match(labels["team"], "dev-team-\d+$") |
regexp.replace(list, re, replacement) | []string | 모든 항목에서 re 의 모든 일치를 replacement 로 교체합니다. | contains(regexp.replace(user.spec.traits["allowed-env"], "^env-(.*)$", "$1"), labels["env"]) |
email.local(list) | []string | list 의 각 이메일의 로컬 부분을 반환하거나 이메일 구문 분석에 실패하는 경우 오류를 반환합니다. | contains(email.local(user.spec.traits["email"]), labels["owner"]) |
strings.upper(list) | []string | 목록의 모든 항목을 대문자로 변환합니다. | contains(strings.upper(user.spec.traits["username"]), labels["owner"]) |
strings.lower(list) | []string | 목록의 모든 항목을 소문자로 변환합니다. | contains(strings.lower(user.spec.traits["username"]), labels["owner"]) |
labels_matching(re) | []string | re 와 일치하는 모든 레이블 값의 집계를 반환하며, 여기는 glob 또는 정규 표현식이 될 수 있습니다. | contains(labels_matching("^project-(team|label)$"), "security") |
contains_any(list, items) | Boolean | list 가 items 의 모든 요소와 정확히 일치하는 경우 true를 반환합니다. | contains_any(user.spec.traits["projects"], labels_matching("project-*")) |
contains_all(list, items) | Boolean | list 가 items 의 모든 요소와 정확히 일치하는 경우 true를 반환합니다. | contains_all(user.spec.traits["projects"], labels_matching("project-*")) |
위의 모든 list
라는 이름의 인수는 특정 사용자 특성에 대한 값 목록 또는 리소스 레이블의 값 또는 문자열 리터럴과 같은 단일 값 또는 값 목록을 수용할 수 있습니다.
언어는 다음 연산자를 지원합니다:
연산자 | 의미 | 예시 |
---|---|---|
== | 같다 | labels["env"] == "staging" |
!= | 같지 않다 | labels["env"] != "production" |
|| | 또는 (하나의 조건만 일치해야 함) | labels["env"] == "staging" || labels["env"] == "test" |
&& | 그리고 (모든 조건이 일치해야 함) | labels["env"] == "staging" && labels["team"] == "dev" |
! | 아니다 (논리 부정) | !regexp.match(user.spec.traits["teams"], "contractor") |