Infograb logo
Microsoft Azure, AKS 및 Helm을 사용한 HA Teleport 클러스터 실행

이 가이드에서는 Microsoft Azure 관리 서비스(쿠버네티스 서비스, PostgreSQL 데이터베이스, Blob 스토리지)를 사용하여 Teleport Helm 차트로 여러 복제본을 가진 고가용성 Teleport 클러스터를 설정하는 방법을 설명합니다.

기존 Teleport 클러스터가 있습니까?

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

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 명령을 실행하여 이를 볼 수 있습니다.

이러한 관행이 문서에서 사용되는 예제에 반드시 반영되지 않는 점에 유의해야 합니다. 문서의 예제는 주로 시연 및 개발 환경을 위한 것입니다.

또한, 이러한 지침을 따르려면 azure-cli 2.51 이상이 필요합니다. Azure CLI 설치 방법을 참조하세요.

설치한 후, az login을 입력하여 로그인했는지 확인하십시오. 이 가이드에서는 사용자가 Azure Database for PostgreSQL 인스턴스, Azure Blob Storage 계정, 관리 ID를 생성할 수 있는 권한이 있고, 이러한 역할 할당을 추가할 수 있는 권한이 있다고 가정합니다. Azure DNS 존과 cert-manager가 설치되고 해당 Azure DNS 존에 대한 인증서를 발급하도록 구성된 AKS 클러스터에도 접근할 수 있어야 합니다.

이 가이드에서는 워크로드 ID를 사용하여 Teleport를 PostgreSQL 및 Blob 스토리지에 인증할 것이므로, OIDC 발급자가 이미 활성화되어 있지 않은 경우 AKS 클러스터에서 워크로드 ID와 OIDC 발급자를 활성화해야 합니다:

az aks update --resource-group aks-rg --name aks-name --enable-oidc-issuer --enable-workload-identity

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

Teleport Helm 리포지토리를 설정하세요. Teleport Helm 리포지토리에 호스팅된 차트를 설치하도록 Helm을 허용하세요:

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

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

helm repo update

2단계/5. PostgreSQL 및 Blob 스토리지 설정

편의성을 위해 새 리소스 그룹에 필요한 모든 리소스를 생성할 것입니다. 기존 리소스 그룹을 사용하려면 이 단계를 건너뛸 수 있습니다.

az group create --name teleport-rg --location region

Teleport가 이러한 서비스를 사용하려면 관리 ID가 필요합니다.

az identity create --resource-group teleport-rg --name teleport-id

Azure에서 Teleport의 권장 HA 배포는 클러스터 상태와 감사 로그 항목을 PostgreSQL 인스턴스에 저장합니다. 이 가이드에서는 퍼블릭 액세스 가능한 것을 생성하지만, 이를 AKS 클러스터의 IP 주소로 제한하거나 클러스터가 사용하고 있는 동일한 가상 네트워크에 연결된 것을 만들 수 있습니다.

지역에 따라 ZoneRedundant 고가용성을 사용할 수 있거나, SameZone 고가용성을 사용해야 할 수도 있습니다.

az postgres flexible-server create --resource-group teleport-rg --name teleport-pg \ --active-directory-auth Enabled --password-auth Disabled \ --version 15 --high-availability SameZone --public-access All
az postgres flexible-server parameter set --resource-group teleport-rg --name teleport-pg \ --name wal_level --value logical
az postgres flexible-server restart --resource-group teleport-rg --name teleport-pg
az postgres flexible-server ad-admin create --resource-group teleport-rg --server-name teleport-pg \ --display-name pguser --type ServicePrincipal \ --object-id "$(az identity show --resource-group teleport-rg --name teleport-id --query principalId -o tsv)"

Teleport는 Blob 스토리지 계정에 세션 기록을 저장합니다. 선택적으로 AKS 아웃바운드 주소로의 접근을 제한하거나 계정을 AKS 클러스터가 사용하고 있는 가상 네트워크의 일부로 만들 수 있습니다.

az storage account create --resource-group teleport-rg --name teleport-blob \ --allow-blob-public-access false
az role assignment create --role "Storage Blob Data Owner" --assignee-principal-type ServicePrincipal \ --assignee-object-id "$(az identity show --resource-group teleport-rg --name teleport-id --query principalId -o tsv)" \ --scope "$(az storage account show --resource-group teleport-rg --name teleportblob --query id -o tsv)""

서비스에 인증하기 위해 Workload Identity를 사용하므로 Auth Service에 의해 사용되는 Teleport 서비스 계정에 대한 연합 자격 증명을 추가합니다.

az identity federated-credential create --resource-group teleport-rg --identity-name teleport-id \ --name aks --audience api://AzureADTokenExchange \ --subject system:serviceaccount:teleport-ns:teleport-release \ --issuer "$(az aks show --resource-group aks-rg --name aks-name --query oidcIssuerProfile.issuerUrl -o tsv)"

3단계/5. 클러스터 구성 값을 설정합니다

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

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

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

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

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

이제 teleport-cluster Helm 차트를 azure 모드를 사용하도록 구성합니다.

먼저 teleport-id ID의 클라이언트 ID를 가져옵니다:

az identity show --resource-group teleport-rg --name teleport-id --query clientId -o tsv
teleport-client-id-uuid-123456789012

그리고 위에서 선택한 값을 포함하는 azure-values.yaml이라는 파일을 만듭니다:

