인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
로그인 규칙 참조
이 페이지는 로그인 규칙을 지원하는 표현 언어에 대한 세부 정보를 제공합니다.
클러스터에 첫 번째 로그인 규칙을 추가하는 방법에 대해 알아보려면
로그인 규칙 가이드를 확인하세요.
YAML 사양
kind: login_rule
version: v1
metadata:
# name은 클러스터에서 Login Rule의 고유한 이름입니다.
name: example
# expires는 선택 사항이며 배포된 로그인 규칙에 대해서는 일반적으로 설정하지 않아야 하지만,
# 새로운 로그인 규칙을 테스트할 때는 잠재적으로 클러스터에서 잠길 수 있는 것을 방지하기 위해
# 가까운 미래에 만료 시간을 설정하는 것이 유용할 수 있습니다.
# expires: "2023-01-31T00:00:00-00:00"
spec:
# priority는 클러스터 내에서 여러 로그인 규칙의 평가 순서를 정하는 데 사용될 수 있습니다.
#
# 숫자가 낮은 우선 순위를 가진 로그인 규칙이 먼저 적용되고,
# 그 다음으로 증가하는 순서의 우선 순위를 가진 규칙이 적용됩니다. 동점일 경우,
# 같은 우선 순위를 가진 로그인 규칙은 이름의 사전적 정렬에 의해 정렬됩니다.
#
# 기본 값은 0이며 지원되는 범위는 -2147483648에서 2147483647까지 입니다.
# (포함).
priority: 0
# 설정된 경우, traits_map은 클러스터에 로그인하는 모든 사용자의 특성을 결정합니다.
#
# 이것은 키가 최종 특성 키가 되는 정적 문자열이어야 하며, 값은 각 문자열 집합으로 평가되어야 하는
# 조건 표현식 목록입니다. 최종 특성은 해당 특성 키의 모든 조건 표현식으로부터 얻어진 문자열 집합의 합집합으로 설정됩니다.
#
# traits_map은 원하는 특성의 전체 세트를 포함해야 합니다. 여기에서 찾을 수 없는 외부 특성은 사용자의 인증서에 포함되지 않습니다.
#
# traits_map 또는 traits_expression 중 하나만 설정되어야 합니다.
traits_map:
groups:
- external.groups
logins:
- strings.lower(external.username)
# traits_expression은 단일 조건 표현식을 포함하는 문자열로,
# 사전을 평가해야 합니다. 로그인 중 모든 사용자의 특성을 설정합니다.
#
# traits_map 또는 traits_expression 중 하나만 설정되어야 합니다.
traits_expression: |
external.put("logins", strings.lower(external.logins))
traits_map
vs 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
dict에 저장된 들어오는 특성을 수정할 수 있습니다:
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 | "도트" 접근자는 주어진 키에 대한 set 을 반환하거나 해당 키에 값이 없으면 빈 set 을 반환합니다. |
dict["key"] | external["user-name"] | 대괄호 접근자는 "도트" 접근자와 동일한 동작을 하지만, 특별 문자가 포함된 키를 지원합니다. |
dict.add_values
서명
func (dict) add_values(key string, values ...string) dict
설명
dict.add_values
는 주어진 값들이 dict[key]
의 set
에 추가된 복사본의 dict
를 반환합니다.
dict[key]
에 이미 set
이 없으면 새로 생성됩니다.
인수
인수 | 타입 | 설명 |
---|---|---|
key | string | 새 값을 추가할 키입니다. |
values | ...string | dict[key] 에 추가할 하나 이상의 문자열 값입니다. |
반환
타입 | 설명 |
---|---|
dict | 주어진 dict 의 복사본으로, key 에 values 가 추가됩니다. |
예시
표현식 | 결과 |
---|---|
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 의 복사본입니다. |
예제
Expression | Result |
---|---|
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
의 복사본을 반환합니다.
주어진 키에 이미 값이 존재하는 경우 덮어씌워집니다.
매개변수
Argument | Type | Description |
---|---|---|
key | string | 새 값을 설정할 키 |
value | set | 주어진 키에 설정할 문자열 집합 |
반환값
Type | Description |
---|---|
dict | dict[key] 가 value 로 설정된 주어진 dict 의 복사본. |
예제
Expression | Result |
---|---|
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
을 반환합니다.
매개변수
Argument | Type | Description |
---|---|---|
values | ...string | 집합을 초기화하기 위한 0개 이상의 문자열. |
반환값
Type | Description |
---|---|
set | 주어진 값으로 초기화된 새 집합. |
예제
Expression | Result |
---|---|
set() | () |
set("a", "b", "a") | ("a", "b") |
set.contains
서명
func (set) contains(value) bool
설명
set.contains
는 집합에 value
의 정확한 일치가 포함된 경우 true
를 반환하고,
그렇지 않으면 false
를 반환합니다.
매개변수
Argument | Type | Description |
---|---|---|
value | string | 집합에서 확인할 문자열. |
반환값
Type | Description |
---|---|
bool | 집합에 value 의 정확한 일치가 포함된 경우 true , 그렇지 않으면 false . |
예제
Expression | Result |
---|---|
set("a", "b").contains("a") | true |
set("a", "b").contains("x") | false |
set.add
서명
func (set) add(values ...string) set
설명
set.add
는 새로운 values
가 추가된 주어진 집합의 복사본인 새 집합을 반환합니다.
매개변수
Argument | Type | Description |
---|---|---|
values | ...string | 집합에 추가할 값들. |
반환값
Type | Description |
---|---|
set | 주어진 집합의 복사본에 values 가 추가된 새 집합. |
예제
Expression | Result |
---|---|
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 조건을 담고 있으며 이 조건이 참일 경우 choose
표현식에서 반환될 값을 담고 있습니다.
생성자
시그니처
func option(cond bool, value any) option
설명
cond
와 value
를 담고 있는 새로운 option
을 반환합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
cond | bool | 이 option 이 선택될 수 있는 Boolean 조건입니다. |
value | any | 이 option 이 선택되었을 때 choose 에서 반환되어야 하는 값입니다. |
반환
유형 | 설명 |
---|---|
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 | 소문자로 변환할 입력 문자열의 집합입니다. |
반환 값
Type | Description |
---|---|
set | 각 문자열이 소문자로 변환된 input 의 복사본 |
예제
Expression | Result |
---|---|
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
는 문자열 집합에서 부분 문자열 교체를 구현합니다. 반환 값은 input
의 복사본으로, input
의 각 요소에서 찾아낸 match
의 각 부분 문자열 일치가 replacement
로 교체됩니다. 매칭은 문자 그대로 이루어지며 정규 표현식을 지원하지 않습니다.
인수
Argument | Type | Description |
---|---|---|
input | set | 교체가 필요한 입력 문자열의 집합 |
match | string | 교체될 문자 그대로의 부분 문자열 |
replacement | string | match 의 모든 인스턴스를 교체할 문자 그대로의 문자열 |
반환 값
Type | Description |
---|---|
set | 각 요소에서 match 의 모든 인스턴스가 replacement 로 교체된 input 의 복사본. |
예제
Expression | Result |
---|---|
strings.replaceall(set("user-name"), "-", "_") | ("user_name") |
strings.replaceall(set("user-alice", "user-bob"), "user-", "") | ("alice", "bob") |
strings.split
Note
strings.split
도우미는 Teleport v13.3.0에서 도입되었습니다. 모든 Auth
Service 인스턴스는 사용하기 전에 이 버전 이상에서 실행되어야 합니다.
시그니처
func strings.split(input set, separator string) set
설명
strings.split
는 각 요소를 separator
의 각 일치에서 나누고 모든 나눠진 문자열의 합집합을 포함하는 집합을 반환합니다. 이는 IdP가 다중 값을 가진 클레임을 전송할 수 없는 경우 유용할 수 있으며, 이 도우미 함수를 사용한 로그인 규칙은 단일 클레임 값을 여러 값의 Teleport 특성으로 분할할 수 있습니다.
인수
Argument | Type | Description |
---|---|---|
input | set | 나누어야 하는 입력 문자열의 집합 |
sep | string | 문자 그대로의 문자열 구분자 |
반환 값
Type | Description |
---|---|
set | 모든 나눠진 문자열의 합집합 |
예제
Expression | Result |
---|---|
strings.split(set("alice,bob,charlie"), ",") | ("alice", "bob", "charlie") |
strings.split(set("devs security"), " ") | ("devs", "security") |
email.local
Note
email.local
도우미는 Teleport v13.3.0에서 도입되었습니다. 모든 Auth Service
인스턴스는 사용하기 전에 이 버전 이상에서 실행되어야 합니다.
시그니처
func email.local(input set) set
설명
email.local
는 입력 집합의 각 이메일을 그 지역 부분으로 매핑합니다.
인수
Argument | Type | Description |
---|---|---|
input | set | 입력 이메일의 집합 |
반환 값
Type | Description |
---|---|
set | 각 이메일이 그 지역 부분으로 변환된 input 의 복사본입니다. |
예시
식 | 결과 |
---|---|
email.local(set("alice@example.com")) | ("alice") |
email.local(set("Alice <alice@example.com>")) | ("alice") |
regexp.replace
Note
regexp.replace
헬퍼는 Teleport v13.3.0에서 도입되었습니다. 모든 Auth Service
인스턴스는 사용하기 전에 이 버전 이상에서 실행되어야 합니다.
서명
func regexp.replace(input set, expression string, replacement string) set
설명
regexp.replace
는 input
의 각 요소에서 expression
의 모든 일치를 찾아 replacement
로 교체합니다.
표현식과 일치하지 않는 값은 필터링됩니다.
교체는 expression
에서 캡처 그룹의 확장을 지원합니다.
$N
은 N번째 캡처된 그룹을 참조하는 데 사용되며, $1
부터 시작합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
input | set | 입력 문자열의 집합 |
반환
유형 | 설명 |
---|---|
set | 각 문자열의 모든 일치 항목이 replacement 로 교체된 input 의 복사본입니다. |
예시
식 | 결과 |
---|---|
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 | 다음 두 인수 중 어떤 것이 반환되는지를 결정하는 부울 조건입니다. |
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
인수를 반환합니다.
런타임에서 선택할 수 있는 옵션이 없으면 오류를 반환하고 로그인이 성공하지 않습니다.
이 시나리오를 피하기 위해 hardcoded를 true
로 설정한 최종 옵션을 추가하는 것이 좋습니다.
예를 들어 choose(..., option(true, set()))
는 다른 옵션을 선택할 수 없는 경우 빈 집합을 반환합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
options | ...option | 하나 이상의 option . |
반환값
유형 | 설명 |
---|---|
any | true 로 평가되는 조건을 가진 첫 번째 option 인수의 값으로, 모든 유형일 수 있습니다. |
예제
식 | 결과 |
---|---|
choose(option(false, set("x")), option(true, set("y")), option(true, set("z"))) | ("y") |
choose(option(set("a", "b").contains("a"), set("x")), option(true, set("y"))) | ("x") |
union
서명
func union(sets ...set) set
설명
union
은 주어진 집합의 모든 요소의 합집합을 포함하는 새로운 set
을 반환합니다.
인수
인수 | 유형 | 설명 |
---|---|---|
sets | ...set | 합집합을 위한 0개 이상의 집합. |
반환값
유형 | 설명 |
---|---|
set | 모든 주어진 set 의 합집합을 포함하는 새로운 set . |
예제
식 | 결과 |
---|---|
union(set("a"), set("b")) | ("a", "b") |
union(set("a", "b"), set("b", "c")) | ("a", "b", "c") |