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

이 가이드에서는 Teleport Helm 차트를 사용하여 AWS EKS에서 실행되는 높은 가용성(HA) Teleport 클러스터를 설정합니다.

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

다른 플랫폼에서 이미 Teleport를 실행 중이라면, 기존 Teleport 배포를 사용하여 Kubernetes 클러스터에 접근할 수 있습니다. 가이드를 따르세요 Kubernetes 클러스터를 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 명령을 실행하여 이를 볼 수 있습니다.

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

Kubernetes 네임스페이스 및 Helm 릴리스 이름 선택

Note

시작하기 전에 Kubernetes 네임스페이스와 Helm 릴리스 이름을 설정하면 설치 명령어를 더 쉽게 복사/붙여넣을 수 있습니다.

여기서 입력할 값이 무엇인지 모른다면, 두 값 모두에 teleport를 사용하세요.

네임스페이스: namespace

릴리스 이름: release-name

단계 1/7. Helm 설치

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+"}

단계 2/7. Teleport Helm 차트 저장소 추가

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

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

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

helm repo update

단계 3/7. AWS IAM 구성 설정

Teleport가 DynamoDB 테이블, 인덱스 및 필요한 S3 저장소 버킷을 관리할 수 있도록 하려면, AWS IAM 정책을 설정하여 접근을 허용해야 합니다.

Note

이러한 IAM 정책을 AWS 계정에 추가한 후 EKS 노드 그룹과 연결된 역할에 부여하세요.

DynamoDB IAM 정책

On startup, the Teleport Auth Service checks whether the DynamoDB table you have
지정한 구성 파일에 존재하는지 확인합니다. 테이블이 존재하지 않는 경우,
Auth Service는 새 테이블을 생성하려고 시도합니다.

Auth Service가 DynamoDB 테이블을 관리하기 위해 요구하는 IAM 권한은
테이블을 직접 생성할 예정인지 아니면 Auth Service가 당신을 대신하여
자동으로 생성하고 구성할 것인지에 따라 다릅니다:

만약 DynamoDB 테이블을 직접 관리하기로 선택했다면, 다음 단계를
따라야 하며, 아래에 자세하게 설명하겠습니다:

  • 클러스터 상태 테이블 생성하기.
  • 감사 이벤트 테이블 생성하기.
  • IAM 정책을 생성하고 이를 Teleport Auth Service의 IAM
    아이덴티티에 연결하기.

클러스터 상태 테이블 생성하기

클러스터 상태 테이블은 다음 속성 정의가 필요합니다:

이름유형
HashKeyS
FullPathS

테이블은 또한 다음의 키 스키마 요소를 포함해야 합니다:

이름유형
HashKeyHASH
FullPathRANGE

감사 이벤트 테이블 생성하기

감사 이벤트 테이블은 다음 속성 정의가 필요합니다:

이름유형
SessionIDS
EventIndexN
CreatedAtDateS
CreatedAtN

테이블은 또한 다음의 키 스키마 요소를 포함해야 합니다:

이름유형
CreatedAtDateHASH
CreatedAtRANGE

IAM 정책 생성 및 연결

다음 IAM 정책을 생성하고 이를 Teleport Auth Service의 IAM
아이덴티티에 연결하기.

아래 정책 예제를 참고하여 다음 값을 바꿔야 합니다:

