InfoGrab Docs

Kubernetes Operator를 사용하여 로그인 규칙 배포

요약

이 가이드에서는 다음 방법을 설명합니다: 이 가이드는 teleport-cluster Helm 차트를 사용하여 Kubernetes에서 Teleport를 자체 호스팅하는 경우에 적용됩니다. 로그인 규칙(Login Rules)은 Auth Service 백엔드에 저장된 리소스로 Teleport Auth Service에 등록됩니다.

이 가이드에서는 다음 방법을 설명합니다:

  • Teleport의 Kubernetes Operator를 사용하여 Teleport 클러스터에 로그인 규칙(Login Rules) 배포
  • kubectl로 배포된 로그인 규칙 편집

이 가이드는 teleport-cluster Helm 차트를 사용하여 Kubernetes에서 Teleport를 자체 호스팅하는 경우에 적용됩니다.

작동 방식#

로그인 규칙(Login Rules)은 Auth Service 백엔드에 저장된 리소스로 Teleport Auth Service에 등록됩니다. Teleport Auth Service는 로그인 규칙을 포함한 백엔드 리소스를 생성, 삭제 또는 수정할 수 있는 gRPC API를 노출합니다. Teleport Kubernetes Operator는 Teleport Auth Service에 인증하고 gRPC API와 상호작용하여 에이전트 없는 SSH 서비스를 관리할 수 있습니다.

사전 요구사항#

  • Teleport Enterprise 라이선스

  • Kubernetes 클러스터 (teleport-cluster Helm 차트 배포 여부에 관계없음)

  • Helm

  • kubectl

  • 다음 명령을 실행하여 Kubernetes 연결을 확인합니다:

    $ kubectl cluster-info
    # Kubernetes control plane is running at https://127.0.0.1:6443
    # CoreDNS is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    

    Operator를 로컬에서 실험하려는 사용자는 minikube를 사용하여 로컬 Kubernetes 클러스터를 시작할 수 있습니다:

    $ minikube start
    
  • Kubernetes 클러스터에 Teleport Operator를 설치하려면 Teleport operator 가이드를 따르세요. teleport-cluster 차트의 일부로 operator를 배포하는 경우 Enterprise 지침을 따르세요.

    다음 명령으로 로그인 규칙에 대한 CRD (Custom Resource Definition)가 설치되었는지 확인합니다:

    $ kubectl explain TeleportLoginRule.spec
    KIND:     TeleportLoginRule
    VERSION:  resources.teleport.dev/v1
    
    RESOURCE: spec 
    
    DESCRIPTION:
        LoginRule resource definition v1 from Teleport
    
    FIELDS:
      priority     <integer>
        Priority is the priority of the login rule relative to other login rules in
        the same cluster. Login rules with a lower numbered priority will be
        evaluated first.
    
      traits_expression    <string>
        TraitsExpression is a predicate expression which should return the desired
        traits for the user upon login.
    
      traits_map   <>
        TraitsMap is a map of trait keys to lists of predicate expressions which
        should evaluate to the desired values for that trait.
    

    이 명령이 실패하면 Teleport Operator가 설치되지 않았거나 이전 버전이 설치되어 있을 수 있습니다.

1단계/2단계: kubectl을 사용하여 로그인 규칙 생성#

다음 내용을 login-rules.yaml이라는 파일에 붙여넣어 두 개의 사용자 정의 로그인 규칙 리소스를 설명합니다:

# login-rules.yaml
apiVersion: resources.teleport.dev/v1
kind: TeleportLoginRule
metadata:
  name: example-traits-map-rule
  labels:
    example: "true"
spec:
  # The rule with the lowest priority will be evaluated first.
  priority: 0

  # traits_map holds a map of all desired trait keys to lists of expressions
  # that determine the trait values.
  traits_map:

    # The "logins" traits will be set to the external "username" trait converted
    # to lowercase, and any external "logins" trait.
    logins:
      - 'strings.lower(external.username)'
      - 'external.logins'

    # The external "groups" trait will be passed through unchanged, all other
    # traits will be filtered out.
    groups:
      - external.groups
---
apiVersion: resources.teleport.dev/v1
kind: TeleportLoginRule
metadata:
  name: example-traits-expression-rule
  labels:
    example: "true"
spec:
  # This rule has a higher priority value, so it will be evaluated after the
  # "terraform-test-map-rule".
  priority: 1

  # traits_expression is an alternative to traits_map, which returns all desired
  # traits in a single expression.
  traits_expression: |
    external.put("groups",
      choose(
        option(external.groups.contains("admins"), external.groups.add("app-admins", "db-admins")),
        option(external.groups.contains("ops"), external.groups.add("k8s-admins")),
        option(true, external.groups)))

Kubernetes 리소스를 생성합니다:

$ kubectl apply -f login-rules.yaml

생성된 Kubernetes 리소스를 나열합니다:

$ kubectl get loginrules
NAME                             AGE
example-traits-expression-rule   8m8s
example-traits-map-rule          8m8s

Teleport에서 로그인 규칙이 생성되었는지 확인합니다:

