Infograb logo
GCP, GKE, 및 Helm을 사용한 HA Teleport 클러스터 실행

이 가이드에서는 Teleport Helm 차트와 Google Cloud Platform 제품 (Firestore 및 Google Cloud Storage)을 사용하여 여러 복제본이 있는 고가용성 Teleport 클러스터를 설정하는 방법을 설명합니다.

이미 다른 플랫폼에서 Teleport를 실행 중인 경우, 기존 Teleport 배포를 사용하여 Kubernetes 클러스터에 액세스할 수 있습니다. 가이드를 따르세요 Kubernetes 클러스터를 Teleport에 연결합니다.

Tip

Teleport Enterprise Cloud는 이 설정을 자동으로 처리하므로 즉시 인프라에 대한 안전한 액세스를 제공할 수 있습니다.

Teleport Enterprise Cloud의 무료 평가판으로 시작하세요.

전제 조건

Teleport의 차트는 Helm 버전 3을 사용해야 합니다. 이 지침을 따라 Helm 3을 설치할 수 있습니다.

이 가이드 전체에서 helmkubectl 바이너리가 PATH 에 있을 것으로 가정합니다:

helm version

version.BuildInfo{Version:"v3.4.2"}


kubectl version

Client Version: version.Info{Major:"1", Minor:"17+"}

Server Version: version.Info{Major:"1", Minor:"17+"}

Teleport를 운영 환경에서 실행할 때 보안 사고를 피하기 위해 다음의 모범 사례를 준수해야 합니다:

  • 필요하지 않는 한 운영 환경에서 sudo 사용을 피하십시오.
  • 새로운 비루트 사용자를 생성하고 Teleport 실험을 위해 테스트 인스턴스를 사용하십시오.
  • 필요하지 않은 한 비루트 사용자로 Teleport의 서비스를 실행하십시오. SSH 서비스만 루트 액세스를 요구합니다. Teleport가 < 1024 (예: 443 )로 번호 매겨진 포트에서 수신 대기하도록 하려면 루트 권한(또는 CAP_NET_BIND_SERVICE 권한)이 필요합니다.
  • 최소 권한 원칙을 따르십시오. 더 제한적인 역할로도 충분할 때 사용자에게 허용적인 역할을 부여하지 마십시오. 예를 들어, 클러스터 리소스에 액세스하고 편집할 수 있는 권한을 부여하는 내장된 access,editor 역할을 사용자에게 할당하지 마십시오. 대신 각 사용자에 대해 최소한의 필수 권한을 가진 역할을 정의하고 액세스 요청을 구성하여 일시적으로 상승된 권한을 부여하십시오.
  • 새로운 데이터베이스나 애플리케이션과 같은 Teleport 리소스를 등록할 때 초대 토큰을 파일에 저장해야 합니다. 명령줄에 직접 토큰을 입력하면 악성 사용자가 손상된 시스템에서 history 명령을 실행하여 이를 볼 수 있습니다.

이러한 관행이 문서에서 사용된 예제에 반드시 반영되는 것은 아닙니다. 문서의 예제는 주로 데모 및 개발 환경을 위한 것입니다.

1/6단계. Teleport Helm 차트 리포지토리 추가

Teleport Helm 저장소를 설정합니다.

Helm이 Teleport Helm 저장소에서 호스팅되는 차트를 설치할 수 있도록 허용합니다:

helm repo add teleport https://charts.releases.teleport.dev

원격 저장소의 차트 캐시를 업데이트하여 모든 사용 가능한 릴리스로 업그레이드할 수 있습니다:

helm repo update
주의 사항

아래 단계는 Google Cloud Google Kubernetes Engine (GKE) 표준 배포에 적용됩니다.

2/6단계. Google Cloud IAM 구성

Teleport가 Firestore 컬렉션, 인덱스 및 필요한 Google Cloud Storage 버킷을 생성할 수 있도록, Google Cloud 서비스 계정을 다음 서비스들을 사용할 수 있는 권한으로 구성해야 합니다.