chartMode: azure
# 클러스터의 이름. 나중에 DNS에서 구성할 FQDN을 사용하세요
clusterName: teleport.example.com
azure:
  databaseHost: "teleport-pg.postgres.database.azure.com"
  databaseUser: "pguser"
  sessionRecordingStorageAccount: "teleportblob.blob.core.windows.net"
  # 감사 로그 항목을 JSON 형식으로 stdout에 미러링할지 여부 (외부 로그 수집기에 유용함)
  auditLogMirrorOnStdout: false
  clientID: "teleport-client-id-uuid-123456789012"
highAvailability:
  # 구성할 복제본의 수
  replicaCount: 2
  certManager:
    # TLS 인증서를 얻기 위해 cert-manager 지원 활성화
    enabled: true
    # 사용할 cert-manager GlobalIssuer 또는 Issuer의 이름
    issuerName: letsencrypt-production
    issuerKind: ClusterIssuer
# Kubernetes 1.23 이상을 실행 중인 경우 PodSecurityPolicies 비활성화
podSecurityPolicy:
  enabled: false
chartMode: azure
# 클러스터의 이름. 나중에 DNS에서 구성할 FQDN을 사용하세요
clusterName: teleport.example.com
azure:
  databaseHost: "teleport-pg.postgres.database.azure.com"
  databaseUser: "pguser"
  sessionRecordingStorageAccount: "teleportblob.blob.core.windows.net"
  # 감사 로그 항목을 JSON 형식으로 stdout에 미러링할지 여부 (외부 로그 수집기에 유용함)
  auditLogMirrorOnStdout: false
  clientID: "teleport-client-id-uuid-123456789012"
highAvailability:
  # 구성할 복제본의 수
  replicaCount: 2
  certManager:
    # TLS 인증서를 얻기 위해 cert-manager 지원 활성화
    enabled: true
    # 사용할 cert-manager GlobalIssuer 또는 Issuer의 이름
    issuerName: letsencrypt-production
    issuerKind: ClusterIssuer
# Kubernetes 1.23 이상을 실행 중인 경우 PodSecurityPolicies 비활성화
podSecurityPolicy:
  enabled: false
# 이것이 Teleport Enterprise 배포임을 알립니다
enterprise: true

다음 명령을 사용하여 azure-values.yaml 파일에서 값을 사용하여 차트를 설치합니다:

helm install teleport-release teleport/teleport-cluster \ --create-namespace --namespace teleport-ns \ --values azure-values.yaml
Note

클러스터가 구성된 후에는 clusterName을 변경할 수 없으므로 현명하게 선택해야 합니다. 외부에서 Teleport 클러스터에 접근하는 데 사용할 전체적으로 자격이 있는 도메인 이름을 사용하는 것이 좋습니다.

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

kubectl --namespace teleport-ns get all

NAME READY STATUS RESTARTS AGEpod/teleport-auth-57989d4cb-4q2ds 1/1 Running 0 22hpod/teleport-auth-57989d4cb-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-v13 ClusterIP None <none> <none> 22hservice/teleport-auth-v14 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-57989d4cb 2 2 2 22hreplicaset.apps/teleport-proxy-c6bf55cfc 2 2 2 22h

4단계/5. DNS 설정

이제 teleport.example.com*.teleport.example.com의 DNS A 레코드를 설정하겠습니다. example.com에 루트된 Azure DNS 존을 사용합니다. 다른 DNS 호스팅 서비스를 사용하는 경우 대신 그들의 지침에 따라 진행하세요.

PREFIX=teleport
ZONE=example.com
ZONE_RG=dns-rg
external_ip="$(kubectl --namespace teleport-ns get service/teleport-release -o jsonpath='{.status.loadBalancer.ingress[*].ip}')"
az network dns record-set a add-record --resource-group ${ZONE_RG} --zone-name ${ZONE} --record-set-name ${PREFIX} --ipv4-address "${external_ip}"
az network dns record-set a add-record --resource-group ${ZONE_RG} --zone-name ${ZONE} --record-set-name "*.${PREFIX}" --ipv4-address "${external_ip}"

5단계/5. Teleport 사용자 만들기

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

kubectl --namespace teleport-ns exec deploy/teleport-release-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-ns exec deploy/teleport-release-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 프록시를 가리키는지 확인하십시오.

사용자 생성을 완료하고 multi-factor 인증을 설정하기 위해 웹 UI를 통해 링크를 로드합니다.

고가용성

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

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

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

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

다른 버전의 Teleport를 사용하려면 Helm에 --version 인수를 전달하십시오:

helm upgrade --version 14.0.0 \ teleport-release teleport/teleport-cluster \ --namespace teleport-ns \ -f azure-values.yaml

차트를 3개의 복제본을 사용하도록 설정하는 예시는 다음과 같습니다:

위에서 수정한 azure-values.yaml 파일을 열어 적절한 변경을 합니다.

다음 명령을 사용하여 azure-values.yaml 파일의 값을 사용하여 배포를 업그레이드합니다:

helm upgrade teleport-release teleport/teleport-cluster \ --namespace teleport-ns \ -f azure-values.yaml

다음 명령을 실행하여 적절하게 명령 줄 매개변수를 편집합니다:

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

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

Teleport 제거

teleport-cluster 차트를 제거하려면 helm uninstall을 사용하세요. 예를 들어:

helm --namespace teleport-ns uninstall teleport-release

다음 단계

Teleport 클러스터를 배포한 후, Access 관리 섹션을 읽고 사용자를 등록하고 RBAC를 설정하는 데 착수하십시오.

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

Teleport 원문 보기