InfoGrab Docs

IaC로 신뢰할 수 있는 클러스터 관리

요약

참고: 신뢰할 수 있는 클러스터(Trusted clusters)는 자체 호스팅 Teleport 클러스터에서만 사용 가능합니다. 이 가이드에서는 인프라를 코드로 통해 신뢰할 수 있는 클러스터를 배포하는 방법을 설명합니다.

참고: 신뢰할 수 있는 클러스터(Trusted clusters)는 자체 호스팅 Teleport 클러스터에서만 사용 가능합니다.

이 가이드에서는 인프라를 코드로 통해 신뢰할 수 있는 클러스터를 배포하는 방법을 설명합니다.

작동 방식#

Teleport는 코드에서 동적으로 리소스를 생성하는 세 가지 방법을 지원합니다:

  • Kubernetes에서 Teleport 리소스를 관리할 수 있는 Teleport Kubernetes Operator
  • Terraform을 통해 Teleport 리소스를 관리할 수 있는 Teleport Terraform Provider
  • 로컬 컴퓨터 또는 CI 환경에서 Teleport 리소스를 관리할 수 있는 tctl CLI

사전 요구사항#

  • 두 개의 Teleport 클러스터 인스턴스에 대한 접근. Linux 서버에서 자체 호스팅 Teleport 클러스터를 배포하는 방법을 알아보려면 자체 호스팅 데모 클러스터 실행 가이드를 따르세요.

    두 클러스터는 동일한 버전이거나, 리프 클러스터가 루트 클러스터 버전보다 최대 한 메이저 버전 낮을 수 있습니다.

  • 리프 클러스터로 사용할 클러스터에 조인된 Teleport SSH 서버. 클러스터에 리소스를 등록하는 방법에 대한 자세한 내용은 클러스터에 서비스 조인을 참조하세요.

  • 신뢰할 수 있는 클러스터 작동 방식을 이해하려면 신뢰할 수 있는 클러스터 구성 가이드를 읽으세요.

  • tctl 관리 도구와 tsh 클라이언트 도구.

Kubernetes Operator의 경우:

  • 민감한 사용자 정의 리소스 시크릿을 Kubernetes Secrets에 저장하는 방법을 이해하려면 Secrets에서 값 조회 가이드를 읽으세요.

  • 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 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 역할을 생성해야 합니다.

신뢰할 수 있는 클러스터에 접근할 사용자 및 역할을 추가하려면:

  1. 리프 클러스터에서 Teleport Agent를 실행 중인 서버에서 터미널 셸을 엽니다.

  2. 다음 명령으로 로컬 visitor 사용자를 추가하고 홈 디렉터리를 생성합니다:

    $ sudo useradd --create-home visitor
    

    홈 디렉터리는 visitor 사용자가 서버에서 셸에 접근하는 데 필요합니다.

  3. 다음 명령으로 모든 사용자 로그인 및 클러스터에서 로그아웃합니다:

    $ tsh logout
    
  4. 관리 워크스테이션에서 Teleport 사용자 이름으로 리프 클러스터에 로그인합니다:

    $ tsh login --proxy= --user=
    

    leafcluster.example.com을 Teleport 리프 클러스터 도메인으로, myuser를 Teleport 사용자 이름으로 바꿉니다.

  5. 다음 내용으로 visitor.yaml이라는 역할 정의 파일을 생성합니다:

    kind: role
    version: v7
    metadata:
      name: visitor
    spec:
      allow:
        logins:
          - visitor
        node_labels:
          '*': '*'
    

    SSH로 Teleport Agent를 실행하는 서버에 접근하려면 레이블이 있는 노드에 대한 접근을 명시적으로 허용해야 합니다. 이 예시에서는 visitor 로그인이 모든 서버에 대한 접근이 허용됩니다.

  6. 다음 명령으로 visitor 역할을 생성합니다:

    $ tctl create visitor.yaml
    

    이제 리프 클러스터에 visitor 역할이 생겼습니다. visitor 역할은 visitor 로그인이 있는 사용자가 리프 클러스터의 노드에 접근할 수 있도록 합니다. 다음 단계에서는 역할 조건을 충족하고 리프 클러스터의 서버에 접근할 수 있도록 사용자에게 visitor 로그인을 추가해야 합니다.

2단계/5단계: 루트 클러스터 환경 준비#

리프 클러스터의 서버에 대한 접근을 테스트하기 전에 visitor 로그인을 사용할 수 있는 Teleport 사용자가 필요합니다. 인증은 루트 클러스터에서 처리되므로 루트 클러스터의 사용자에게 visitor 로그인을 추가해야 합니다.