storage.buckets.create 권한을 부여하는 IAM 역할 생성

Google Cloud IAM 및 관리의 "역할" 섹션으로 이동합니다.

  1. 상단의 "역할 만들기" 버튼을 클릭합니다.
Roles section
Roles section
  1. "Storage Bucket Creator" 역할의 세부 정보를 입력합니다 (we suggest using the name storage-bucket-creator-role ).
Create role
Create role
  1. "권한 추가" 버튼을 클릭합니다.
Storage bucket creator
role
Storage bucket creator role
  1. "필터" 상자에 storage.buckets.create 를 입력하고 목록에서 선택합니다.
Filter the list
Filter the list
  1. 목록에서 storage.buckets.create 권한을 확인하고 "추가" 버튼을 클릭하여 역할에 추가합니다.
Select storage.buckets.create
Select storage.buckets.create
  1. 모든 설정이 성공적으로 입력되면 "역할 만들기" 버튼을 클릭합니다.
Create role
Create role

Cloud DNS 권한을 부여하는 IAM 역할 생성

Google Cloud IAM 및 관리의 "역할" 섹션으로 이동합니다.

  1. 상단의 "역할 만들기" 버튼을 클릭합니다.
Roles section
Roles section
  1. "DNS Updater" 역할의 세부 정보를 입력합니다 (we suggest using the name dns-updater-role ).
Create role
Create role
  1. "권한 추가" 버튼을 클릭합니다.
DNS updater role
DNS updater role
  1. "필터" 상자를 사용하여 목록에서 다음 권한을 각각 찾아 추가합니다. dns.resourceRecordSets.* 와 같은 것을 입력하여 목록을 빠르게 필터링할 수 있습니다.
dns.resourceRecordSets.create
dns.resourceRecordSets.delete
dns.resourceRecordSets.list
dns.resourceRecordSets.update
dns.changes.create
dns.changes.get
dns.changes.list
dns.managedZones.list
  1. 모든 설정이 성공적으로 입력되면 "역할 만들기" 버튼을 클릭합니다.
Add DNS
permissions
Add DNS permissions

Teleport Helm 차트를 위한 서비스 계정 생성

Note

적절히 프로비저닝된 서비스 계정에 대해 사용하고자 하는 JSON 비공개 키가 이미 있는 경우, 이 생성 프로세스를 건너뛰고 아래의 "서비스 계정을 위한 JSON 비공개 키를 포함하는 Kubernetes 시크릿 생성" 섹션으로 이동할 수 있습니다.

Google Cloud IAM & Admin의 "서비스 계정" 섹션으로 이동합니다.

  1. 상단의 "서비스 계정 생성" 버튼을 클릭합니다.
서비스 계정 생성
서비스 계정 생성
  1. 서비스 계정의 세부 정보를 입력합니다 (우리는 teleport-helm 이라는 이름을 사용하는 것을 권장합니다) 그리고 "생성" 버튼을 클릭합니다.
서비스 계정 세부 정보
입력
서비스 계정 세부 정보 입력
  1. "이 서비스 계정에 프로젝트 접근 권한 부여" 섹션에서 다음 네 가지 역할을 추가합니다:
역할목적
storage-bucket-creator-role스토리지 버킷 생성을 허용하는 역할입니다.
dns-updater-roleCloud DNS 레코드 업데이트를 허용하는 역할입니다.
Cloud Datastore OwnerCloud Datastore 컬렉션 생성을 위한 권한을 부여합니다.
Storage Object AdminGoogle Cloud 스토리지 객체의 읽기/쓰기/삭제를 허용합니다.
역할 추가
역할 추가
  1. 설정을 저장하려면 "계속" 버튼을 클릭하고, "생성" 버튼을 클릭하여 서비스 계정을 생성합니다.

서비스 계정을 위한 액세스 키 생성

Google Cloud IAM & Admin의 "서비스 계정" 뷰로 돌아갑니다.

  1. 방금 생성한 teleport-helm 서비스 계정을 클릭합니다.