$ AUTH_POD=$(kubectl get pods -l app=teleport-cluster -o jsonpath='{.items[0].metadata.name}')
$ kubectl exec -i $AUTH_POD -c teleport -- tctl get login_rules
kind: login_rule
metadata:
  id: 1680225062340767900
  labels:
    example: "true"
    teleport.dev/origin: kubernetes
  name: example-traits-expression-rule
spec:
  priority: 1
  traits_expression: |
    external.put("groups",
      choose(
        option(external.groups.contains("admins"),
external.groups.add("app-admins", "db-admins")),
        option(external.groups.contains("ops"),
external.groups.add("k8s-admins")),
        option(true, external.groups)))
version: v1
---
kind: login_rule
metadata:
  id: 1680225067068319000
  labels:
    example: "true"
    teleport.dev/origin: kubernetes
  name: example-traits-map-rule
spec:
  priority: 0
  traits_map:
    groups:
    - external.groups
    logins:
    - strings.lower(external.username)
    - external.logins
version: v1

tctl login_rule test 명령의 표준 입력에 예시 입력 트레잇을 보내고 클러스터에서 모든 로그인 규칙을 로드하여 로그인 규칙을 테스트합니다.

$ echo '{"groups": ["admins", "ops"], "username": ["Alice"], "logins": ["user", "root"]}' | \
  kubectl exec -i $AUTH_POD -c teleport -- tctl login_rule test --load-from-cluster
groups:
- admins
- ops
- app-admins
- db-admins
logins:
- alice
- user
- root

2단계/2단계: kubectl로 로그인 규칙 편집#

example-traits-map-rule을 편집하여 example 로그인을 추가합니다.

--- a/login-rules.yaml
+++ b/login-rules.yaml
@@ -18,6 +18,7 @@ spec:
     logins:
       - 'strings.lower(external.username)'
       - 'external.logins'
+      - 'example'

     # The external "groups" trait will be passed through unchanged, all other
     # traits will be filtered out.

Kubernetes 리소스에 업데이트를 적용합니다:

$ kubectl apply -f login-rules.yaml

로그인 규칙을 다시 테스트하여 추가된 example 로그인을 확인합니다:

$ echo '{"groups": ["admins", "ops"], "username": ["Alice"], "logins": ["user", "root"]}' | \
  kubectl exec -i $AUTH_POD -c teleport -- tctl login_rule test --load-from-cluster
groups:
- ops
- app-admins
- db-admins
- admins
logins:
- root
- user
- example
- alice

다음 단계#

Kubernetes Operator를 사용하여 로그인 규칙 배포

원문 보기
요약

이 가이드에서는 다음 방법을 설명합니다: 이 가이드는 teleport-cluster Helm 차트를 사용하여 Kubernetes에서 Teleport를 자체 호스팅하는 경우에 적용됩니다. 로그인 규칙(Login Rules)은 Auth Service 백엔드에 저장된 리소스로 Teleport Auth Service에 등록됩니다.

이 가이드에서는 다음 방법을 설명합니다:

  • Teleport의 Kubernetes Operator를 사용하여 Teleport 클러스터에 로그인 규칙(Login Rules) 배포
  • kubectl로 배포된 로그인 규칙 편집

이 가이드는 teleport-cluster Helm 차트를 사용하여 Kubernetes에서 Teleport를 자체 호스팅하는 경우에 적용됩니다.

작동 방식#

로그인 규칙(Login Rules)은 Auth Service 백엔드에 저장된 리소스로 Teleport Auth Service에 등록됩니다. Teleport Auth Service는 로그인 규칙을 포함한 백엔드 리소스를 생성, 삭제 또는 수정할 수 있는 gRPC API를 노출합니다. Teleport Kubernetes Operator는 Teleport Auth Service에 인증하고 gRPC API와 상호작용하여 에이전트 없는 SSH 서비스를 관리할 수 있습니다.

사전 요구사항#

  • Teleport Enterprise 라이선스

  • Kubernetes 클러스터 (teleport-cluster Helm 차트 배포 여부에 관계없음)

  • Helm

  • kubectl

  • 다음 명령을 실행하여 Kubernetes 연결을 확인합니다:

    $ kubectl cluster-info
    # Kubernetes control plane is running at https://127.0.0.1:6443
    # CoreDNS is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    

    Operator를 로컬에서 실험하려는 사용자는 minikube를 사용하여 로컬 Kubernetes 클러스터를 시작할 수 있습니다:

    $ minikube start
    
  • Kubernetes 클러스터에 Teleport Operator를 설치하려면 Teleport operator 가이드를 따르세요. teleport-cluster 차트의 일부로 operator를 배포하는 경우 Enterprise 지침을 따르세요.

    다음 명령으로 로그인 규칙에 대한 CRD (Custom Resource Definition)가 설치되었는지 확인합니다:

    $ kubectl explain TeleportLoginRule.spec
    KIND:     TeleportLoginRule
    VERSION:  resources.teleport.dev/v1
    
    RESOURCE: spec 
    
    DESCRIPTION:
        LoginRule resource definition v1 from Teleport
    
    FIELDS:
      priority     <integer>
        Priority is the priority of the login rule relative to other login rules in
        the same cluster. Login rules with a lower numbered priority will be
        evaluated first.
    
      traits_expression    <string>
        TraitsExpression is a predicate expression which should return the desired
        traits for the user upon login.
    
      traits_map   <>
        TraitsMap is a map of trait keys to lists of predicate expressions which
        should evaluate to the desired values for that trait.
    

    이 명령이 실패하면 Teleport Operator가 설치되지 않았거나 이전 버전이 설치되어 있을 수 있습니다.