Teleport 사용자에게 로그인을 추가하려면:

  1. 다음 명령으로 모든 사용자 로그인 및 클러스터에서 로그아웃합니다:

    $ tsh logout
    
  2. 관리 워크스테이션에서 Teleport 사용자 이름으로 루트 클러스터에 로그인합니다:

    $ tsh login --proxy= --user=
    

    rootcluster.example.com을 Teleport 루트 클러스터 도메인으로, myuser를 Teleport 사용자 이름으로 바꿉니다.

  3. 다음과 유사한 명령을 실행하여 편집기에서 사용자 리소스를 엽니다:

    $ tctl edit user/
    

    myuser를 Teleport 사용자 이름으로 바꿉니다.

  4. visitor 로그인을 추가합니다:

       traits:
         logins:
    +    - visitor
         - ubuntu
         - root
    
  5. 편집기에서 파일을 저장하고 닫아 변경 사항을 적용합니다.

3단계/5단계: 신뢰할 수 있는 클러스터 조인 토큰 생성#

루트 클러스터의 사용자가 visitor 역할을 사용하여 리프 클러스터의 서버에 접근하기 전에, 클러스터 간 신뢰 관계를 정의해야 합니다. Teleport는 **조인 토큰(join token)**을 사용하여 루트 클러스터와 리프 클러스터 간의 신뢰를 설정합니다.

클러스터 간 신뢰를 설정하려면 루트 클러스터의 Teleport Auth Service를 사용하여 조인 토큰을 먼저 생성해야 합니다. 그런 다음 리프 클러스터의 Teleport Auth Service를 사용하여 조인 토큰을 포함하는 trusted_cluster 리소스를 생성하여 루트 클러스터에게 리프 클러스터가 등록하려는 클러스터임을 증명합니다.

신뢰 관계를 설정하려면:

  1. 다음 명령으로 모든 사용자 로그인 및 클러스터에서 로그아웃합니다:

    $ tsh logout
    
  2. 관리 워크스테이션에서 Teleport 사용자 이름으로 루트 클러스터에 로그인합니다:

    $ tsh login --proxy= --user=
    

    rootcluster.example.com을 Teleport 루트 클러스터 도메인으로, myuser를 Teleport 사용자 이름으로 바꿉니다.

  3. 다음 명령으로 조인 토큰을 생성합니다:

    $ 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 사용:

  1. 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
    
  2. 관리 워크스테이션에서 Teleport 사용자 이름으로 리프 클러스터에 로그인합니다:

    $ tsh login --proxy= --user=
    
  3. 리소스 구성 파일에서 신뢰할 수 있는 클러스터 리소스를 생성하려면 다음 명령을 실행합니다:

    $ tctl create trusted_cluster.yaml
    

    Teleport Web UI에서 리프 클러스터를 직접 구성할 수도 있습니다. 예를 들어, 왼쪽 창에서 Zero Trust Access를 선택한 다음 Manage Clusters를 클릭하여 새 trusted_cluster 리소스를 생성하거나 기존 신뢰할 수 있는 클러스터를 관리할 수 있습니다.

  4. 생성된 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 사용:

  1. 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
    
  2. Kubernetes 리소스를 생성합니다:

    $ kubectl apply -f trusted-cluster.yaml
    
  3. 생성된 Kubernetes 리소스를 나열합니다:

    $ kubectl get trustedclustersv2
    NAMESPACE         NAME                     AGE
    default           rootcluster.example.com  60s
    

Terraform 사용:

  1. 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"
      }
    }
    
  2. 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.
    
  3. 리프 클러스터에서 로그아웃하고 루트 클러스터에 다시 로그인합니다.

  4. 루트 클러스터에서 다음 명령을 실행하여 신뢰할 수 있는 클러스터 구성을 확인합니다:

    $ tsh clusters
    Cluster Name                Status Cluster Type Labels Selected
    --------------------------- ------ ------------ ------ --------
    rootcluster.example.com     online root                *
    leafcluster.example.com     online leaf
    

5단계/5단계: 리프 클러스터의 서버 접근#

이전에 생성한 trusted_cluster 리소스를 통해 루트 클러스터의 사용자로 리프 클러스터의 서버에 로그인할 수 있습니다.

서버 접근을 테스트하려면:

  1. 다음 명령을 실행하여 루트 클러스터에서 Teleport 사용자로 로그인되어 있는지 확인합니다:

    $ tsh status
    
  2. 다음과 유사한 명령을 실행하여 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
    
  3. visitor 로그인을 사용하여 보안 셸 연결을 엽니다:

    $ tsh ssh --cluster= visitor@ip-172-3-2-205
    
  4. 리프 클러스터의 서버에서 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