서비스 계정을
클릭합니다
서비스 계정을 클릭합니다
  1. 상단의 "키" 탭을 클릭하고 "키 추가"를 클릭합니다. "JSON"을 선택하고 "생성"을 클릭합니다.
JSON 키 생성
  1. JSON 비공개 키가 컴퓨터에 다운로드됩니다. 파일 이름(bens-demos-24150b1a0a7f.json 이 예제에서는)을 주의해 두십시오. 나중에 필요할 것입니다.
비공개 키 저장됨
비공개 키 저장됨

서비스 계정을 위한 JSON 비공개 키를 포함하는 Kubernetes 시크릿 생성

JSON 비공개 키가 방금 저장된 경로를 찾습니다 (아마도 브라우저의 기본 "다운로드" 디렉토리일 것입니다).

kubectl 을 사용하여 teleport 네임스페이스를 생성하고, 그 보안 정책을 설정한 후, JSON 비공개 키의 경로를 사용하여 시크릿을 생성합니다:

kubectl create namespace teleport
namespace/teleport created
kubectl label namespace teleport 'pod-security.kubernetes.io/enforce=baseline'
namespace/teleport labeled
kubectl --namespace teleport create secret generic teleport-gcp-credentials --from-file=gcp-credentials.json=/path/to/downloads/bens-demos-24150b1a0a7f.json
secret/teleport-gcp-credentials created
Tip

Teleport 차트를 특정 네임스페이스에 설치한 경우, 생성한 teleport-gcp-credentials 시크릿도 동일한 네임스페이스에 추가되어야 합니다.

Note

기본적으로 시크릿의 이름은 teleport-gcp-credentials 로 설정됩니다.

이미 시크릿이 생성된 경우, 이 생성 프로세스를 건너뛰고 gcp.credentialSecretName 을 사용하여 시크릿의 이름을 지정할 수 있습니다.

사용된 모든 시크릿에 저장된 자격 증명 파일은 키 이름이 gcp-credentials.json 이어야 합니다.

3/6단계. cert-manager 설치 및 구성

cert-manager 문서를 참조하십시오.

이 예제에서는 다중 포드를 사용하여 고가용성 Teleport 클러스터를 생성합니다. 따라서 cert-manager 를 사용하여 Let's Encrypt를 통해 TLS 인증서를 중앙에서 프로비저닝합니다. 이러한 인증서는 각 Teleport 포드에 마운트되며 cert-manager 에 의해 자동으로 갱신되고 최신 상태로 유지됩니다.

Teleport를 설치할 Kubernetes 클러스터에 cert-manager 가 이미 구성되어 있지 않은 경우, cert-manager 차트를 호스트하는 Jetstack Helm 차트 리포지토리를 추가하고 차트를 설치해야 합니다:

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \--create-namespace \--namespace cert-manager \--set global.leaderElection.namespace=cert-manager \--set installCRDs=true

cert-manager 가 설치되면 Issuer 를 생성하고 추가해야 합니다.

아래 Issuer 예제에서 이 값들을 바꿔야 합니다:

자리표시자 값교체할 값
email@address.comLet's Encrypt로부터 커뮤니케이션을 받을 이메일 주소
example.comTeleport 클러스터를 호스팅할 Cloud DNS 도메인의 이름
gcp-project-idCloud DNS 도메인이 등록된 GCP 프로젝트 ID
cat << EOF > gcp-issuer.yaml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-production
  namespace: teleport
spec:
  acme:
    email: email@address.com                                # 이 부분을 변경하세요
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-production
    solvers:
    - selector:
        dnsZones:
          - "example.com"                                  # 이 부분을 변경하세요
      dns01:
        cloudDNS:
          project: gcp-project-id                          # 이 부분을 변경하세요
          serviceAccountSecretRef:
            name: teleport-gcp-credentials
            key: gcp-credentials.json
EOF
Note

여기에 있는 serviceAccountSecretRef 아래의 비밀 이름은 기본값이 teleport-gcp-credentials 입니다.

