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

이 가이드에서는 Teleport Helm 차트와 Microsoft Azure 관리 서비스(컨테이너 서비스, PostgreSQL 데이터베이스, Blob 저장소)를 사용하여 Kubernetes에서 여러 복제본으로 고가용성 Teleport 클러스터를 설정하는 방법을 설명합니다.

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

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

또한, 이 가이드를 따르려면 azure-cli 2.51 이상이 필요합니다. Azure CLI 설치 방법 문서를 참조하세요.

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

이 가이드에서는 워크로드 아이덴티티를 사용하여 Teleport가 PostgreSQL 및 Blob 저장소에 인증하므로, 아직 활성화되지 않은 경우 AKS 클러스터에서 워크로드 아이덴티티 및 OIDC 발급자를 활성화해야 합니다:

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

1/5단계. Teleport Helm 차트 저장소 추가

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

Helm이 Teleport 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)"

워크로드 아이덴티티를 사용하여 이러한 서비스에 인증하므로, Auth 서비스에서 사용하는 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 Auth 서비스는 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를 가져옵니다:

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
NOTE: `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
NOTE: `teleport.example.com:443` 가 사용자가 접근할 수 있는 Teleport 프록시를 가리키는지 확인하십시오.

사용자 생성을 위한 링크를 열어 비밀번호를 생성하고 웹 UI를 통해 Teleport 사용자에 대한 다단계 인증을 설정합니다.

고가용성

이 가이드에서는 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 클러스터를 배포했으므로 액세스 관리 섹션을 읽어 사용자를 등록하고 RBAC를 설정하는 방법을 시작하세요.

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

Teleport 원문 보기