...

IaC로 신뢰할 수 있는 클러스터 관리

원문 보기
요약

참고: 신뢰할 수 있는 클러스터(Trusted clusters)는 자체 호스팅 Teleport 클러스터에서만 사용 가능합니다. 이 가이드에서는 인프라를 코드로 통해 신뢰할 수 있는 클러스터를 배포하는 방법을 설명합니다.

참고: 신뢰할 수 있는 클러스터(Trusted clusters)는 자체 호스팅 Teleport 클러스터에서만 사용 가능합니다.

이 가이드에서는 인프라를 코드로 통해 신뢰할 수 있는 클러스터를 배포하는 방법을 설명합니다.

작동 방식#

Teleport는 코드에서 동적으로 리소스를 생성하는 세 가지 방법을 지원합니다:

  • Kubernetes에서 Teleport 리소스를 관리할 수 있는 Teleport Kubernetes Operator
  • Terraform을 통해 Teleport 리소스를 관리할 수 있는 Teleport Terraform Provider
  • 로컬 컴퓨터 또는 CI 환경에서 Teleport 리소스를 관리할 수 있는 tctl CLI

사전 요구사항#

  • 두 개의 Teleport 클러스터 인스턴스에 대한 접근. Linux 서버에서 자체 호스팅 Teleport 클러스터를 배포하는 방법을 알아보려면 자체 호스팅 데모 클러스터 실행 가이드를 따르세요.

    두 클러스터는 동일한 버전이거나, 리프 클러스터가 루트 클러스터 버전보다 최대 한 메이저 버전 낮을 수 있습니다.

  • 리프 클러스터로 사용할 클러스터에 조인된 Teleport SSH 서버. 클러스터에 리소스를 등록하는 방법에 대한 자세한 내용은 클러스터에 서비스 조인을 참조하세요.

  • 신뢰할 수 있는 클러스터 작동 방식을 이해하려면 신뢰할 수 있는 클러스터 구성 가이드를 읽으세요.

  • tctl 관리 도구와 tsh 클라이언트 도구.

Kubernetes Operator의 경우:

  • 민감한 사용자 정의 리소스 시크릿을 Kubernetes Secrets에 저장하는 방법을 이해하려면 Secrets에서 값 조회 가이드를 읽으세요.

  • 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 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 역할을 생성해야 합니다.

신뢰할 수 있는 클러스터에 접근할 사용자 및 역할을 추가하려면:

  1. 리프 클러스터에서 Teleport Agent를 실행 중인 서버에서 터미널 셸을 엽니다.

  2. 다음 명령으로 로컬 visitor 사용자를 추가하고 홈 디렉터리를 생성합니다:

    $ sudo useradd --create-home visitor
    

    홈 디렉터리는 visitor 사용자가 서버에서 셸에 접근하는 데 필요합니다.

  3. 다음 명령으로 모든 사용자 로그인 및 클러스터에서 로그아웃합니다:

    $ tsh logout
    
  4. 관리 워크스테이션에서 Teleport 사용자 이름으로 리프 클러스터에 로그인합니다:

    $ tsh login --proxy= --user=
    

    leafcluster.example.com을 Teleport 리프 클러스터 도메인으로, myuser를 Teleport 사용자 이름으로 바꿉니다.

  5. 다음 내용으로 visitor.yaml이라는 역할 정의 파일을 생성합니다:

    kind: role
    version: v7
    metadata:
      name: visitor
    spec:
      allow:
        logins:
          - visitor
        node_labels:
          '*': '*'
    

    SSH로 Teleport Agent를 실행하는 서버에 접근하려면 레이블이 있는 노드에 대한 접근을 명시적으로 허용해야 합니다. 이 예시에서는 visitor 로그인이 모든 서버에 대한 접근이 허용됩니다.

  6. 다음 명령으로 visitor 역할을 생성합니다:

    $ tctl create visitor.yaml
    

    이제 리프 클러스터에 visitor 역할이 생겼습니다. visitor 역할은 visitor 로그인이 있는 사용자가 리프 클러스터의 노드에 접근할 수 있도록 합니다. 다음 단계에서는 역할 조건을 충족하고 리프 클러스터의 서버에 접근할 수 있도록 사용자에게 visitor 로그인을 추가해야 합니다.

2단계/5단계: 루트 클러스터 환경 준비#

리프 클러스터의 서버에 대한 접근을 테스트하기 전에 visitor 로그인을 사용할 수 있는 Teleport 사용자가 필요합니다. 인증은 루트 클러스터에서 처리되므로 루트 클러스터의 사용자에게 visitor 로그인을 추가해야 합니다.

