이 페이지는 로그인 규칙을 지원하는 표현 언어에 대한 세부 정보를 제공합니다. 클러스터에 첫 번째 로그인 규칙을 추가하는 방법을 배우려면 로그인 규칙 가이드를 확인하십시오.
YAML 사양
kind: login_rule
version: v1
metadata:
# name은 클러스터 내에서 로그인 규칙의 고유 이름입니다.
name: example
# expires는 선택 사항이며 배포된 로그인 규칙에는 일반적으로 설정하지 않아야 하지만,
# 새로운 로그인 규칙을 테스트할 때 빠른 시간 내에 만료 시간을 설정하는 것이 유용할 수 있습니다
# 잠재적으로 텔레포트 클러스터에서 자신을 잠그는 것을 방지합니다.
# expires: "2023-01-31T00:00:00-00:00"
spec:
# priority는 클러스터 내에서 여러 로그인 규칙의 평가 순서를 정하는 데 사용될 수 있습니다.
#
# 우선순위 번호가 낮은 로그인 규칙이 먼저 적용되며, 그 다음은 우선순위가 증가하는 순서로 적용됩니다.
# 동점의 경우, 동일한 우선순위를 가진 로그인 규칙은 이름의 사전 정렬로 정렬됩니다.
#
# 기본값은 0이며, 지원되는 범위는 -2147483648에서 2147483647까지
# (포함)입니다.
priority: 0
# 설정된 경우, traits_map은 클러스터에 로그인하는 모든 사용자의 특성을 결정합니다.
#
# 이것은 YAML 맵으로, 키는 최종 특성 키가 될 정적 문자열이어야 하며,
# 값은 각각 문자열 집합으로 평가해야 하는 여러 프레디케이트 표현식 목록입니다.
# 최종 특성은 해당 특성 키의 모든 프레디케이트 표현식의 결과 문자열 집합의 합집합으로 설정됩니다.
#
# traits_map은 원하는 특성의 전체 집합을 포함해야 합니다. 여기서 찾을 수 없는 외부
# 특성은 사용자의 인증서에 포함되지 않습니다.
#
# traits_map 또는 traits_expression 중 하나는 반드시 설정되어야 합니다.
traits_map:
groups:
- external.groups
logins:
- strings.lower(external.username)
# traits_expression은 단일 프레디케이트 표현식을 보유하는 문자열로, 이는 dict로 평가되어야 합니다.
# 이것은 로그인 중 모든 사용자의 특성을 설정합니다.
#
# traits_map 또는 traits_expression 중 하나는 반드시 설정되어야 합니다.
traits_expression: |
external.put("logins", strings.lower(external.logins))
traits_map
대 traits_expression
모든 로그인 규칙 사양은 traits_map
필드 또는 traits_expression
필드 중 하나를 포함해야 합니다.
두 필드 모두 사용자 특성을 변환하는 동일한 목적을 가지고 있습니다.
로직의 차이는 사용 사례에 따라 선호하는 구문에만 국한되며, 모든 traits_map
을 동등한 traits_expression
으로 작성할 수 있습니다.
traits_map
은 특정적으로 포함된 특성 외에 다른 특성을 제거하며,
traits_expression
구문은 특정 특성을 추가하거나 수정할 수 있도록 하여 나머지는 변경되지 않도록 합니다.
traits_map
동작은 필수 특성 몇 가지만 유지하고 나머지를 필터링하려는 경우 유용할 수 있습니다.
우선 순위가 낮은 로그인 규칙이 특성을 설정하면, 해당 특성은 우선 순위가 높은 traits_map
에도 포함되어야 유지됩니다. 예를 들어, 다음 구성은 groups
특성을 수정하지 않고 유지합니다.
traits_map:
groups:
- external["groups"]
traits_map
다음 규칙을 구현하기 위해 traits_map
을 사용하는 예시 로그인 규칙입니다:
groups: devs
특성을 가진 모든 사용자에게 추가 특성access: [staging]
을 제공해야 합니다.groups: admins
특성을 가진 모든 사용자에게 추가 특성access: [staging, prod]
을 제공해야 합니다.- 모든 사용자에게 자신의 수신
username
특성이 소문자로 변환된logins
특성을 제공해야 합니다. groups
,logins
및access
를 제외한 모든 특성은 필터링됩니다.
kind: login_rule
version: v1
metadata:
name: my_expression_rule
spec:
priority: 0
traits_map:
# groups 특성은 수정하지 않고 복사됩니다. 변경되지 않아야 하는 모든
# 특성에 대해 동일하게 수행하십시오. 여기에서 생략된 모든 특성은
# 사용자에게 설정되지 않으며 역할 매핑에 사용되지 않습니다.
groups:
- external["groups"]
# logins 특성은 username 특성을 소문자로 변환하여 설정됩니다.
logins:
- 'strings.lower(external.username)'
# access 특성은 수신된 groups 특성에 따라 조건부로 결정됩니다.
access:
- 'ifelse(external.groups.contains("devs"), set("staging"), set())'
- 'ifelse(external.groups.contains("admins"), set("staging", "prod"), set())'
traits_expression
위 예제와 동일한 규칙을 구현하는 traits_expression
필드를 사용하는 로그인 규칙 예시입니다:
kind: login_rule
version: v1
metadata:
name: my_expression_rule
spec:
priority: 0
traits_expression: |
dict(
pair("groups", external.groups),
pair("logins", strings.lower(external.username)),
pair("access",
choose(
option(external.groups.contains("devs"), set("staging")),
option(external.groups.contains("admins"), set("staging", "prod")),
option(true, set()),
),
),
)
모든 traits 표현식은 출력 특성의 전체 집합으로 사용될 dict
유형의 값을 반환해야 합니다.
위와 같이 dict
를 처음부터 구성할 수 있으며, 다음과 같이 external
사전에 저장된 수신 특성에 대해 수정을 할 수도 있습니다:
kind: login_rule
version: v1
metadata:
name: uppercase_logins
spec:
priority: 0
# 이 예제 표현식은 "logins" 특성을 소문자로 변환한
# 제외되고 수정되지 않은 모든 수신 특성을 반환합니다.
traits_expression: |
external.put("logins", strings.lower(external.logins))
dict
유형
설명
dict
는 string
키를 set
값으로 매핑하는 딕셔너리 유형입니다.
로그인 규칙 표현식이 external.<trait>
또는 external[<trait>]
구문을 사용하여 입력 특성에 접근할 때, external
은 dict
유형의 값입니다.
유형이 dict
인 값은 표현식 내에서 구성되고 접근될 수 있습니다.
traits_expression
필드에 사용되는 표현식은 반드시 dict
유형의 값을 반환해야 합니다.
생성자
시그니처
func dict(pairs ...pair) dict
설명
dict
생성자는 pairs
인수의 초기 키-값 쌍으로 채워진 새로운 dict
를 반환합니다.
각 pair
는 string
과 set
을 포함해야 합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
pairs | ...pair | dict 를 초기화하는 키-값 쌍의 0개 이상. |
반환
유형 | 설명 |
---|---|
dict | 새로 생성된 dict . |
예시
표현식 | 결과 |
---|---|
dict() | {} |
dict(pair("a", set("x", "y"))) | {"a": ("x", "y")} |
접근자
구문 | 예시 | 설명 |
---|---|---|
dict.key | external.username | "dot" 접근자는 주어진 키에 대한 set 을 반환하거나 해당 키에 대한 값이 없으면 빈 set 을 반환합니다. |
dict["key"] | external["user-name"] | 대괄호 접근자는 "dot" 접근자와 동일한 동작을 하지만, 구문 분석을 위해 인용해야 하는 특수 문자가 포함된 키를 지원합니다. |
dict.add_values
시그니처
func (dict) add_values(key string, values ...string) dict
설명
dict.add_values
는 주어진 값이 dict[key]
의 집합에 추가된 dict
의 복사본을 반환합니다.
dict[key]
에 이미 값이 없으면 새 집합이 생성됩니다.
인수
인수 | 유형 | 설명 |
---|---|---|
key | string | 새 값을 추가할 키. |
values | ...string | dict[key] 에 추가할 하나 이상의 문자열 값. |
반환
유형 | 설명 |
---|---|
dict | 주어진 dict 의 복사본과 key 의 값이 추가된 것입니다. |
예시
표현식 | 결과 |
---|---|
dict().add_values("logins", "ubuntu", "ec2-user") | {"logins": ("ubuntu", "ec2-user")} |
dict(pair("a", set("x"))).add_values("a", "y", "z") | {"a": ("x", "y", "z")} |
dict.remove
시그니처
func (dict) remove(keys ...string) dict
설명
dict.remove
는 주어진 키가 제거된 dict
의 복사본을 반환합니다.
주어진 키가 dict
에 존재하지 않으면 영향을 주지 않습니다.
인수
인수 | 유형 | 설명 |
---|---|---|
keys | ...string | dict 에서 제거할 하나 이상의 키. |
반환
유형 | 설명 |
---|---|
dict | 주어진 키가 제거된 dict 의 복사본입니다. |
예시
표현식 | 결과 |
---|---|
dict(pair("a", set("x"))).remove("a", "b") | {} |
dict(pair("a", set("x")), pair("b", set("c"))).remove("b") | {"a": ("x")} |
dict.put
시그니처
func (dict) put(key string, value set) dict
설명
dict.put
는 dict[key]
에 value
를 설정한 dict
의 복사본을 반환합니다.
주어진 키에 대한 값이 이미 있으면 덮어 씌워집니다.
인수
인수 | 유형 | 설명 |
---|---|---|
key | string | 새 값을 설정할 키 |
value | set | 주어진 키에 설정할 문자열의 집합 |
반환
유형 | 설명 |
---|---|
dict | 주어진 dict 의 복사본과 dict[key] 가 value 로 설정됩니다. |
예시
표현식 | 결과 |
---|---|
dict(pair("a", set("x"))).put("a", set("y")) | {"a": ("y")} |
dict().put("b", set("z")) | {"b": ("z")} |
set
유형
설명
set
은 고유한 문자열의 집합을 보유합니다.
생성자
시그니처
func set(values ...string) set
설명
set
생성자는 주어진 values
로 초기화된 새 set
을 반환합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
values | ...string | 집합을 초기화하기 위한 0개 이상의 문자열. |
반환
유형 | 설명 |
---|---|
set | 주어진 값으로 초기화된 새 집합. |
예시
표현식 | 결과 |
---|---|
set() | () |
set("a", "b", "a") | ("a", "b") |
set.contains
시그니처
func (set) contains(value) bool
설명
set.contains
는 집합에 value
의 정확한 일치가 포함되어 있으면 true
를 반환하고, 그렇지 않으면 false
를 반환합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
value | string | 집합에서 확인할 문자열. |
반환
유형 | 설명 |
---|---|
bool | value 의 정확한 일치가 집합에 포함되어 있으면 true , 그렇지 않으면 false . |
예시
표현식 | 결과 |
---|---|
set("a", "b").contains("a") | true |
set("a", "b").contains("x") | false |
set.add
시그니처
func (set) add(values ...string) set
설명
set.add
는 새 values
가 추가된 주어진 집합의 복사본을 반환합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
values | ...string | 집합에 추가할 값. |
반환
유형 | 설명 |
---|---|
set | 주어진 집합의 복사본과 values 가 추가된 것입니다. |
예시
표현식 | 결과 |
---|---|
set("a", "b").add("b", "c") | ("a", "b", "c") |
set.remove
시그니처
func (set) remove(values ...string) set
설명
set.remove
는 모든 values
가 제거된 주어진 집합의 복사본을 반환합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
values | ...string | 집합에서 제거할 값. |
반환
유형 | 설명 |
---|---|
set | 주어진 집합의 복사본과 모든 values 가 제거된 것입니다. |
예시
표현식 | 결과 |
---|---|
set("a", "b").remove("b", "c") | ("a") |
pair
유형
설명
pair
는 두 값의 유형을 담을 수 있습니다.
현재는 dict
생성자에서 키-값 쌍을 string
과 set
유형으로 담는 데만 사용됩니다.
생성자
시그니처
func pair(first, second any) pair
설명
pair
생성자는 first
와 second
를 담는 새로운 pair
를 반환합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
first | any | 어떠한 유형의 값. |
second | any | 어떠한 유형의 값. |
반환
유형 | 설명 |
---|---|
pair | first 와 second 를 담고 있는 새로운 pair . |
예시
표현식 | 결과 |
---|---|
pair("logins", set("root", "user")) | {"logins", ("root", "user")} |
option
유형
설명
option
은 choose
에서 인수로만 사용되도록 설계되었습니다.
Boolean 조건을 담고 있으며, 해당 option
이 선택될 경우 반환할 값을 담고 있습니다.
생성자
시그니처
func option(cond bool, value any) option
설명
조건 cond
와 값 value
를 담는 새로운 option
을 반환합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
cond | bool | 이 option 이 선택될 수 있는 Boolean 조건. |
value | any | 이 option 이 선택되면 반환되어야 할 값. |
반환
유형 | 설명 |
---|---|
option | choose 에 인수로 전달되어야 하는 option 유형입니다. |
예시
choose
의 예시를 참조하십시오.
헬퍼 함수
strings.upper
시그니처
func strings.upper(input set) set
설명
strings.upper
는 주어진 문자열 세트를 대문자로 변환한 복사본을 반환합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
input | set | 대문자로 변환할 입력 문자열의 집합입니다. |
반환
유형 | 설명 |
---|---|
set | 대문자로 변환된 각 문자열을 포함하는 input 의 복사본입니다. |
예시
표현식 | 결과 |
---|---|
strings.upper(set("Alice")) | ("ALICE") |
strings.upper(set("AbCdE", "fGhIj)) | ("ABCDE", "FGHIJ") |
strings.lower
시그니처
func strings.lower(input set) set
설명
strings.lower
는 주어진 문자열 세트를 소문자로 변환한 복사본을 반환합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
input | set | 소문자로 변환할 입력 문자열의 집합입니다. |
반환
유형 | 설명 |
---|---|
set | 소문자로 변환된 각 문자열을 포함하는 input 의 복사본입니다. |
예시
표현식 | 결과 |
---|---|
strings.lower(set("Alice")) | ("alice") |
strings.lower(set("AbCdE", "fGhIj)) | ("abcde", "fghij") |
strings.replaceall
시그니처
func strings.replaceall(input set, match string, replacement string) set
설명
strings.replaceall
은 문자열 집합에서 부분 문자열을 대체합니다.
반환 값은 각 요소에서 match
의 모든 부분 문자열 일치를 replacement
로 대체한 input
의 복사본입니다.
일치는 문자 그대로이며 정규 표현식을 지원하지 않습니다.
인수
인수 | 유형 | 설명 |
---|---|---|
input | set | 대체가 필요한 입력 문자열의 집합입니다. |
match | string | 대체될 부분 문자열입니다. |
replacement | string | 모든 match 인스턴스를 대체할 문자열입니다. |
반환
유형 | 설명 |
---|---|
set | 각 input 요소에서 match 의 모든 인스턴스가 replacement 로 대체된 복사본입니다. |
예시
표현식 | 결과 |
---|---|
strings.replaceall(set("user-name"), "-", "_") | ("user_name") |
strings.replaceall(set("user-alice", "user-bob"), "user-", "") | ("alice", "bob") |
strings.split
strings.split
헬퍼는 Teleport v13.3.0에 도입되었습니다. 모든 Auth 서비스 인스턴스는 이 버전 이상에서 실행되어야 사용될 수 있습니다.
시그니처
func strings.split(input set, separator string) set
설명
strings.split
은 input
의 각 요소를 separator
의 각 일치 지점에서 분할하고 모든 분할된 문자열의 집합을 반환합니다.
IdP가 다중 값 클레임을 전달할 수 없는 경우, 이 헬퍼 함수를 사용하여 단일 클레임 값을 여러 값으로 분할할 수 있습니다.
인수
인수 | 유형 | 설명 |
---|---|---|
input | set | 분할해야 할 입력 문자열의 집합입니다. |
sep | string | 리터럴 문자열 구분자입니다. |
반환
유형 | 설명 |
---|---|
set | 모든 분할된 문자열의 집합입니다. |
예시
표현식 | 결과 |
---|---|
strings.split(set("alice,bob,charlie"), ",") | ("alice", "bob", "charlie") |
strings.split(set("devs security"), " ") | ("devs", "security") |
email.local
email.local
헬퍼는 Teleport v13.3.0에 도입되었습니다. 모든 Auth 서비스 인스턴스는 이 버전 이상에서 실행되어야 사용될 수 있습니다.
시그니처
func email.local(input set) set
설명
email.local
은 입력 집합의 각 이메일을 로컬 부분으로 매핑합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
input | set | 입력 이메일의 집합입니다. |
반환
유형 | 설명 |
---|---|
set | 각 이메일이 로컬 부분으로 변환된 input 의 복사본입니다. |
예시
표현식 | 결과 |
---|---|
email.local(set("alice@example.com")) | ("alice") |
email.local(set("Alice <alice@example.com>")) | ("alice") |
regexp.replace
regexp.replace
헬퍼는 Teleport v13.3.0에 도입되었습니다. 모든 Auth 서비스 인스턴스는 이 버전 이상에서 실행되어야 사용될 수 있습니다.
시그니처
func regexp.replace(input set, expression string, replacement string) set
설명
regexp.replace
는 입력의 각 요소에서 expression
의 모든 일치를 찾고 replacement
로 대체합니다.
표현식에 대한 일치하지 않는 값은 필터링됩니다.
대체는 캡처 그룹의 확장을 지원합니다.
$N
는 N번째 캡처 그룹을 참조하는 데 사용됩니다.
인수
인수 | 유형 | 설명 |
---|---|---|
input | set | 입력 문자열의 집합입니다. |
반환
유형 | 설명 |
---|---|
set | 각 문자열이 expression 의 모든 일치하는 부분이 replacement 로 대체된 복사본입니다. |
예시
표현식 | 결과 |
---|---|
regexp.replace(set("team-devs"), "^team-(.*)$", "$1") | ("devs") |
regexp.replace(set("team-dev-security"), "^team-(.*)-(.*)$", "$1.$2") | ("dev.security") |
ifelse
시그니처
func ifelse(cond bool, valueIfTrue any, valueIfFalse any) any
설명
ifelse
는 순수 함수적 스타일에서 클래식 if-else 분기를 구현합니다.
첫 번째 인수가 true
로 평가되면 두 번째 인수가 반환되고, 그렇지 않으면 세 번째 인수가 반환됩니다.
인수
인수 | 유형 | 설명 |
---|---|---|
cond | bool | 어떤 Boolean 조건으로, 다음 두 인수 중 하나를 반환합니다. |
valueIfTrue | any | cond 가 true일 때 반환할 값, 어떤 유형이든 가능합니다. |
valueIfFalse | any | cond 가 false일 때 반환할 값, 어떤 유형이든 가능합니다. |
반환
유형 | 설명 |
---|---|
any | 두 번째 또는 세 번째 인수가 반환됩니다. |
예시
표현식 | 결과 |
---|---|
ifelse(set("a", "b").contains("a"), set("x", "y"), set("z")) | ("x", "y") |
ifelse(set("a", "b").contains("c"), set("x", "y"), set("z")) | ("z") |
choose
시그니처
func choose(options ...option) any
설명
choose
는 함수적 스타일의 switch 문을 구현하며, 조건 평가가 true인 첫 번째 option
인수를 반환합니다.
조건에 선택할 수 있는 옵션이 없으면 오류가 반환되고 로그인에 성공하지 않습니다.
이 시나리오를 피하기 위해 기본 옵션을 구현하기 위해 choose(..., option(true, set()))
와 같이 조건을 하드코딩된 마무리 옵션을 추가하는 것이 좋습니다. 이 경우 다른 옵션이 선택될 수 없으면 빈 집합을 반환합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
options | ...option | 하나 이상의 option . |
반환
유형 | 설명 |
---|---|
any | true 로 평가된 첫 번째 option 인수의 값. |