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 제어판이 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 가이드에 따라 Kubernetes 클러스터에 Teleport Operator를 설치합니다. teleport-cluster 차트의 일부로 운영자를 배포하는 경우 Enterprise 지침을 따르세요.

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

    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 원문 보기