IaC로 신뢰할 수 있는 클러스터 관리
참고: 신뢰할 수 있는 클러스터(Trusted clusters)는 자체 호스팅 Teleport 클러스터에서만 사용 가능합니다. 이 가이드에서는 인프라를 코드로 통해 신뢰할 수 있는 클러스터를 배포하는 방법을 설명합니다.
참고: 신뢰할 수 있는 클러스터(Trusted clusters)는 자체 호스팅 Teleport 클러스터에서만 사용 가능합니다.
이 가이드에서는 인프라를 코드로 통해 신뢰할 수 있는 클러스터를 배포하는 방법을 설명합니다.
작동 방식#
Teleport는 코드에서 동적으로 리소스를 생성하는 세 가지 방법을 지원합니다:
- Kubernetes에서 Teleport 리소스를 관리할 수 있는 Teleport Kubernetes Operator
- Terraform을 통해 Teleport 리소스를 관리할 수 있는 Teleport Terraform Provider
- 로컬 컴퓨터 또는 CI 환경에서 Teleport 리소스를 관리할 수 있는
tctlCLI
사전 요구사항#
-
두 개의 Teleport 클러스터 인스턴스에 대한 접근. Linux 서버에서 자체 호스팅 Teleport 클러스터를 배포하는 방법을 알아보려면 자체 호스팅 데모 클러스터 실행 가이드를 따르세요.
두 클러스터는 동일한 버전이거나, 리프 클러스터가 루트 클러스터 버전보다 최대 한 메이저 버전 낮을 수 있습니다.
-
리프 클러스터로 사용할 클러스터에 조인된 Teleport SSH 서버. 클러스터에 리소스를 등록하는 방법에 대한 자세한 내용은 클러스터에 서비스 조인을 참조하세요.
-
신뢰할 수 있는 클러스터 작동 방식을 이해하려면 신뢰할 수 있는 클러스터 구성 가이드를 읽으세요.
-
tctl관리 도구와tsh클라이언트 도구.
Kubernetes Operator의 경우:
-
민감한 사용자 정의 리소스 시크릿을 Kubernetes Secrets에 저장하는 방법을 이해하려면 Secrets에서 값 조회 가이드를 읽으세요.
-
다음 명령을 실행하여 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 Kubernetes Operator를 설치하려면 Teleport operator 가이드를 따르세요.
다음 명령으로 신뢰할 수 있는 클러스터에 대한 CRD (Custom Resource Definition)가 설치되었는지 확인합니다:
$ kubectl explain TeleportTrustedClusterV2.spec GROUP: resources.teleport.dev KIND: TeleportTrustedClusterV2 VERSION: v1 FIELD: spec DESCRIPTION: TrustedCluster resource definition v2 from Teleport FIELDS: enabled <boolean> Enabled is a bool that indicates if the TrustedCluster is enabled or disabled. Setting Enabled to false has a side effect of deleting the user and host certificate authority (CA). role_map <[]Object> RoleMap specifies role mappings to remote roles. token <string> Token is the authorization token provided by another cluster needed by this cluster to join. tunnel_addr <string> ReverseTunnelAddress is the address of the SSH proxy server of the cluster to join. If not set, it is derived from `<metadata.name>:<default reverse tunnel port>`. web_proxy_addr <string> ProxyAddress is the address of the web proxy server of the cluster to join. If not set, it is derived from `<metadata.name>:<default web proxy server port>`.
Terraform의 경우:
Terraform 공급자 가이드를 따라 기능적인 Teleport Terraform 공급자를 설정합니다.
1단계/5단계: 리프 클러스터 환경 준비#
이 가이드에서는 루트 클러스터 사용자가 특정 사용자 아이덴티티와 역할로 리프 클러스터의 서버에 접근할 수 있도록 하는 방법을 보여줍니다. 이 예시에서 리프 클러스터의 서버에 접근하는 데 사용할 수 있는 사용자 아이덴티티는 visitor입니다. 따라서 환경을 준비하려면 먼저 visitor 사용자와 리프 클러스터의 서버에 로그인할 때 이 사용자 이름을 사용할 수 있는 Teleport 역할을 생성해야 합니다.
신뢰할 수 있는 클러스터에 접근할 사용자 및 역할을 추가하려면:
-
리프 클러스터에서 Teleport Agent를 실행 중인 서버에서 터미널 셸을 엽니다.
-
다음 명령으로 로컬
visitor사용자를 추가하고 홈 디렉터리를 생성합니다:$ sudo useradd --create-home visitor홈 디렉터리는
visitor사용자가 서버에서 셸에 접근하는 데 필요합니다. -
다음 명령으로 모든 사용자 로그인 및 클러스터에서 로그아웃합니다:
$ tsh logout -
관리 워크스테이션에서 Teleport 사용자 이름으로 리프 클러스터에 로그인합니다:
$ tsh login --proxy= --user=leafcluster.example.com을 Teleport 리프 클러스터 도메인으로,myuser를 Teleport 사용자 이름으로 바꿉니다. -
다음 내용으로
visitor.yaml이라는 역할 정의 파일을 생성합니다:kind: role version: v7 metadata: name: visitor spec: allow: logins: - visitor node_labels: '*': '*'SSH로 Teleport Agent를 실행하는 서버에 접근하려면 레이블이 있는 노드에 대한 접근을 명시적으로 허용해야 합니다. 이 예시에서는
visitor로그인이 모든 서버에 대한 접근이 허용됩니다. -
다음 명령으로
visitor역할을 생성합니다:$ tctl create visitor.yaml이제 리프 클러스터에
visitor역할이 생겼습니다.visitor역할은visitor로그인이 있는 사용자가 리프 클러스터의 노드에 접근할 수 있도록 합니다. 다음 단계에서는 역할 조건을 충족하고 리프 클러스터의 서버에 접근할 수 있도록 사용자에게visitor로그인을 추가해야 합니다.
2단계/5단계: 루트 클러스터 환경 준비#
리프 클러스터의 서버에 대한 접근을 테스트하기 전에 visitor 로그인을 사용할 수 있는 Teleport 사용자가 필요합니다. 인증은 루트 클러스터에서 처리되므로 루트 클러스터의 사용자에게 visitor 로그인을 추가해야 합니다.
Teleport 사용자에게 로그인을 추가하려면:
-
다음 명령으로 모든 사용자 로그인 및 클러스터에서 로그아웃합니다:
$ tsh logout -
관리 워크스테이션에서 Teleport 사용자 이름으로 루트 클러스터에 로그인합니다:
$ tsh login --proxy= --user=rootcluster.example.com을 Teleport 루트 클러스터 도메인으로,myuser를 Teleport 사용자 이름으로 바꿉니다. -
다음과 유사한 명령을 실행하여 편집기에서 사용자 리소스를 엽니다:
$ tctl edit user/myuser를 Teleport 사용자 이름으로 바꿉니다. -
visitor로그인을 추가합니다:traits: logins: + - visitor - ubuntu - root -
편집기에서 파일을 저장하고 닫아 변경 사항을 적용합니다.
3단계/5단계: 신뢰할 수 있는 클러스터 조인 토큰 생성#
루트 클러스터의 사용자가 visitor 역할을 사용하여 리프 클러스터의 서버에 접근하기 전에, 클러스터 간 신뢰 관계를 정의해야 합니다. Teleport는 **조인 토큰(join token)**을 사용하여 루트 클러스터와 리프 클러스터 간의 신뢰를 설정합니다.
클러스터 간 신뢰를 설정하려면 루트 클러스터의 Teleport Auth Service를 사용하여 조인 토큰을 먼저 생성해야 합니다. 그런 다음 리프 클러스터의 Teleport Auth Service를 사용하여 조인 토큰을 포함하는 trusted_cluster 리소스를 생성하여 루트 클러스터에게 리프 클러스터가 등록하려는 클러스터임을 증명합니다.
신뢰 관계를 설정하려면:
-
다음 명령으로 모든 사용자 로그인 및 클러스터에서 로그아웃합니다:
$ tsh logout -
관리 워크스테이션에서 Teleport 사용자 이름으로 루트 클러스터에 로그인합니다:
$ tsh login --proxy= --user=rootcluster.example.com을 Teleport 루트 클러스터 도메인으로,myuser를 Teleport 사용자 이름으로 바꿉니다. -
다음 명령으로 조인 토큰을 생성합니다:
$ tctl tokens add --type=trusted_cluster --ttl=5m The cluster join token: (=presets.tokens.first=)이 명령은 리프 클러스터로부터의 인바운드 연결을 허용하는 신뢰할 수 있는 클러스터 조인 토큰을 생성합니다. 토큰은 여러 번 사용할 수 있습니다. 이 명령 예시에서 토큰의 만료 시간은 5분입니다.
조인 토큰은 처음 연결을 설정하는 데만 사용됩니다. 클러스터는 인증서를 교환하고 이후 연결을 재설정하는 데는 토큰을 사용하지 않습니다.
나중에 사용하기 위해 토큰을 복사할 수 있습니다. 토큰을 다시 표시해야 하는 경우 루트 클러스터에서 다음 명령을 실행합니다:
$ tctl tokens ls Token Type Labels Expiry Time (UTC) -------------------------------------------------------- --------------- -------- --------------------------- (=presets.tokens.first=) trusted_cluster 28 Apr 22 19:19 UTC (4m48s)
Kubernetes Operator 사용자에 대한 팁: 신뢰할 수 있는 클러스터 조인 토큰은 민감한 정보이므로 신뢰할 수 있는 클러스터 사용자 정의 리소스에 직접 저장하면 안 됩니다. 대신 토큰을 Kubernetes 시크릿에 저장합니다. 그러면 신뢰할 수 있는 클러스터 리소스가 다음 단계에서 시크릿 조회를 수행하도록 구성할 수 있습니다.
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: teleport-trusted-cluster
annotations:
# This annotation allows any CR to look up this secret.
# You may want to restrict which CRs are allowed to look up this secret.
resources.teleport.dev/allow-lookup-from-cr: "*"
# We use stringData instead of data for the sake of simplicity, both are OK
stringData:
token: (=presets.tokens.first=)
$ kubectl apply -f secret.yaml
4단계/5단계: 신뢰할 수 있는 클러스터 리소스 생성#
이제 신뢰할 수 있는 클러스터 리소스를 구성하고 생성할 준비가 되었습니다.
tctl 사용:
-
trusted-cluster.yaml이라는 파일에 Teleport 신뢰할 수 있는 클러스터 리소스를 구성합니다.# trusted-cluster.yaml kind: trusted_cluster version: v2 metadata: # The resource name must match the name of the trusted cluster. name: rootcluster.example.com spec: # enabled enables the trusted cluster relationship. enabled: true # token specifies the join token. token: (=presets.tokens.first=) # role_map maps Teleport roles from the root cluster in the leaf cluster. # In this case, users with the `access` role in the root cluster are granted # the `visitor` role in the leaf cluster. role_map: - remote: "access" local: ["visitor"] # tunnel_addr specifies the reverse tunnel address of the root cluster proxy. tunnel_addr: rootcluster.example.com:443 # web_proxy_addr specifies the address of the root cluster proxy. web_proxy_addr: rootcluster.example.com:443 -
관리 워크스테이션에서 Teleport 사용자 이름으로 리프 클러스터에 로그인합니다:
$ tsh login --proxy= --user= -
리소스 구성 파일에서 신뢰할 수 있는 클러스터 리소스를 생성하려면 다음 명령을 실행합니다:
$ tctl create trusted_cluster.yamlTeleport Web UI에서 리프 클러스터를 직접 구성할 수도 있습니다. 예를 들어, 왼쪽 창에서 Zero Trust Access를 선택한 다음 Manage Clusters를 클릭하여 새
trusted_cluster리소스를 생성하거나 기존 신뢰할 수 있는 클러스터를 관리할 수 있습니다. -
생성된
trusted_cluster리소스를 나열합니다:$ tctl get tc kind: trusted_cluster version: v2 metadata: name: rootcluster.example.com revision: ba8205a9-c82c-458b-a0f6-76f7c4145672 spec: enabled: true role_map: - local: - visitor remote: access token: (=presets.tokens.first=) tunnel_addr: rootcluster.example.com:443 web_proxy_addr: rootcluster.example.com:443
Kubernetes Operator 사용:
-
trusted-cluster.yaml이라는 파일에 Kubernetes 신뢰할 수 있는 클러스터 리소스를 구성합니다.# trusted-cluster.yaml apiVersion: resources.teleport.dev/v1 kind: TeleportTrustedClusterV2 metadata: # The resource name must match the name of the trusted cluster. name: rootcluster.example.com spec: # enabled enables the trusted cluster relationship. enabled: true # token specifies the join token. # This value will be resolved from the previously stored secret. # `teleport-trusted-cluster` is the secret name and `token` is the secret key. token: "secret://teleport-trusted-cluster/token" # role_map maps Teleport roles from the root cluster in the leaf cluster. # In this case, users with the `access` role in the root cluster are granted # the `visitor` role in the leaf cluster. role_map: - remote: access local: - visitor # tunnel_addr specifies the reverse tunnel address of the root cluster proxy. tunnel_addr: rootcluster.example.com:443 # web_proxy_addr specifies the address of the root cluster proxy. web_proxy_addr: rootcluster.example.com:443 -
Kubernetes 리소스를 생성합니다:
$ kubectl apply -f trusted-cluster.yaml -
생성된 Kubernetes 리소스를 나열합니다:
$ kubectl get trustedclustersv2 NAMESPACE NAME AGE default rootcluster.example.com 60s
Terraform 사용:
-
trusted-cluster.tf라는 파일에 Terraform 신뢰할 수 있는 클러스터 리소스를 구성합니다.# trusted-cluster.tf resource "teleport_trusted_cluster" "cluster" { version: v2 metadata = { # The resource name must match the name of the trusted cluster. name = "rootcluster.example.com" } spec = { # enabled enables the trusted cluster relationship. enabled = true # token specifies the join token. token = "(=presets.tokens.first=)" # role_map maps Teleport roles from the root cluster in the leaf cluster. # In this case, users with the `access` role in the root cluster are granted # the `visitor` role in the leaf cluster. role_map = [{ remote = "access" local = ["visitor"] }] # tunnel_addr specifies the reverse tunnel address of the root cluster proxy. tunnel_addr = "rootcluster.example.com:443" # web_proxy_addr specifies the address of the root cluster proxy. web_proxy_addr = "rootcluster.example.com:443" } } -
Terraform 리소스를 계획하고 적용합니다:
$ terraform plan [...] Plan: 1 to add, 0 to change, 0 to destroy. $ terraform apply [...] teleport_trusted_cluster.cluster: Creating... teleport_trusted_cluster.cluster: Creation complete after 0s [id=rootcluster.example.com] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. -
리프 클러스터에서 로그아웃하고 루트 클러스터에 다시 로그인합니다.
-
루트 클러스터에서 다음 명령을 실행하여 신뢰할 수 있는 클러스터 구성을 확인합니다:
$ tsh clusters Cluster Name Status Cluster Type Labels Selected --------------------------- ------ ------------ ------ -------- rootcluster.example.com online root * leafcluster.example.com online leaf
5단계/5단계: 리프 클러스터의 서버 접근#
이전에 생성한 trusted_cluster 리소스를 통해 루트 클러스터의 사용자로 리프 클러스터의 서버에 로그인할 수 있습니다.
서버 접근을 테스트하려면:
-
다음 명령을 실행하여 루트 클러스터에서 Teleport 사용자로 로그인되어 있는지 확인합니다:
$ tsh status -
다음과 유사한 명령을 실행하여 Teleport Agent를 실행하는 서버가 리프 클러스터에 조인되어 있는지 확인합니다:
$ tsh ls --cluster= Node Name Address Labels --------------- -------------- ------------------------------------ ip-172-3-1-242 127.0.0.1:3022 hostname=ip-172-3-1-242 ip-172-3-2-205 ⟵ Tunnel hostname=ip-172-3-2-205 -
visitor로그인을 사용하여 보안 셸 연결을 엽니다:$ tsh ssh --cluster= visitor@ip-172-3-2-205 -
리프 클러스터의 서버에서
visitor사용자로 로그인되어 있는지 다음 명령으로 확인합니다:$ pwd /home/visitor $ uname -a Linux ip-172-3-2-205 5.15.0-1041-aws #46~20.04.1-Ubuntu SMP Wed Jul 19 15:39:29 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux
Kubernetes Operator 사용자를 위한 팁: Teleport Kubernetes Operator로 기존 신뢰할 수 있는 클러스터 관리
Teleport Kubernetes Operator로 관리하려는 기존 신뢰할 수 있는 클러스터가 있는 경우, 먼저 신뢰할 수 있는 클러스터 레이블 teleport.dev/origin: kubernetes를 설정하여 이 작업을 수행할 수 있습니다. 그러면 Teleport Kubernetes Operator가 trusted_cluster를 관리되는 리소스로 채택할 수 있습니다.
kind: trusted_cluster
metadata:
name: rootcluster.example.com
labels:
teleport.dev/origin: kubernetes
...