1단계/2단계: kubectl을 사용하여 로그인 규칙 생성#

다음 내용을 login-rules.yaml이라는 파일에 붙여넣어 두 개의 사용자 정의 로그인 규칙 리소스를 설명합니다:

# login-rules.yaml
apiVersion: resources.teleport.dev/v1
kind: TeleportLoginRule
metadata:
  name: example-traits-map-rule
  labels:
    example: "true"
spec:
  # The rule with the lowest priority will be evaluated first.
  priority: 0

  # traits_map holds a map of all desired trait keys to lists of expressions
  # that determine the trait values.
  traits_map:

    # The "logins" traits will be set to the external "username" trait converted
    # to lowercase, and any external "logins" trait.
    logins:
      - 'strings.lower(external.username)'
      - 'external.logins'

    # The external "groups" trait will be passed through unchanged, all other
    # traits will be filtered out.
    groups:
      - external.groups
---
apiVersion: resources.teleport.dev/v1
kind: TeleportLoginRule
metadata:
  name: example-traits-expression-rule
  labels:
    example: "true"
spec:
  # This rule has a higher priority value, so it will be evaluated after the
  # "terraform-test-map-rule".
  priority: 1

  # traits_expression is an alternative to traits_map, which returns all desired
  # traits in a single expression.
  traits_expression: |
    external.put("groups",
      choose(
        option(external.groups.contains("admins"), external.groups.add("app-admins", "db-admins")),
        option(external.groups.contains("ops"), external.groups.add("k8s-admins")),
        option(true, external.groups)))

Kubernetes 리소스를 생성합니다:

$ kubectl apply -f login-rules.yaml

생성된 Kubernetes 리소스를 나열합니다:

$ kubectl get loginrules
NAME                             AGE
example-traits-expression-rule   8m8s
example-traits-map-rule          8m8s

Teleport에서 로그인 규칙이 생성되었는지 확인합니다:

$ AUTH_POD=$(kubectl get pods -l app=teleport-cluster -o jsonpath='{.items[0].metadata.name}')
$ kubectl exec -i $AUTH_POD -c teleport -- tctl get login_rules
kind: login_rule
metadata:
  id: 1680225062340767900
  labels:
    example: "true"
    teleport.dev/origin: kubernetes
  name: example-traits-expression-rule
spec:
  priority: 1
  traits_expression: |
    external.put("groups",
      choose(
        option(external.groups.contains("admins"),
external.groups.add("app-admins", "db-admins")),
        option(external.groups.contains("ops"),
external.groups.add("k8s-admins")),
        option(true, external.groups)))
version: v1
---
kind: login_rule
metadata:
  id: 1680225067068319000
  labels:
    example: "true"
    teleport.dev/origin: kubernetes
  name: example-traits-map-rule
spec:
  priority: 0
  traits_map:
    groups:
    - external.groups
    logins:
    - strings.lower(external.username)
    - external.logins
version: v1

tctl login_rule test 명령의 표준 입력에 예시 입력 트레잇을 보내고 클러스터에서 모든 로그인 규칙을 로드하여 로그인 규칙을 테스트합니다.

$ echo '{"groups": ["admins", "ops"], "username": ["Alice"], "logins": ["user", "root"]}' | \
  kubectl exec -i $AUTH_POD -c teleport -- tctl login_rule test --load-from-cluster
groups:
- admins
- ops
- app-admins
- db-admins
logins:
- alice
- user
- root

2단계/2단계: kubectl로 로그인 규칙 편집#

example-traits-map-rule을 편집하여 example 로그인을 추가합니다.

--- a/login-rules.yaml
+++ b/login-rules.yaml
@@ -18,6 +18,7 @@ spec:
     logins:
       - 'strings.lower(external.username)'
       - 'external.logins'
+      - 'example'

     # The external "groups" trait will be passed through unchanged, all other
     # traits will be filtered out.

Kubernetes 리소스에 업데이트를 적용합니다:

$ kubectl apply -f login-rules.yaml

로그인 규칙을 다시 테스트하여 추가된 example 로그인을 확인합니다:

$ echo '{"groups": ["admins", "ops"], "username": ["Alice"], "logins": ["user", "root"]}' | \
  kubectl exec -i $AUTH_POD -c teleport -- tctl login_rule test --load-from-cluster
groups:
- ops
- app-admins
- db-admins
- admins
logins:
- root
- user
- example
- alice

다음 단계#