Infograb logo
로그인 규칙 참조

이 페이지는 로그인 규칙을 지원하는 표현 언어에 대한 세부 정보를 제공합니다.
클러스터에 첫 번째 로그인 규칙을 추가하는 방법에 대해 알아보려면
로그인 규칙 가이드를 확인하세요.

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 타입

설명

dictstring 키에서 set 값으로 매핑되는 사전 타입입니다.
로그인 규칙 표현식이 external.<trait> 또는 external[<trait>] 구문으로 입력 특성에 접근할 때, externaldict 타입의 값입니다.
dict 타입의 값은 표현식 내에서도 구성되고 접근할 수 있습니다.
traits_expression 필드에 사용되는 표현식은 반드시 dict 타입의 값을 반환해야 합니다.

생성자

서명

func dict(pairs ...pair) dict

설명

dict 생성자는 pairs 인수에서 초기 키-값 쌍으로 채워진 새 dict 를 반환합니다.
pairstringset 을 포함해야 합니다.

인수

인수타입설명
pairs...pairdict 를 초기화하는 0개 이상의 키-값 쌍입니다.

반환

타입설명
dict새로 생성된 dict 입니다.

예시

표현식결과
dict(){}
dict(pair("a", set("x", "y"))){"a": ("x", "y")}

접근자

구문예시설명
dict.keyexternal.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 이 없으면 새로 생성됩니다.

인수

인수타입설명
keystring새 값을 추가할 키입니다.
values...stringdict[key]에 추가할 하나 이상의 문자열 값입니다.

반환

타입설명
dict주어진 dict 의 복사본으로, keyvalues 가 추가됩니다.

예시

표현식결과
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...stringdict 에서 제거할 하나 이상의 키입니다.

반환

타입설명
dict주어진 키가 제거된 주어진 dict 의 복사본입니다.

예제

ExpressionResult
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.putdict[key]value 로 설정한 dict 의 복사본을 반환합니다. 주어진 키에 이미 값이 존재하는 경우 덮어씌워집니다.

매개변수

ArgumentTypeDescription
keystring새 값을 설정할 키
valueset주어진 키에 설정할 문자열 집합

반환값

TypeDescription
dictdict[key]value 로 설정된 주어진 dict 의 복사본.

예제

ExpressionResult
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 을 반환합니다.

매개변수

ArgumentTypeDescription
values...string집합을 초기화하기 위한 0개 이상의 문자열.

반환값

TypeDescription
set주어진 값으로 초기화된 새 집합.

예제

ExpressionResult
set()()
set("a", "b", "a")("a", "b")

set.contains

서명

func (set) contains(value) bool

설명

set.contains 는 집합에 value 의 정확한 일치가 포함된 경우 true 를 반환하고, 그렇지 않으면 false 를 반환합니다.

매개변수

ArgumentTypeDescription
valuestring집합에서 확인할 문자열.

반환값

TypeDescription
bool집합에 value 의 정확한 일치가 포함된 경우 true , 그렇지 않으면 false .

예제

ExpressionResult
set("a", "b").contains("a")true
set("a", "b").contains("x")false

set.add

서명

func (set) add(values ...string) set

설명

set.add 는 새로운 values 가 추가된 주어진 집합의 복사본인 새 집합을 반환합니다.

매개변수

ArgumentTypeDescription
values...string집합에 추가할 값들.

반환값

TypeDescription
set주어진 집합의 복사본에 values 가 추가된 새 집합.

예제

ExpressionResult
set("a", "b").add("b", "c")("a", "b", "c")

set.remove

서명

func (set) remove(values ...string) set

설명

set.remove 는 주어진 집합에서 모든 values 를 제거한 새로운 집합을 반환합니다.

인수

인수유형설명
values...string집합에서 제거할 값들입니다.

반환

유형설명
setvalues 가 제거된 주어진 집합의 복사본인 새로운 집합입니다.

예제

결과
set("a", "b").remove("b", "c")("a")

pair 유형

설명

pair 는 모든 유형의 두 값을 담을 수 있습니다.
현재 그 유일한 사용처는 dict 생성자에서 stringset 유형의 키-값 쌍을 담아야 할 때입니다.