차트 값에서 gcp.credentialSecretName 을 변경한 경우 여기도 일치하는지 확인해야 합니다.

Issuer 를 생성하고 값을 업데이트한 후, kubectl 을 사용하여 클러스터에 추가합니다:

kubectl --namespace teleport create -f gcp-issuer.yaml

4/6단계. 클러스터 구성을 위한 값 설정

Kubernetes 클러스터에 Teleport Enterprise를 설치하기 전에, Teleport 라이센스 정보를 포함한 비밀을 생성해야 합니다.

Teleport Auth 서비스는 Teleport Enterprise 계정을 인증하기 위해 라이센스 파일을 읽습니다.

라이센스 파일을 얻으려면 Teleport 계정 대시보드로 이동하여 로그인하십시오. teleport.sh에서 시작하여 Teleport 계정 이름(예: my-company)을 입력합니다. 로그인 후 "GENERATE LICENSE KEY" 버튼이 표시되며, 이를 클릭하면 새 라이센스 파일이 생성되고 다운로드할 수 있습니다.

라이센스 파일에서 비밀을 생성합니다. 파일 이름이 license.pem 인 한, Teleport가 이 비밀을 자동으로 발견합니다.

kubectl -n teleport create secret generic license --from-file=license.pem
Note

새로운 GCP 프로젝트에 Teleport를 설치하는 경우, Cloud Firestore API를 활성화하고, Firestore 데이터베이스를 프로젝트에 만들었는지 확인하십시오.

다음으로, teleport-cluster Helm 차트를 gcp 모드로 구성합니다. gcp-values.yaml 이라는 파일을 만들고 위에서 선택한 값을 작성합니다:

chartMode: gcp
clusterName: teleport.example.com # 클러스터 이름. 아래 DNS에서 구성할 의도인 FQDN 사용
gcp:
  projectId: gcpproj-123456 # Google Cloud 프로젝트 ID
  backendTable: teleport-helm-backend # Teleport 백엔드를 위한 Firestore 컬렉션
  auditLogTable: teleport-helm-events # Teleport 감사 로그를 위한 Firestore 컬렉션 (백엔드 컬렉션과 달라야 함)
  auditLogMirrorOnStdout: false # 감사 로그 항목을 stdout에 JSON 형식으로 미러링할지 여부 (외부 로그 수집기에게 유용함)
  sessionRecordingBucket: teleport-helm-sessions # Teleport 세션 녹화를 위한 Google Cloud Storage 버킷
highAvailability:
  replicaCount: 2 # 구성할 복제본 수
  certManager:
    enabled: true # TLS 인증서를 받기 위해 cert-manager 지원 활성화
    issuerName: letsencrypt-production # 사용할 cert-manager Issuer의 이름 (위에서 구성한 대로)

# Kubernetes 1.23 이상을 실행 중인 경우 PodSecurityPolicies를 비활성화
podSecurityPolicy:
  enabled: false
chartMode: gcp
clusterName: teleport.example.com # 클러스터 이름. 아래 DNS에서 구성할 의도인 FQDN 사용
gcp:
  projectId: gcpproj-123456 # Google Cloud 프로젝트 ID
  backendTable: teleport-helm-backend # Teleport 백엔드를 위한 Firestore 컬렉션
  auditLogTable: teleport-helm-events # Teleport 감사 로그를 위한 Firestore 컬렉션 (백엔드 컬렉션과 달라야 함)
  auditLogMirrorOnStdout: false # 감사 로그 항목을 stdout에 JSON 형식으로 미러링할지 여부 (외부 로그 수집기에게 유용함)
  sessionRecordingBucket: teleport-helm-sessions # Teleport 세션 녹화를 위한 Google Cloud Storage 버킷
highAvailability:
  replicaCount: 2 # 구성할 복제본 수
  certManager:
    enabled: true # TLS 인증서를 받기 위해 cert-manager 지원 활성화
    issuerName: letsencrypt-production # 사용할 cert-manager Issuer의 이름 (위에서 구성한 대로)
