Infograb logo
로그인 규칙 참조

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

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_maptraits_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, loginsaccess를 제외한 모든 특성은 필터링됩니다.
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 유형

설명

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"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]에 이미 값이 없으면 새 집합이 생성됩니다.

인수

인수유형설명
keystring새 값을 추가할 키.
values...stringdict[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...stringdict에서 제거할 하나 이상의 키.

반환

유형설명
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.putdict[key]value를 설정한 dict의 복사본을 반환합니다. 주어진 키에 대한 값이 이미 있으면 덮어 씌워집니다.

인수

인수유형설명
keystring새 값을 설정할 키
valueset주어진 키에 설정할 문자열의 집합

반환

유형설명
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를 반환합니다.

인수

인수유형설명
valuestring집합에서 확인할 문자열.

반환

유형설명
boolvalue의 정확한 일치가 집합에 포함되어 있으면 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 생성자에서 키-값 쌍을 stringset 유형으로 담는 데만 사용됩니다.

생성자

시그니처

func pair(first, second any) pair

설명

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

인수

인수유형설명
firstany어떠한 유형의 값.
secondany어떠한 유형의 값.

반환

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

예시

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

option 유형

설명

optionchoose에서 인수로만 사용되도록 설계되었습니다. Boolean 조건을 담고 있으며, 해당 option이 선택될 경우 반환할 값을 담고 있습니다.

생성자

시그니처

func option(cond bool, value any) option

설명

조건 cond와 값 value를 담는 새로운 option을 반환합니다.

인수

인수유형설명
condbooloption이 선택될 수 있는 Boolean 조건.
valueanyoption이 선택되면 반환되어야 할 값.

반환

유형설명
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소문자로 변환할 입력 문자열의 집합입니다.

반환

유형설명
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의 복사본입니다. 일치는 문자 그대로이며 정규 표현식을 지원하지 않습니다.

인수

인수유형설명
inputset대체가 필요한 입력 문자열의 집합입니다.
matchstring대체될 부분 문자열입니다.
replacementstring모든 match 인스턴스를 대체할 문자열입니다.

반환

유형설명
setinput 요소에서 match의 모든 인스턴스가 replacement로 대체된 복사본입니다.

예시

표현식결과
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 서비스 인스턴스는 이 버전 이상에서 실행되어야 사용될 수 있습니다.

시그니처

func strings.split(input set, separator string) set

설명

strings.splitinput의 각 요소를 separator의 각 일치 지점에서 분할하고 모든 분할된 문자열의 집합을 반환합니다. IdP가 다중 값 클레임을 전달할 수 없는 경우, 이 헬퍼 함수를 사용하여 단일 클레임 값을 여러 값으로 분할할 수 있습니다.

인수

인수유형설명
inputset분할해야 할 입력 문자열의 집합입니다.
sepstring리터럴 문자열 구분자입니다.

반환

유형설명
set모든 분할된 문자열의 집합입니다.

예시

표현식결과
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 서비스 인스턴스는 이 버전 이상에서 실행되어야 사용될 수 있습니다.

시그니처

func email.local(input set) set

설명

email.local은 입력 집합의 각 이메일을 로컬 부분으로 매핑합니다.

인수

인수유형설명
inputset입력 이메일의 집합입니다.

반환

유형설명
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 서비스 인스턴스는 이 버전 이상에서 실행되어야 사용될 수 있습니다.

시그니처

func regexp.replace(input set, expression string, replacement string) set

설명

regexp.replace는 입력의 각 요소에서 expression의 모든 일치를 찾고 replacement로 대체합니다. 표현식에 대한 일치하지 않는 값은 필터링됩니다. 대체는 캡처 그룹의 확장을 지원합니다. $N는 N번째 캡처 그룹을 참조하는 데 사용됩니다.

인수

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

반환

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

인수

인수유형설명
condbool어떤 Boolean 조건으로, 다음 두 인수 중 하나를 반환합니다.
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 인수를 반환합니다.

조건에 선택할 수 있는 옵션이 없으면 오류가 반환되고 로그인에 성공하지 않습니다. 이 시나리오를 피하기 위해 기본 옵션을 구현하기 위해 choose(..., option(true, set()))와 같이 조건을 하드코딩된 마무리 옵션을 추가하는 것이 좋습니다. 이 경우 다른 옵션이 선택될 수 없으면 빈 집합을 반환합니다.

인수

인수유형설명
options...option하나 이상의 option.

반환

유형설명
anytrue로 평가된 첫 번째 option 인수의 값.
Teleport 원문 보기