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-clusterHelm 차트 배포 여부에 관계없음) -
다음 명령을 실행하여 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/proxyOperator를 로컬에서 실험하려는 사용자는 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
다음 단계#
- Teleport Operator에 대해 자세히 알아보려면 Teleport Operator 가이드를 읽으세요.
- 로그인 규칙 표현식 구문에 대해 알아보려면 로그인 규칙 참조를 읽으세요.