enterprise: true # 이것이 Teleport Enterprise 배포임을 표시

gcp-values.yaml 파일의 값으로 차트를 설치합니다:

helm install teleport teleport/teleport-cluster \ --create-namespace \ --namespace teleport \ -f gcp-values.yaml
Note

클러스터가 구성된 후 clusterName 을 변경할 수 없으므로, 신중하게 선택하십시오. 외부 접근을 위해 사용할 완전한 도메인 이름을 사용하는 것을 권장합니다.

차트가 설치되면 kubectl 명령어를 사용하여 배포를 확인할 수 있습니다:

kubectl --namespace teleport get all

NAME READY STATUS RESTARTS AGEpod/teleport-auth-57989d4cbd-4q2ds 1/1 Running 0 22hpod/teleport-auth-57989d4cbd-rtrzn 1/1 Running 0 22hpod/teleport-proxy-c6bf55cfc-w96d2 1/1 Running 0 22hpod/teleport-proxy-c6bf55cfc-z256w 1/1 Running 0 22h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/teleport LoadBalancer 10.40.11.180 34.138.177.11 443:30258/TCP,3023:31802/TCP,3026:32182/TCP,3024:30101/TCP,3036:30302/TCP 22hservice/teleport-auth ClusterIP 10.40.8.251 <none> 3025/TCP,3026/TCP 22hservice/teleport-auth-v11 ClusterIP None <none> <none> 22hservice/teleport-auth-v12 ClusterIP None <none> <none> 22h
NAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/teleport-auth 2/2 2 2 22hdeployment.apps/teleport-proxy 2/2 2 2 22h
NAME DESIRED CURRENT READY AGEreplicaset.apps/teleport-auth-57989d4cbd 2 2 2 22hreplicaset.apps/teleport-proxy-c6bf55cfc 2 2 2 22h

5/6단계. DNS 설정

teleport.example.com 에 대한 DNS A 레코드를 설정해야 합니다.

Teleport는 Application Access에 대해 구성하는 각 애플리케이션에 서브도메인을 할당합니다. 예를 들어, Grafana를 리소스로 등록하면 Teleport는 리소스를 grafana.teleport.example.com 서브도메인에 할당합니다.

Teleport 클러스터를 자신의 네트워크에서 호스팅하는 경우, 애플리케이션 서브도메인을 고려하여 DNS 구성을 업데이트해야 합니다. DNS를 업데이트하는 방법에는 두 가지가 있습니다:

  • 서브도메인 이름에 대해 와일드카드 치환을 사용하여 단일 DNS 주소(A) 또는 정식 이름(CNAME) 레코드를 생성합니다. 예를 들어, *.teleport.example.com 이름으로 DNS 레코드를 생성합니다.
  • 각 애플리케이션 서브도메인에 대해 개별 DNS 주소(A) 또는 정식 이름(CNAME) 레코드를 생성합니다.