생성자

시그니처

func pair(first, second any) pair

설명

pair 생성자는 firstsecond 를 담고 있는 새로운 pair 를 반환합니다.

인수

인수유형설명
firstany모든 유형의 값입니다.
secondany모든 유형의 값입니다.

반환

유형설명
pairfirstsecond 를 담고 있는 새로운 pair 입니다.

예제

결과
pair("logins", set("root", "user")){"logins", ("root", "user")}

option 유형

설명

option 은 오직 choose 에 대한 인수로만 사용될 수 있도록 되어 있습니다.
Boolean 조건을 담고 있으며 이 조건이 참일 경우 choose 표현식에서 반환될 값을 담고 있습니다.

생성자

시그니처

func option(cond bool, value any) option

설명

condvalue 를 담고 있는 새로운 option 을 반환합니다.

인수

인수유형설명
condbooloption 이 선택될 수 있는 Boolean 조건입니다.
valueanyoption 이 선택되었을 때 choose 에서 반환되어야 하는 값입니다.

반환

유형설명
optionchoose 에 인수로 전달될 option 유형입니다.

예제

choose 에 대한 예제를 참조하세요.

헬퍼 함수

strings.upper

시그니처

func strings.upper(input set) set

설명

strings.upper 는 주어진 문자열 집합을 대문자로 변환한 복사본을 반환합니다.

인수

인수유형설명
inputset대문자로 변환할 입력 문자열의 집합입니다.

반환

유형설명
set각 문자열이 대문자로 변환된 input 의 복사본입니다.

예제

결과
strings.upper(set("Alice"))("ALICE")
strings.upper(set("AbCdE", "fGhIj"))("ABCDE", "FGHIJ")

strings.lower

시그니처

func strings.lower(input set) set

설명

strings.lower 는 주어진 문자열 집합을 소문자로 변환한 복사본을 반환합니다.

인수

인수유형설명
inputset소문자로 변환할 입력 문자열의 집합입니다.

반환 값

TypeDescription
set각 문자열이 소문자로 변환된 input 의 복사본

예제

ExpressionResult
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 로 교체됩니다. 매칭은 문자 그대로 이루어지며 정규 표현식을 지원하지 않습니다.

인수

ArgumentTypeDescription
inputset교체가 필요한 입력 문자열의 집합
matchstring교체될 문자 그대로의 부분 문자열
replacementstringmatch 의 모든 인스턴스를 교체할 문자 그대로의 문자열

반환 값

TypeDescription
set각 요소에서 match 의 모든 인스턴스가 replacement 로 교체된 input 의 복사본.

예제

ExpressionResult
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 특성으로 분할할 수 있습니다.

인수

ArgumentTypeDescription
inputset나누어야 하는 입력 문자열의 집합
sepstring문자 그대로의 문자열 구분자

반환 값

TypeDescription
set모든 나눠진 문자열의 합집합

예제

ExpressionResult
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 는 입력 집합의 각 이메일을 그 지역 부분으로 매핑합니다.

인수

ArgumentTypeDescription
inputset입력 이메일의 집합

반환 값

TypeDescription
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.replaceinput 의 각 요소에서 expression 의 모든 일치를 찾아 replacement 로 교체합니다.
표현식과 일치하지 않는 값은 필터링됩니다.
교체는 expression 에서 캡처 그룹의 확장을 지원합니다.
$N 은 N번째 캡처된 그룹을 참조하는 데 사용되며, $1 부터 시작합니다.

인수

인수유형설명
inputset입력 문자열의 집합

반환

유형설명
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 로 평가되면 두 번째 인수가 반환되고, 그렇지 않으면 세 번째 인수가 반환됩니다.

인수

인수유형설명
condbool다음 두 인수 중 어떤 것이 반환되는지를 결정하는 부울 조건입니다.
valueIfTrueanycond 가 true일 때 반환할 값, 모든 유형 가능합니다.
valueIfFalseanycond 가 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 .

반환값

유형설명
anytrue 로 평가되는 조건을 가진 첫 번째 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")
Teleport 원문 보기