인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
프레디케이트 언어
Teleport의 프레디케이트 언어는 동적 구성 리소스에서 필터링 조건을 정의하는 데 사용됩니다.
또한 리소스 목록을 필터링하고 검색하는 쿼리 언어로 사용됩니다.
프레디케이트 언어는 다음과 같은 사용처에 따라 약간 다른 구문을 사용합니다:
역할 리소스에서 allow/deny 규칙의 범위 설정
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") | 목록에서 값의 존재 여부 결정 |
리소스를 필터링하는 다양한 방법에 대한 몇 가지 예시를 확인하세요.
레이블 표현식
Warning
레이블 표현식은 Teleport 버전 13.1.1
부터 사용할 수 있습니다. 모든 Teleport
클러스터 구성 요소는 레이블 표현식을 사용하기 전에 13.1.1
이상으로
업그레이드되어야 합니다. 여기에는 Auth 서비스와 모든 Teleport 에이전트가
포함됩니다.
레이블 표현식은 Teleport 역할에서 사용자 정의 논리를 사용하여 자원에 대한 액세스를 정의하는 데 사용할 수 있습니다.
Access Controls에 대한
참조 페이지
는 레이블 표현식과 그 사용처에 대한 개요를 제공합니다.
레이블 표현식은 다음 필드를 사용할 수 있는 술어 언어를 지원합니다:
필드 | 타입 | 설명 |
---|---|---|
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
| list
의 모든 항목에 대해 re
의 모든 일치를 대체로 교체합니다. | 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
와 일치하는 모든 레이블 키의 집합을 반환합니다. | 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") |