DNS를 수정하면 인증 기관(예: Let's Encrypt)이 각 서브도메인에 대한 인증서를 발급할 수 있고, 클라이언트가 접근하는 애플리케이션에 관계없이 Teleport 호스트를 검증할 수 있습니다.

Teleport 클라우드 플랫폼을 사용하는 경우, 서브도메인과 애플리케이션에 대한 서명된 TLS 인증서를 자동으로 제공하므로 DNS 업데이트가 필요하지 않습니다.

Google Cloud DNS를 사용하여 설정하는 방법은 다음과 같습니다:

위에서 변경한 매개변수가 있으면 이를 변경하십시오.

NAMESPACE=teleport
RELEASE_NAME=teleport

MYIP=$(kubectl --namespace ${NAMESPACE?} get service/${RELEASE_NAME?} -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
MYZONE="myzone"
MYDNS="teleport.example.com"

gcloud dns record-sets transaction start --zone="${MYZONE?}"
gcloud dns record-sets transaction add ${MYIP?} --name="${MYDNS?}" --ttl="300" --type="A" --zone="${MYZONE?}"
gcloud dns record-sets transaction add ${MYIP?} --name="*.${MYDNS?}" --ttl="300" --type="A" --zone="${MYZONE?}"
gcloud dns record-sets transaction describe --zone="${MYZONE?}"
gcloud dns record-sets transaction execute --zone="${MYZONE?}"

6/6단계. Teleport 사용자 생성

Teleport에 로그인할 수 있는 사용자를 생성해야 합니다. 이는 Teleport 인증 서버에서 수행해야 하므로 kubectl 를 사용하여 명령을 실행할 수 있습니다:

kubectl --namespace teleport exec deploy/teleport-auth -- tctl users add test --roles=access,editor

사용자 "test"가 생성되었지만 비밀번호가 필요합니다. 사용자와 이 URL을 공유하여 사용자 설정을 완료하세요. 링크는 1시간 동안 유효합니다:https://teleport.example.com:443/web/invite/91cfbd08bc89122275006e48b516cc68
참고: teleport.example.com:443이 사용자가 액세스할 수 있는 Teleport 프록시를 가리키는지 확인하십시오.
kubectl --namespace teleport exec deploy/teleport-auth -- tctl users add test --roles=access,editor,reviewer

사용자 "test"가 생성되었지만 비밀번호가 필요합니다. 사용자와 이 URL을 공유하여 사용자 설정을 완료하세요. 링크는 1시간 동안 유효합니다:https://teleport.example.com:443/web/invite/91cfbd08bc89122275006e48b516cc68
참고: teleport.example.com:443이 사용자가 액세스할 수 있는 Teleport 프록시를 가리키는지 확인하십시오.

사용자 생성 링크를 로드하여 비밀번호를 생성하고 웹 UI를 통해 Teleport 사용자의 다중 인증을 설정하세요.

고가용성

이 가이드에서는 2개의 복제본을 구성했습니다. 이는 클러스터 생성 후 highAvailability.replicaCount 값을 변경하여 수정할 수 있습니다 아래 설명된 helm upgrade 를 사용하여.

배포 후 클러스터 업그레이드

배포 후 Teleport 클러스터를 변경하려면 helm upgrade 를 사용할 수 있습니다.

Helm은 기본적으로 저장소에서 사용할 수 있는 차트의 최신 버전을 사용하며, 이는 Teleport의 최신 버전과도 일치합니다. helm repo update 를 실행하여 저장소가 최신 상태인지 확인할 수 있습니다.

다른 버전의 Teleport를 사용하려면 teleportVersionOverride 값을 설정하십시오.

다음은 3개의 복제본을 사용하도록 차트를 설정하는 예입니다:

위의 gcp-values.yaml 파일을 편집하고 적절한 변경 사항을 만드세요.

이 명령을 사용하여 gcp-values.yaml 파일의 값을 사용하여 배포를 업그레이드하십시오:

helm upgrade teleport teleport/teleport-cluster \ --namespace teleport \ -f gcp-values.yaml

이 명령을 실행하고 명령줄 매개변수를 적절하게 수정하세요:

helm upgrade teleport teleport/teleport-cluster \ --namespace teleport \ --set highAvailability.replicaCount=3
Note

chartMode , clusterName 또는 모든 gcp 설정을 변경하려면, 먼저 기존 차트를 제거한 후 적절한 값으로 새 버전을 설치해야 합니다.

Teleport 제거

teleport-cluster 차트를 제거하려면 helm uninstall <release-name>을 사용하십시오. 예를 들면:

helm --namespace teleport uninstall teleport

cert-manager 제거하기

나중에 cert-manager 설치를 제거하려면 다음 명령어를 사용할 수 있습니다:

helm --namespace cert-manager uninstall cert-manager

다음 단계

이제 Teleport 클러스터를 배포했으므로, 사용자를 등록하고 RBAC 설정을 시작하는 방법을 알아보려면 접근 관리 섹션을 읽어보십시오.

고가용성에 대한 더 많은 세부정보는 Helm 차트 참조의 고가용성 섹션을 참조하십시오.

Teleport 원문 보기