이 가이드에서는 텔레포트 Helm 차트와 Google Cloud Platform 제품(Firestore 및 Google Cloud Storage)을 사용하여 Kubernetes에서 여러 복제본으로 고가용성 텔레포트 클러스터를 설정하는 방법을 설명합니다.
이미 다른 플랫폼에서 텔레포트를 실행 중이라면, 기존 텔레포트 배포를 사용하여 Kubernetes 클러스터에 액세스할 수 있습니다. 가이드를 따르세요 Kubernetes 클러스터를 텔레포트에 연결합니다.
Teleport Enterprise Cloud가 이 설정을 자동으로 처리하므로, 귀하는 즉시 안전한 인프라 접근을 제공할 수 있습니다.
무료 체험으로 Teleport Enterprise Cloud를 시작하세요.
전제 조건
- Kubernetes >= v1.17.0
- Helm >= v3.4.2
Teleport의 차트는 Helm 버전 3을 사용해야 합니다. 이 지침을 따라 Helm 3을 설치하세요.
이 가이드 전반에 걸쳐 helm
및 kubectl
바이너리가 PATH
에 있는 것으로 가정합니다:
helm versionversion.BuildInfo{Version:"v3.4.2"}
kubectl versionClient 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의 "역할" 섹션으로 이동합니다.
- 상단에서 "역할 생성" 버튼을 클릭합니다.
- "Storage Bucket Creator" 역할의 세부정보를 입력합니다(우리는
storage-bucket-creator-role
라는 이름 사용을 권장합니다).
- "권한 추가" 버튼을 클릭합니다.
- "필터" 상자를 사용하여
storage.buckets.create
를 입력하고 목록에서 선택합니다.
- 목록에서
storage.buckets.create
권한을 체크하고 "추가" 버튼을 클릭하여 역할에 추가합니다.
- 모든 설정이 성공적으로 입력되면 "생성" 버튼을 클릭합니다.
Cloud DNS 권한을 부여하는 IAM 역할 생성
Google Cloud IAM & Admin의 "역할" 섹션으로 이동합니다.
- 상단에서 "역할 생성" 버튼을 클릭합니다.
- "DNS Updater" 역할의 세부정보를 입력합니다(우리는
dns-updater-role
라는 이름 사용을 권장합니다).
- "권한 추가" 버튼을 클릭합니다.
- "필터" 상자를 사용하여 아래의 각 권한을 목록에서 찾아 추가합니다.
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
- 모든 설정이 성공적으로 입력되면 "생성" 버튼을 클릭합니다.
Teleport Helm 차트를 위한 서비스 계정 생성
이미 사용하려는 적절하게 프로비저닝된 서비스 계정의 JSON 개인 키가 있는 경우, 이 생성 과정을 건너뛰고 아래의 "서비스 계정의 JSON 개인 키를 포함하는 Kubernetes 비밀 생성하기" 섹션으로 이동할 수 있습니다.
Google Cloud IAM & Admin의 "서비스 계정" 섹션으로 이동합니다.
- 상단에서 "서비스 계정 생성" 버튼을 클릭합니다.
- 서비스 계정의 세부정보를 입력하고(우리는
teleport-helm
이라는 이름 사용을 권장합니다) "생성" 버튼을 클릭합니다.
- "이 서비스 계정에 프로젝트 액세스를 부여하세요" 섹션에서 이 네 가지 역할을 추가합니다:
역할 | 목적 |
---|---|
storage-bucket-creator-role | 저장소 버킷 작성 허용 역할 |
dns-updater-role | Cloud DNS 레코드 업데이트 허용 역할 |
Cloud Datastore Owner | Cloud Datastore 컬렉션 생성 권한 부여 |
Storage Object Admin | Google Cloud 저장소 객체의 읽기/쓰기/삭제 허용 |
- "계속" 버튼을 클릭하여 이러한 설정을 저장한 후, "생성" 버튼을 클릭하여 서비스 계정을 생성합니다.
서비스 계정을 위한 액세스 키 생성
Google Cloud IAM & Admin의 "서비스 계정" 뷰로 돌아갑니다.
- 방금 생성한
teleport-helm
서비스 계정을 클릭합니다.
- 상단의 "키" 탭을 클릭하고 "키 추가"를 클릭합니다. "JSON"을 선택하고 "생성"을 클릭합니다.
- JSON 개인 키가 컴퓨터에 다운로드됩니다. 파일 이름(
bens-demos-24150b1a0a7f.json
예제)을 기록해두세요. 나중에 사용할 필요가 있습니다.
서비스 계정의 JSON 개인 키를 포함하는 Kubernetes 비밀 생성
JSON 개인 키가 방금 저장된 경로를 찾습니다(아마도 브라우저의 기본 "다운로드" 디렉토리일 것입니다).
kubectl
을 사용하여 teleport
네임스페이스를 만들고, 보안 정책을 설정한 후 JSON 개인 키 경로를 사용하여 비밀을 생성합니다:
kubectl create namespace teleportnamespace/teleport createdkubectl label namespace teleport 'pod-security.kubernetes.io/enforce=baseline'namespace/teleport labeledkubectl --namespace teleport create secret generic teleport-gcp-credentials --from-file=gcp-credentials.json=/path/to/downloads/bens-demos-24150b1a0a7f.jsonsecret/teleport-gcp-credentials created
만약 텔레포트 차트를 특정 네임스페이스에 설치한다면, 생성한 teleport-gcp-credentials
비밀도 같은 네임스페이스에 추가되어야 합니다.
기본적으로 비밀의 이름은 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.iohelm repo updatehelm 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.com | Let's Encrypt에서 소통을 받을 이메일 주소 |
example.com | 텔레포트 클러스터를 호스팅하는 Cloud DNS 도메인의 이름 |
gcp-project-id | Cloud 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
여기 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
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
클러스터가 구성된 후에는 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=teleportRELEASE_NAME=teleportMYIP=$(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
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 차트 참조의 고가용성 섹션을 참조하세요.