플레이스홀더 값바꿀 값
us-west-2AWS 리전
1234567890AWS 계정 ID
teleport-helm-backendTeleport 백엔드에 사용할 DynamoDB 테이블 이름
teleport-helm-eventsTeleport 감사 로그에 사용할 DynamoDB 테이블 이름 (백엔드 테이블과는 다르게 해야 합니다)
{  
    "Version": "2012-10-17",  
    "Statement": [  
        {  
            "Sid": "ClusterStateStorage",  
            "Effect": "Allow",  
            "Action": [  
                "dynamodb:BatchWriteItem",  
                "dynamodb:UpdateTimeToLive",  
                "dynamodb:PutItem",  
                "dynamodb:DeleteItem",  
                "dynamodb:Scan",  
                "dynamodb:Query",  
                "dynamodb:DescribeStream",  
                "dynamodb:UpdateItem",  
                "dynamodb:DescribeTimeToLive",  
                "dynamodb:DescribeTable",  
                "dynamodb:GetShardIterator",  
                "dynamodb:GetItem",  
                "dynamodb:ConditionCheckItem",  
                "dynamodb:UpdateTable",  
                "dynamodb:GetRecords",  
                "dynamodb:UpdateContinuousBackups"  
            ],  
            "Resource": [  
                "arn:aws:dynamodb:us-west-2:1234567890:table/teleport-helm-backend",  
                "arn:aws:dynamodb:us-west-2:1234567890:table/teleport-helm-backend/stream/*"  
            ]  
        },  
        {  
            "Sid": "ClusterEventsStorage",  
            "Effect": "Allow",  
            "Action": [  
                "dynamodb:BatchWriteItem",  
                "dynamodb:UpdateTimeToLive",  
                "dynamodb:PutItem",  
                "dynamodb:DescribeTable",  
                "dynamodb:DeleteItem",  
                "dynamodb:GetItem",  
                "dynamodb:Scan",  
                "dynamodb:Query",  
                "dynamodb:UpdateItem",  
                "dynamodb:DescribeTimeToLive",  
                "dynamodb:UpdateTable",  
                "dynamodb:UpdateContinuousBackups"  
            ],  
            "Resource": [  
                "arn:aws:dynamodb:us-west-2:1234567890:table/teleport-helm-events",  
                "arn:aws:dynamodb:us-west-2:1234567890:table/teleport-helm-events/index/*"  
            ]  
        }  
    ]  
}  

지속적인 백업을 비활성화하는 경우 dynamodb:UpdateContinuousBackups 권한을 생략할 수 있습니다.

아래 정책 예제를 참고하여 다음 값을 바꿔야 합니다:

플레이스홀더 값바꿀 값
us-west-2AWS 리전
1234567890AWS 계정 ID
teleport-helm-backendTeleport 백엔드에 사용할 DynamoDB 테이블 이름
teleport-helm-eventsTeleport 감사 로그에 사용할 DynamoDB 테이블 이름 (백엔드 테이블과는 다르게 해야 합니다)
{  
    "Version": "2012-10-17",  
    "Statement": [  
        {  
            "Sid": "ClusterStateStorage",  
            "Effect": "Allow",  
            "Action": [  
                "dynamodb:BatchWriteItem",  
                "dynamodb:UpdateTimeToLive",  
                "dynamodb:PutItem",  
                "dynamodb:DeleteItem",  
                "dynamodb:Scan",  
                "dynamodb:Query",  
                "dynamodb:DescribeStream",  
                "dynamodb:UpdateItem",  
                "dynamodb:DescribeTimeToLive",  
                "dynamodb:CreateTable",  
                "dynamodb:DescribeTable",  
                "dynamodb:GetShardIterator",  
                "dynamodb:GetItem",  
                "dynamodb:ConditionCheckItem",  
                "dynamodb:UpdateTable",  
                "dynamodb:GetRecords",  
                "dynamodb:UpdateContinuousBackups"  
            ],  
            "Resource": [  
                "arn:aws:dynamodb:us-west-2:1234567890:table/teleport-helm-backend",  
                "arn:aws:dynamodb:us-west-2:1234567890:table/teleport-helm-backend/stream/*"  
            ]  
        },  
        {  
            "Sid": "ClusterEventsStorage",  
            "Effect": "Allow",  
            "Action": [  
                "dynamodb:CreateTable",  
                "dynamodb:BatchWriteItem",  
                "dynamodb:UpdateTimeToLive",  
                "dynamodb:PutItem",  
                "dynamodb:DescribeTable",  
                "dynamodb:DeleteItem",  
                "dynamodb:GetItem",  
                "dynamodb:Scan",  
                "dynamodb:Query",  
                "dynamodb:UpdateItem",  
                "dynamodb:DescribeTimeToLive",  
                "dynamodb:UpdateTable",  
                "dynamodb:UpdateContinuousBackups"  
            ],  
            "Resource": [  
                "arn:aws:dynamodb:us-west-2:1234567890:table/teleport-helm-events",  
                "arn:aws:dynamodb:us-west-2:1234567890:table/teleport-helm-events/index/*"  
            ]  
        }  
    ]  
}  

S3 IAM 정책

Teleport Auth Service가 시작될 때, 세션 기록 저장소에 대해 구성된 S3 버킷이
존재하는지 확인합니다. 존재하지 않으면, Auth Service는 버킷을 생성하고
구성하려고 시도합니다.

Auth Service가 세션 기록 버킷을 관리하는 데 필요한 IAM 권한은
직접 버킷을 생성할 것인지, 아니면 Auth Service가 생성하고
구성하도록 활성화할 것인지에 따라 다릅니다:

