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

이 가이드는 다음을 설명합니다:

  • Teleport의 Kubernetes Operator를 사용하여 Teleport 클러스터에 로그인 규칙을 배포하는 방법
  • kubectl을 사용하여 배포된 로그인 규칙을 편집하는 방법

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

전제 조건

  • Teleport Enterprise 라이센스

  • Kubernetes 클러스터(teleport-cluster Helm 차트가 이미 배포되었든 아니든 상관없이)

  • Helm

  • kubectl

  • 다음 명령을 실행하여 Kubernetes 연결을 검증하세요:

    kubectl cluster-info

    Kubernetes control plane은 https://127.0.0.1:6443에서 실행 중입니다.

    CoreDNS는 https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy에서 실행 중입니다.

    Tip

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

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

    다음 명령으로 로그인 규칙의 CRD(사용자 지정 리소스 정의)가 설치되었는지 확인하세요:

    kubectl explain TeleportLoginRule.spec
    KIND: TeleportLoginRuleVERSION: resources.teleport.dev/v1
    RESOURCE: spec <Object>
    DESCRIPTION: 로그인 규칙 리소스 정의 v1 from Teleport
    FIELDS: priority <integer> 우선순위는 동일 클러스터 내 다른 로그인 규칙에 대한 로그인 규칙의 우선순위입니다. 번호가 낮은 우선순위를 가진 로그인 규칙이 먼저 평가됩니다.
    traits_expression <string> TraitsExpression은 로그인을 수행할 사용자에 대한 원하는 특성을 반환해야 하는 술어 표현입니다.
    traits_map <> TraitsMap은 특성 키에 대한 리스트로 이루어진 맵으로, 해당 특성에 대한 원하는 값을 평가해야 하는 술어 표현의 리스트입니다.

    이 명령이 실패하면 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:
  # 가장 낮은 우선순위를 가진 규칙이 먼저 평가됩니다.
  priority: 0

  # traits_map은 모든 원하는 특성 키와 특성 값을 결정하는 표현식의 리스트를 담고 있습니다.
  traits_map:

    # "logins" 특성은 외부 "username" 특성을 소문자로 변환하고,
    # 어떤 외부 "logins" 특성을 추가합니다.
    logins:
      - 'strings.lower(external.username)'
      - 'external.logins'

    # 외부 "groups" 특성은 변경되지 않고 그대로 전달되며, 다른 모든 특성은 필터링됩니다.
    groups:
      - external.groups
---
apiVersion: resources.teleport.dev/v1
kind: TeleportLoginRule
metadata:
  name: example-traits-expression-rule
  labels:
    example: "true"
spec:
  # 이 규칙은 더 높은 우선순위 값을 가지고 있어, 
  # "terraform-test-map-rule" 이후에 평가됩니다.
  priority: 1

  # traits_expression은 모든 원하는 특성을 단일 표현식으로 반환하는 traits_map의 대안입니다.
  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 AGEexample-traits-expression-rule 8m8sexample-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_rulemetadata: id: 1680225062340767900 labels: example: "true" teleport.dev/origin: kubernetes name: example-traits-expression-rulespec: 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_rulemetadata: id: 1680225067068319000 labels: example: "true" teleport.dev/origin: kubernetes name: example-traits-map-rulespec: priority: 0 traits_map: groups: - external.groups logins: - strings.lower(external.username) - external.loginsversion: 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-adminslogins:- 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'

     # 외부 "groups" 특성은 변경되지 않고 그대로 전달되며, 다른 모든 특성은 필터링됩니다.

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- adminslogins:- root- user- example- alice

다음 단계

Teleport 원문 보기