Teleport 사용자에게 로그인을 추가하려면:

  1. 다음 명령으로 모든 사용자 로그인 및 클러스터에서 로그아웃합니다:

    $ tsh logout
    
  2. 관리 워크스테이션에서 Teleport 사용자 이름으로 루트 클러스터에 로그인합니다:

    $ tsh login --proxy= --user=
    

    rootcluster.example.com을 Teleport 루트 클러스터 도메인으로, myuser를 Teleport 사용자 이름으로 바꿉니다.

  3. 다음과 유사한 명령을 실행하여 편집기에서 사용자 리소스를 엽니다:

    $ tctl edit user/
    

    myuser를 Teleport 사용자 이름으로 바꿉니다.

  4. visitor 로그인을 추가합니다:

       traits:
         logins:
    +    - visitor
         - ubuntu
         - root
    
  5. 편집기에서 파일을 저장하고 닫아 변경 사항을 적용합니다.

3단계/5단계: 신뢰할 수 있는 클러스터 조인 토큰 생성#

루트 클러스터의 사용자가 visitor 역할을 사용하여 리프 클러스터의 서버에 접근하기 전에, 클러스터 간 신뢰 관계를 정의해야 합니다. Teleport는 **조인 토큰(join token)**을 사용하여 루트 클러스터와 리프 클러스터 간의 신뢰를 설정합니다.

클러스터 간 신뢰를 설정하려면 루트 클러스터의 Teleport Auth Service를 사용하여 조인 토큰을 먼저 생성해야 합니다. 그런 다음 리프 클러스터의 Teleport Auth Service를 사용하여 조인 토큰을 포함하는 trusted_cluster 리소스를 생성하여 루트 클러스터에게 리프 클러스터가 등록하려는 클러스터임을 증명합니다.

신뢰 관계를 설정하려면:

  1. 다음 명령으로 모든 사용자 로그인 및 클러스터에서 로그아웃합니다:

    $ tsh logout
    
  2. 관리 워크스테이션에서 Teleport 사용자 이름으로 루트 클러스터에 로그인합니다:

    $ tsh login --proxy= --user=
    

    rootcluster.example.com을 Teleport 루트 클러스터 도메인으로, myuser를 Teleport 사용자 이름으로 바꿉니다.

  3. 다음 명령으로 조인 토큰을 생성합니다:

    $ 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 사용:

  1. 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
    
  2. 관리 워크스테이션에서 Teleport 사용자 이름으로 리프 클러스터에 로그인합니다:

    $ tsh login --proxy= --user=
    
  3. 리소스 구성 파일에서 신뢰할 수 있는 클러스터 리소스를 생성하려면 다음 명령을 실행합니다:

    $ tctl create trusted_cluster.yaml
    

    Teleport Web UI에서 리프 클러스터를 직접 구성할 수도 있습니다. 예를 들어, 왼쪽 창에서 Zero Trust Access를 선택한 다음 Manage Clusters를 클릭하여 새 trusted_cluster 리소스를 생성하거나 기존 신뢰할 수 있는 클러스터를 관리할 수 있습니다.

  4. 생성된 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 사용:

  1. 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
    
  2. Kubernetes 리소스를 생성합니다:

    $ kubectl apply -f trusted-cluster.yaml
    
  3. 생성된 Kubernetes 리소스를 나열합니다:

    $ kubectl get trustedclustersv2
    NAMESPACE         NAME                     AGE
    default           rootcluster.example.com  60s
    

Terraform 사용:

  1. 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"
      }
    }
    
  2. 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.
    
  3. 리프 클러스터에서 로그아웃하고 루트 클러스터에 다시 로그인합니다.

  4. 루트 클러스터에서 다음 명령을 실행하여 신뢰할 수 있는 클러스터 구성을 확인합니다:

    $ tsh clusters
    Cluster Name                Status Cluster Type Labels Selected
    --------------------------- ------ ------------ ------ --------
    rootcluster.example.com     online root                *
    leafcluster.example.com     online leaf
    

5단계/5단계: 리프 클러스터의 서버 접근#

이전에 생성한 trusted_cluster 리소스를 통해 루트 클러스터의 사용자로 리프 클러스터의 서버에 로그인할 수 있습니다.

서버 접근을 테스트하려면:

  1. 다음 명령을 실행하여 루트 클러스터에서 Teleport 사용자로 로그인되어 있는지 확인합니다:

    $ tsh status
    
  2. 다음과 유사한 명령을 실행하여 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
    
  3. visitor 로그인을 사용하여 보안 셸 연결을 엽니다:

    $ tsh ssh --cluster= visitor@ip-172-3-2-205
    
  4. 리프 클러스터의 서버에서 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
...