Teleport는 버전 관리가 활성화된 S3 버킷만 사용할 것입니다. 이는
세션 로그가 영구적으로 수정되거나 삭제될 수 없음을 보장하며,
Teleport는 항상 기록의 가장 오래된 버전을 확인합니다.

정책 예제에서 다음 값을 바꿔야 합니다:

Placeholder valueReplace with
your-sessions-bucketName to use for the Teleport S3 session recording bucket
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "BucketActions",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketVersions",
                "s3:ListBucketMultipartUploads",
                "s3:ListBucket",
                "s3:GetEncryptionConfiguration",
                "s3:GetBucketVersioning"
            ],
            "Resource": "arn:aws:s3:::your-sessions-bucket"
        },
        {
            "Sid": "ObjectActions",
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectVersion",
                "s3:GetObjectRetention",
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::your-sessions-bucket/*"
        }
    ]
}

정책 예제에서 다음 값을 바꿔야 합니다:

Placeholder valueReplace with
your-sessions-bucketName to use for the Teleport S3 session recording bucket
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "BucketActions",
            "Effect": "Allow",
            "Action": [
                "s3:PutEncryptionConfiguration",
                "s3:PutBucketVersioning",
                "s3:ListBucketVersions",
                "s3:ListBucketMultipartUploads",
                "s3:ListBucket",
                "s3:GetEncryptionConfiguration",
                "s3:GetBucketVersioning",
                "s3:CreateBucket"
            ],
            "Resource": "arn:aws:s3:::your-sessions-bucket"
        },
        {
            "Sid": "ObjectActions",
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectVersion",
                "s3:GetObjectRetention",
                "s3:*Object",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::your-sessions-bucket/*"
        }
    ]
}

단계 4/7. Teleport용 TLS 인증서 구성

이제 Teleport의 통신을 보호하고 외부 클라이언트가 연결할 수 있도록 TLS 인증서를 구성해야 합니다.

TLS 인증서를 프로비저닝하는 접근 방식에 따라 teleport-cluster 차트는 Kubernetes LoadBalancer 또는 Kubernetes Ingress를 배포하여 Teleport 프록시 서비스에 대한 들어오는 연결을 처리할 수 있습니다.

접근 방식 결정

AWS를 사용할 때 세 가지 지원되는 옵션이 있습니다. 이 옵션 중 하나만 선택해야 합니다:

접근 방식AWS 로드 밸런서 유형Kubernetes 트래픽 목적지기존 AWS LB 사용 가능?주의 사항
Using cert-managerNetwork Load Balancer (NLB)LoadBalancer아니오도메인에 대한 Route 53 도메인과 DNS 레코드를 변경할 IAM 권한이 설정된 Issuer가 필요함
Using AWS Certificate ManagerApplication Load Balancer (ALB)IngressKubernetes 클러스터에 설치된 AWS Load Balancer 컨트롤러가 작동 중이어야 함
Using your own TLS credentialsNetwork Load Balancer (NLB)LoadBalancer아니오Teleport의 웹 리스너를 보안하는 TLS 인증서의 유지 관리, 갱신 및 신뢰를 독립적으로 관리해야 함

Using cert-manager

ACME 챌린지를 통해 TLS 자격증명을 미리 프로비저닝하고 자동으로 갱신하기 위해 cert-manager를 사용할 수 있습니다.

EKS에서 AWS Private Certificate Authority (PCA)와 함께 cert-manager를 사용할 수 있습니다.

이 방법은 Kubernetes LoadBalancer를 사용하며, 들어오는 트래픽을 처리할 AWS Network Load Balancer(NLB)를 프로비저닝합니다.

Using AWS Certificate Manager

AWS Certificate Manager를 사용하여 AWS 관리 인증서로 TLS 종료를 처리할 수 있습니다.

이 방법은 Kubernetes Ingress를 사용하며, 기존에 없으면 AWS Application Load Balancer(ALB)를 프로비저닝할 수 있습니다. 또한 AWS Load Balancer 컨트롤러의 설치 및 설정이 필요합니다.

Layer 7 로드 밸런서를 사용할 때 다음과 같은 잠재적 제한 사항과 차이를 인지해야 합니다:

  • 명령줄에서 Kubernetes 클러스터에 연결하려면 tsh proxy kube 또는 tsh kubectl 명령을 사용해야 하며, tsh proxy db/tsh db connect 명령을 각각 사용해야 합니다. 이 모드에서 Teleport 리스터에 kubectl을 직접 연결할 수 없습니다.
  • 명령줄에서 데이터베이스에 연결하려면 tsh proxy db 또는 tsh db connect 명령을 사용해야 하며, 이 모드에서 Teleport 리스터에 데이터베이스 클라이언트를 직접 연결할 수 없습니다.
  • 이러한 요구 사항의 이유는 Teleport가 인증을 위해 X509 인증서를 사용하기 때문에 모든 수신 TLS 트래픽을 Teleport 프록시에서 직접 종료해야 하기 때문입니다. Layer 7 로드 밸런서를 사용할 때는 직접적으로 연결할 수 없으므로 tsh 클라이언트가 이 흐름을 직접 구현합니다 ALPN 연결 업그레이드를 사용하여.
  • tsh v13 이상의 사용이 필요합니다.
Warning

ALB와 함께 ACM을 사용하려면 클러스터에 필요한 IAM 권한과 함께 AWS Load Balancer 컨트롤러가 완전히 작동 중이어야 합니다. 이 가이드는 아래에서 더 많은 세부정보를 제공합니다.

Using your own TLS credentials

이 접근 방식에서는 Teleport 클러스터에 대한 TLS 인증서와 개인 키를 얻는 방법, 정기적으로 자격 증명을 갱신하는 방법을 결정해야 합니다. Let's Encrypt나 AWS Certificate Manager 대신 신뢰할 수 있는 내부 인증 기관을 사용하려는 경우 이 방법을 사용합니다. 이 방법은 Kubernetes LoadBalancer를 사용하며, 기본 AWS NLB를 프로비저닝합니다.

따를 단계

위의 세부정보를 기반으로 접근 방식을 선택한 후 아래에서 지침에 대한 올바른 탭을 선택하세요.

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

cert-manager를 사용할 계획이라면 Route53 레코드를 업데이트할 수 있도록 클러스터에 하나의 IAM 정책을 추가해야 합니다.

Route53 IAM 정책

이 정책은 cert-manager가 DNS01 Let's Encrypt 챌린지를 사용하여 Teleport 클러스터에 대한 TLS 인증서를 프로비저닝할 수 있도록 허용합니다.

다음 아래 정책 예제를 수정하여 이 값을 바꿔야 합니다:

플레이스홀더 값바꿀 값
Z0159221358P96JYAUAA4Teleport 클러스터를 호스팅하는 도메인의 Route 53 호스팅 존 ID
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "route53:GetChange",
            "Resource": "arn:aws:route53:::change/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "route53:ChangeResourceRecordSets",
                "route53:ListResourceRecordSets"
            ],
            "Resource": "arn:aws:route53:::hostedzone/Z0159221358P96JYAUAA4"
        }
    ]
}

cert-manager 설치

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 installCRDs=true \--set global.leaderElection.namespace=cert-manager \--set extraArgs="{--issuer-ambient-credentials}" # Issuer를 사용할 때 환경 AWS 자격 증명을 자동으로 마운트하려면 필요합니다

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

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

플레이스홀더 값바꿀 값
email@address.comLet's Encrypt로부터의 커뮤니케이션을 받을 이메일 주소
example.comTeleport 클러스터를 호스팅하는 Route 53 도메인의 이름
us-west-2클러스터가 실행 중인 AWS 리전
Z0159221358P96JYAUAA4Teleport 클러스터를 호스팅하는 도메인의 Route 53 호스팅 존 ID
cat << EOF > aws-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:
        route53:
          region: us-west-2
          hostedZoneID: Z0159221358P96JYAUAA4
EOF

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

kubectl create namespace namespace
kubectl label namespace teleport 'pod-security.kubernetes.io/enforce=baseline'
kubectl --namespace namespace create -f aws-issuer.yaml

이 단계에서는 Teleport가 TLS 자격 증명을 프로비저닝하는 데 AWS Certificate Manager (ACM)를 사용하도록 구성합니다.

전제 조건: AWS Load Balancer 컨트롤러 설치 및 구성

AWS Load Balancer Controller를 설치하는 방법에 대한 AWS에서 유지 관리하는 문서를 따르거나 이러한 지침을 계속 진행하기 전에 AWS LB 컨트롤러가 작동 중인지 확인해야 합니다. 이를 통해 Teleport 클러스터가 사용할 수 없습니다.

위의 AWS 가이드를 따르이면, 클러스터에서 AWS LB 컨트롤러가 실행 중인지 확인하려면 다음과 같이 레이블이 app.kubernetes.io/name=aws-load-balancer-controller인 포드를 찾아보세요:

kubectl get pods -A -l app.kubernetes.io/name=aws-load-balancer-controller
NAMESPACE NAME READY STATUS RESTARTS AGEkube-system aws-load-balancer-controller-655f647b95-5vz56 1/1 Running 0 109dkube-system aws-load-balancer-controller-655f647b95-b4brx 1/1 Running 0 109d

클러스터에 albIngressClass로 등록되어 있는지도 확인할 수 있습니다:

kubectl get ingressclass
NAME CONTROLLER PARAMETERS AGEalb ingress.k8s.aws/alb <none> 109d

ACM을 사용하여 TLS를 처리하려면, 아래 섹션에서 차트 값에 주석을 추가하여 사용할 ACM 인증서 ARN, 서비스 포트 및 기타 ALB 구성 매개 변수를 지정합니다.

arn:aws:acm:us-west-2:1234567890:certificate/12345678-43c7-4dd1-a2f6-c495b91ebece 사용하여 실질적인 ACM 인증서 ARN으로 바꾸세요.

기존 TLS 자격 증명을 사용하여 Teleport Web UI를 보안하기 위해 teleport-cluster Helm 차트를 구성할 수 있습니다.

다음 명령어를 사용하여 비밀을 생성하세요:

kubectl -n namespace create secret tls my-tls-secret --cert=/path/to/cert/file --key=/path/to/key/file

aws-values.yaml 파일을 편집하여 비밀의 이름을 참조하도록 변경하세요:

  tls:
    existingSecretName: my-tls-secret

단계 5/7. 클러스터 구성 값을 설정하십시오

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

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

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

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

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

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

chartMode: aws
clusterName: teleport.example.com                 # 클러스터의 이름. 아래 DNS에서 구성할 FQDN을 사용하세요.
proxyListenerMode: multiplex
aws:
  region: us-west-2                # AWS 리전
  backendTable: teleport-helm-backend # Teleport 백엔드로 사용할 DynamoDB 테이블
  auditLogTable: teleport-helm-events             # Teleport 감사 로그에 사용할 DynamoDB 테이블 (백엔드 테이블과는 달라야 함)
  auditLogMirrorOnStdout: false                   # 감사 로그 항목을 JSON 형식으로 stdout에 미러링할지 여부 (외부 로그 수집기에 유용)
  sessionRecordingBucket: your-sessions-bucket  # Teleport 세션 녹화를 위한 S3 버킷
  backups: true                                   # DynamoDB 백업을 켜거나 끌지 여부
  dynamoAutoScaling: false                        # Teleport가 DynamoDB의 자동 Scaling을 설정해야 하는지 여부.
highAvailability:
  replicaCount: 2                                 # 구성할 복제본 수
  certManager:
    enabled: true                                 # TLS 인증서를 받기 위해 cert-manager 지원을 활성화합니다
    issuerName: letsencrypt-production            # 사용할 cert-manager Issuer의 이름 (위에서 구성한 대로)
# Kubernetes 1.23 이상을 실행 중인 경우, PodSecurityPolicies를 비활성화해야 합니다
podSecurityPolicy:
  enabled: false
Note

AWS PCA와 함께 cert-manager를 사용하는 경우, 해당 설정을 확인해야 합니다. highAvailability.certManager.addCommonName: true로 값 파일을 설정해야 합니다. 또한 CA 인증서 (aws acm-pca get-certificate-authority-certificate --certificate-authority-arn <arn>)를 가져와 전체 인증서 체인을 비밀에 업로드하고, 비밀을 참조 하여 값을 파일에서 tls.existingCASecretName으로 설정해야 합니다.

chartMode: aws
clusterName: teleport.example.com                 # 클러스터의 이름. 아래 DNS에서 구성할 FQDN을 사용하세요.
proxyListenerMode: multiplex
service:
  type: ClusterIP
aws:
  region: us-west-2                # AWS 리전
  backendTable: teleport-helm-backend # Teleport 백엔드로 사용할 DynamoDB 테이블
  auditLogTable: teleport-helm-events             # Teleport 감사 로그에 사용할 DynamoDB 테이블 (백엔드 테이블과는 달라야 함)
  auditLogMirrorOnStdout: false                   # 감사 로그 항목을 JSON 형식으로 stdout에 미러링할지 여부 (외부 로그 수집기에 유용)
  sessionRecordingBucket: your-sessions-bucket  # Teleport 세션 녹화를 위한 S3 버킷
  backups: true                                   # DynamoDB 백업을 켜거나 끌지 여부
  dynamoAutoScaling: false                        # Teleport가 DynamoDB의 자동 Scaling을 설정해야 하는지 여부.
highAvailability:
  replicaCount: 2                                 # 구성할 복제본 수
ingress:
  enabled: true
  spec:
    ingressClassName: alb
annotations:
  ingress:
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/backend-protocol: HTTPS
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=350
    alb.ingress.kubernetes.io/healthcheck-protocol: HTTPS
    alb.ingress.kubernetes.io/success-codes: 200,301,302
    # 자신의 AWS 인증서 ARN으로 대체하세요
    alb.ingress.kubernetes.io/certificate-arn: "arn:aws:acm:us-west-2:1234567890:certificate/12345678-43c7-4dd1-a2f6-c495b91ebece"
# Kubernetes 1.23 이상을 실행 중인 경우, PodSecurityPolicies를 비활성화해야 합니다
podSecurityPolicy:
  enabled: false

내부 AWS 애플리케이션 로드 밸런서(ALB)를 사용하려면 alb.ingress.kubernetes.io/scheme 주석을 다음과 같이 수정해야 합니다:

  alb.ingress.kubernetes.io/scheme: internal

80 포트에서 HTTPS 요청을 443 포트로 자동으로 리다이렉트하려면, annotations.ingress 아래 두 값을 제공할 수도 있습니다:

  alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
  alb.ingress.kubernetes.io/ssl-redirect: '443'
chartMode: aws
clusterName: teleport.example.com                 # 클러스터의 이름. 아래 DNS에서 구성할 FQDN을 사용하세요.
proxyListenerMode: multiplex
aws:
  region: us-west-2                # AWS 리전
  backendTable: teleport-helm-backend # Teleport 백엔드로 사용할 DynamoDB 테이블
  auditLogTable: teleport-helm-events             # Teleport 감사 로그에 사용할 DynamoDB 테이블 (백엔드 테이블과는 달라야 함)
  auditLogMirrorOnStdout: false                   # 감사 로그 항목을 JSON 형식으로 stdout에 미러링할지 여부 (외부 로그 수집기에 유용)
  sessionRecordingBucket: your-sessions-bucket  # Teleport 세션 녹화를 위한 S3 버킷
  backups: true                                   # DynamoDB 백업을 켜거나 끌지 여부
  dynamoAutoScaling: false                        # Teleport가 DynamoDB의 자동 Scaling을 설정해야 하는지 여부.
highAvailability:
  replicaCount: 2                                 # 구성할 복제본 수
  certManager:
    enabled: true                                 # TLS 인증서를 받기 위해 cert-manager 지원을 활성화합니다
    issuerName: letsencrypt-production            # 사용할 cert-manager Issuer의 이름 (위에서 구성한 대로)
enterprise: true                                  # 이것이 Teleport Enterprise 배포임을 나타냅니다
# Kubernetes 1.23 이상을 실행 중인 경우, PodSecurityPolicies를 비활성화해야 합니다
podSecurityPolicy:
  enabled: false
Note

AWS PCA와 함께 cert-manager를 사용하는 경우, 해당 설정을 확인해야 합니다. highAvailability.certManager.addCommonName: true로 값 파일을 설정해야 합니다. 또한 CA 인증서 (aws acm-pca get-certificate-authority-certificate --certificate-authority-arn <arn>)를 가져와 전체 인증서 체인을 비밀에 업로드하고, 비밀을 참조 하여 값을 파일에서 tls.existingCASecretName으로 설정해야 합니다.

chartMode: aws
clusterName: teleport.example.com                 # 클러스터의 이름. 아래 DNS에서 구성할 FQDN을 사용하세요.
proxyListenerMode: multiplex
service:
  type: ClusterIP
aws:
  region: us-west-2                # AWS 리전
  backendTable: teleport-helm-backend # Teleport 백엔드로 사용할 DynamoDB 테이블
  auditLogTable: teleport-helm-events             # Teleport 감사 로그에 사용할 DynamoDB 테이블 (백엔드 테이블과는 달라야 함)
  auditLogMirrorOnStdout: false                   # 감사 로그 항목을 JSON 형식으로 stdout에 미러링할지 여부 (외부 로그 수집기에 유용)
  sessionRecordingBucket: your-sessions-bucket  # Teleport 세션 녹화를 위한 S3 버킷
  backups: true                                   # DynamoDB 백업을 켜거나 끌지 여부
  dynamoAutoScaling: false                        # Teleport가 DynamoDB의 자동 Scaling을 설정해야 하는지 여부.
highAvailability:
  replicaCount: 2                                 # 구성할 복제본 수
enterprise: true                                  # 이것이 Teleport Enterprise 배포임을 나타냅니다
ingress:
  enabled: true
  spec:
    ingressClassName: alb
annotations:
  ingress:
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/backend-protocol: HTTPS
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=350
    alb.ingress.kubernetes.io/healthcheck-protocol: HTTPS
    alb.ingress.kubernetes.io/success-codes: 200,301,302
    # 자신의 AWS 인증서 ARN으로 대체하세요
    alb.ingress.kubernetes.io/certificate-arn: "arn:aws:acm:us-west-2:1234567890:certificate/12345678-43c7-4dd1-a2f6-c495b91ebece"
# Kubernetes 1.23 이상을 실행 중인 경우, PodSecurityPolicies를 비활성화해야 합니다
podSecurityPolicy:
  enabled: false

내부 AWS 애플리케이션 로드 밸런서(ALB)를 사용하려면 alb.ingress.kubernetes.io/scheme 주석을 다음과 같이 수정해야 합니다:

  alb.ingress.kubernetes.io/scheme: internal

HTTP 요청을 포트 80에서 HTTPS 요청으로 자동으로 리다이렉트하려면, annotations.ingress 아래에서 두 값을 제공할 수도 있습니다:

  alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
  alb.ingress.kubernetes.io/ssl-redirect: '443'

Helm을 사용하여 aws-values.yaml 파일의 값으로 차트를 설치하세요:

helm install release-name teleport/teleport-cluster \ --create-namespace \ --namespace namespace \ -f aws-values.yaml
Note

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

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

kubectl --namespace namespace 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 xxxxx.elb.us-east-1.amazonaws.com 443:30258/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

단계 6/7. DNS 설정하기

teleport.example.com에 대한 DNS A 레코드를 설정해야 합니다. 우리의 예제에서 이 레코드는 ELB의 별칭입니다.

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 인증서를 제공하기 때문입니다.

AWS Route 53에서 이를 설정하는 방법은 다음과 같습니다:

위에서 변경한 매개변수를 변경하세요

NAMESPACE='namespace'
RELEASE_NAME='release-name'

DNS 설정 (필요에 따라 변경)

MYZONE_DNS='example.com'
MYDNS='teleport.example.com'
MY_CLUSTER_REGION='us-west-2'

AWS 존 ID 및 ELB 존 ID 찾기

MYZONE="$(aws route53 list-hosted-zones-by-name --dns-name="${MYZONE_DNS?}" | jq -r '.HostedZones[0].Id' | sed s_/hostedzone/__)"
MYELB="$(kubectl --namespace "${NAMESPACE?}" get "service/${RELEASE_NAME?}-proxy" -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')"
MYELB_NAME="${MYELB%%-*}"
MYELB_ZONE="$(aws elbv2 describe-load-balancers --region "${MY_CLUSTER_REGION?}" --names "${MYELB_NAME?}" | jq -r '.LoadBalancers[0].CanonicalHostedZoneId')"

AWS의 JSON 파일 변경 세트를 작성합니다.

jq -n --arg dns "${MYDNS?}" --arg elb "${MYELB?}" --arg elbz "${MYELB_ZONE?}" \ '{
"Comment": "Create records", "Changes": [ { "Action": "CREATE", "ResourceRecordSet": { "Name": $dns, "Type": "A", "AliasTarget": { "HostedZoneId": $elbz, "DNSName": ("dualstack." + $elb), "EvaluateTargetHealth": false } } }, { "Action": "CREATE", "ResourceRecordSet": { "Name": ("*." + $dns), "Type": "A", "AliasTarget": { "HostedZoneId": $elbz, "DNSName": ("dualstack." + $elb), "EvaluateTargetHealth": false } } } ] }' > myrecords.json

적용 전에 레코드를 검토하세요.

cat myrecords.json | jq

레코드를 적용하고 변경 ID를 캡처하세요

CHANGEID="$(aws route53 change-resource-record-sets --hosted-zone-id "${MYZONE?}" --change-batch file://myrecords.json | jq -r '.ChangeInfo.Id')"

변경 사항이 적용되었는지 확인합니다

aws route53 get-change --id "${CHANGEID?}" | jq '.ChangeInfo.Status'

"INSYNC"

위에서 변경한 매개변수를 변경하세요

NAMESPACE='namespace'
RELEASE_NAME='release-name'

DNS 설정 (필요에 따라 변경)

MYZONE_DNS='example.com'
MYDNS='teleport.example.com'
MY_CLUSTER_REGION='us-west-2'

AWS 존 ID 및 Ingress Controller ALB 존 ID 찾기

MYZONE="$(aws route53 list-hosted-zones-by-name --dns-name="${MYZONE_DNS?}" | jq -r '.HostedZones[0].Id' | sed s_/hostedzone/__)"
MYELB="$(kubectl --namespace "${NAMESPACE?}" get "ingress/${RELEASE_NAME?}-proxy" -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')"
MYELB_ROOT="${MYELB%%.*}"
MYELB_NAME="${MYELB_ROOT%-*}"
MYELB_ZONE="$(aws elbv2 describe-load-balancers --region "${MY_CLUSTER_REGION?}" --names "${MYELB_NAME?}" | jq -r '.LoadBalancers[0].CanonicalHostedZoneId')"

AWS의 JSON 파일 변경 세트를 작성합니다.

jq -n --arg dns "${MYDNS?}" --arg elb "${MYELB?}" --arg elbz "${MYELB_ZONE?}" \ '{
"Comment": "Create records", "Changes": [ { "Action": "CREATE", "ResourceRecordSet": { "Name": $dns, "Type": "A", "AliasTarget": { "HostedZoneId": $elbz, "DNSName": ("dualstack." + $elb), "EvaluateTargetHealth": false } } }, { "Action": "CREATE", "ResourceRecordSet": { "Name": ("*." + $dns), "Type": "A", "AliasTarget": { "HostedZoneId": $elbz, "DNSName": ("dualstack." + $elb), "EvaluateTargetHealth": false } } } ] }' > myrecords.json

적용 전에 레코드를 검토하세요.

cat myrecords.json | jq

레코드를 적용하고 변경 ID를 캡처하세요

CHANGEID="$(aws route53 change-resource-record-sets --hosted-zone-id "${MYZONE?}" --change-batch file://myrecords.json | jq -r '.ChangeInfo.Id')"

변경 사항이 적용되었는지 확인합니다

aws route53 get-change --id "${CHANGEID?}" | jq '.ChangeInfo.Status'

"INSYNC"

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

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

kubectl --namespace namespace exec deploy/release-name-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 namespace exec deploy/release-name-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 사용자에 대한 다중 인증을 설정하세요.

높은 가용성

이 가이드에서는 두 개의 복제본을 구성했습니다. 클러스터 생성 후 highAvailability.replicaCount 값을 변경하여 이를 변경할 수 있습니다 아래의 helm upgrade에 대한 세부정보 참조합니다.

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

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

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

예를 들어 복제본 수를 2로 설정하려면:

위에서 작성한 aws-values.yaml 파일을 편집하고 적절한 변경을 수행하세요:

highAvailability:
  replicaCount: 2

새로 고친 값의 aws-values.yaml 파일을 사용하여 배포를 업그레이드하세요:

helm upgrade release-name teleport/teleport-cluster \ --namespace namespace \ -f aws-values.yaml
Note

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

그런 다음 새 값을 사용하여 클러스터 업그레이드를 수행하세요:

helm upgrade release-name teleport/teleport-cluster \ --namespace namespace \ -f aws-values.yaml

Teleport 제거하기

teleport-cluster 차트를 제거하려면, helm uninstall <release-name> 명령을 사용하세요. 예를 들어:

helm --namespace namespace uninstall release-name

cert-manager 제거하기

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

helm --namespace cert-manager uninstall cert-manager

문제 해결

AWS 쿼타

만약 Teleport 서비스의 배포가 기본 서비스 한도를 초과한다면, AWS 지원 센터에 한도 증가를 요청할 수 있습니다. 자세한 내용은 Amazon의 AWS 서비스 한도 문서를 참조하세요.

예를 들어, Teleport 클러스터 상태의 백엔드로 DynamoDB를 사용할 때, 읽기/쓰기 한도의 증가를 요청해야 할 수도 있습니다.

다음 단계

Teleport 클러스터를 배포한 후, 액세스 관리 섹션을 읽어 보면서 사용자 등록 및 RBAC 설정을 시작하세요.

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

cert-manager 문서를 읽어 보세요.

Teleport 원문 보기