Infograb logo
GCP, GKE 및 Helm을 사용하여 HA 텔레포트 클러스터 실행

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

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

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 리포지토리를 설정하세요. Teleport Helm 리포지토리에 호스팅된 차트를 설치하도록 Helm을 허용하세요:

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

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

helm repo update
노트

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

2단계/6. Google Cloud IAM 구성

텔레포트가 Firestore 컬렉션, 색인 및 필요한 Google Cloud Storage 버킷을 생성할 수 있도록 하려면, 이 서비스를 사용할 수 있는 권한이 있는 Google Cloud 서비스 계정을 구성해야 합니다.

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

Google Cloud IAM & Admin의 "역할" 섹션으로 이동합니다.

  1. 상단에서 "역할 생성" 버튼을 클릭합니다.
Roles section
Roles section
  1. "Storage Bucket Creator" 역할의 세부정보를 입력합니다(우리는 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 & Admin의 "역할" 섹션으로 이동합니다.

  1. 상단에서 "역할 생성" 버튼을 클릭합니다.
Roles section
Roles section
  1. "DNS Updater" 역할의 세부정보를 입력합니다(우리는 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. 상단에서 "서비스 계정 생성" 버튼을 클릭합니다.
Create service account
Create service account
  1. 서비스 계정의 세부정보를 입력하고(우리는 teleport-helm이라는 이름 사용을 권장합니다) "생성" 버튼을 클릭합니다.
Enter service account details
Enter service account details
  1. "이 서비스 계정에 프로젝트 액세스를 부여하세요" 섹션에서 이 네 가지 역할을 추가합니다:
역할목적
storage-bucket-creator-role저장소 버킷 작성 허용 역할
dns-updater-roleCloud DNS 레코드 업데이트 허용 역할
Cloud Datastore OwnerCloud Datastore 컬렉션 생성 권한 부여
Storage Object AdminGoogle Cloud 저장소 객체의 읽기/쓰기/삭제 허용
Add roles
Add roles
  1. "계속" 버튼을 클릭하여 이러한 설정을 저장한 후, "생성" 버튼을 클릭하여 서비스 계정을 생성합니다.

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

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

  1. 방금 생성한 teleport-helm 서비스 계정을 클릭합니다.
Click on the service account
Click on the service account
  1. 상단의 "키" 탭을 클릭하고 "키 추가"를 클릭합니다. "JSON"을 선택하고 "생성"을 클릭합니다.
Create JSON key
  1. JSON 개인 키가 컴퓨터에 다운로드됩니다. 파일 이름(bens-demos-24150b1a0a7f.json 예제)을 기록해두세요. 나중에 사용할 필요가 있습니다.
Private key saved
Private key saved

서비스 계정의 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-gcp-credentials 비밀도 같은 네임스페이스에 추가되어야 합니다.

Note

기본적으로 비밀의 이름은 teleport-gcp-credentials로 구성됩니다.

이미 비밀을 생성한 경우, 이 생성 과정을 건너뛰고 gcp.credentialSecretName를 사용하여 비밀의 이름을 지정할 수 있습니다.

사용되는 모든 비밀에 저장된 자격 증명 파일은 키 이름 gcp-credentials.json을 가져야 합니다.

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

cert-manager 문서를 참조하세요.

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

텔레포트를 설치할 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.com텔레포트 클러스터를 호스팅하는 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 인증 서비스는 Teleport Enterprise 계정을 인증하기 위해 라이선스 파일을 읽습니다.

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

라이선스 파일로부터 비밀을 생성합니다. 텔레포트는 파일 이름이 license.pem인 한 이 비밀을 자동으로 발견합니다.

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

GCP 프로젝트에 텔레포트를 설치하는 것이 처음이라면, 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             # 텔레포트 백엔드를 위한 Firestore 컬렉션
  auditLogTable: teleport-helm-events             # 텔레포트 감사 로그를 위한 Firestore 컬렉션(백엔드 컬렉션과는 달라야 함)
  auditLogMirrorOnStdout: false                   # 감사 로그 항목을 stdout에 JSON 형식으로 미러링할지 여부(외부 로그 수집기에 유용)
  sessionRecordingBucket: teleport-helm-sessions  # 텔레포트 세션 녹화를 위해 사용할 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             # 텔레포트 백엔드를 위한 Firestore 컬렉션
  auditLogTable: teleport-helm-events             # 텔레포트 감사 로그를 위한 Firestore 컬렉션(백엔드 컬렉션과는 달라야 함)
  auditLogMirrorOnStdout: false                   # 감사 로그 항목을 stdout에 JSON 형식으로 미러링할지 여부(외부 로그 수집기에 유용)
  sessionRecordingBucket: teleport-helm-sessions  # 텔레포트 세션 녹화를 위해 사용할 Google Cloud Storage 버킷
highAvailability:
  replicaCount: 2                                 # 구성할 복제본 수
  certManager:
    enabled: true                                 # TLS 인증서를 얻기 위해 cert-manager 지원 활성화
    issuerName: letsencrypt-production            # 사용할 cert-manager Issuer 이름(위에서 구성됨)
enterprise: true                                  # 텔레포트 엔터프라이즈 배포라는 것을 나타냄

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은 애플리케이션 접근을 위해 구성한 각 애플리케이션에 서브도메인을 할당합니다. 예를 들어, 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 클라우드 플랫폼을 사용하는 경우, DNS 업데이트가 필요하지 않습니다. 왜냐하면 Teleport 클러스터가 자동으로 서브도메인과 서명된 TLS 인증서를 제공하기 때문입니다.

다음은 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. 텔레포트 사용자 생성

텔레포트에 로그인할 수 있는 사용자를 생성합니다. 이는 텔레포트 인증 서버에서 이루어져야 하므로 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이 사용자가 액세스할 수 있는 텔레포트 프록시를 가리키는지 확인하세요.
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이 사용자가 액세스할 수 있는 텔레포트 프록시를 가리키는지 확인하세요.

사용자 생성 링크를 로드하여 비밀번호를 생성하고 웹 UI를 통해 텔레포트 사용자에 대한 다중 요소 인증을 설정합니다.

고가용성

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

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

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

Helm은 기본적으로 리포지토리에 있는 최신 차트를 사용하며, 이는 최신 버전의 텔레포트와도 일치합니다. helm repo update를 실행하여 리포지토리를 최신 상태로 유지할 수 있습니다.

다른 버전의 텔레포트를 사용하려면 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-cluster 차트를 제거하려면 helm uninstall <release-name>을 사용합니다. 예를 들면:

helm --namespace teleport uninstall teleport

cert-manager 제거

이후 cert-manager 설치를 삭제하려면 다음 명령을 사용할 수 있습니다:

helm --namespace cert-manager uninstall cert-manager

다음 단계

텔레포트 클러스터를 배포했으므로 액세스 관리 섹션을 읽고 사용자 등록 및 RBAC 설정을 시작하세요.

고가용성에 대한 자세한 내용은 Helm 차트 참조의 고가용성 섹션을 참조하세요.

Teleport 원문 보기