인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
AWS, EKS 및 Helm을 사용한 HA Teleport 클러스터 실행
이 가이드에서는 Teleport Helm 차트를 사용하여 AWS EKS에서 실행되는 고가용성 Teleport 클러스터를 설정합니다.
이미 사용 중인 Teleport 클러스터가 있나요?
다른 플랫폼에서 Teleport를 이미 실행 중인 경우, 기존 Teleport 배포를 사용하여 Kubernetes 클러스터에 접속할 수 있습니다. 가이드를 따르세요 Teleport에 Kubernetes 클러스터를 연결하는 방법에 대해.
Tip
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
명령을 실행하여 이를 볼 수 있습니다.
이러한 관행이 문서에서 사용된 예제에 반드시 반영되는 것은 아닙니다. 문서의 예제는 주로 데모 및 개발 환경을 위한 것입니다.
Kubernetes 네임스페이스 및 Helm 릴리스 이름 선택
Note
시작하기 전에, 여기에서 Kubernetes 네임스페이스와 Helm 릴리스 이름을 설정하면 설치를 위한 명령어를 더 쉽게 복사/붙여넣기 할 수 있습니다.
무엇을 입력해야 할지 모르는 경우, 두 값 모두에 대해 teleport
를 사용하세요.
네임스페이스: namespace
릴리스 이름: release-name
1/7단계. Helm 설치
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+"}
2/7단계. Teleport Helm 차트 저장소 추가
Teleport Helm 저장소를 설정합니다.
Helm이 Teleport 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
specified in its configuration file exists. If the table does not exist, the
Auth Service attempts to create one.
The IAM permissions that the Auth Service requires to manage DynamoDB tables
depends on whether you expect to create a table yourself or enable the Auth
Service to create and configure one for you:
DynamoDB 테이블을 직접 관리하기로 선택하면 다음 단계를 따라야 하며, 아래에서 자세히 설명합니다:
- 클러스터 상태 테이블 생성
- 감사 이벤트 테이블 생성
- IAM 정책 생성 및 Teleport Auth Service의 IAM
신원에 첨부하기
클러스터 상태 테이블 생성
클러스터 상태 테이블은 다음 속성 정의가 있어야 합니다:
이름 | 유형 |
---|---|
HashKey | S |
FullPath | S |
테이블은 또한 다음 키 스키마 요소가 있어야 합니다:
이름 | 유형 |
---|---|
HashKey | HASH |
FullPath | RANGE |
감사 이벤트 테이블 생성
감사 이벤트 테이블은 다음 속성 정의가 있어야 합니다:
이름 | 유형 |
---|---|
SessionID | S |
EventIndex | N |
CreatedAtDate | S |
CreatedAt | N |
테이블은 또한 다음 키 스키마 요소가 있어야 합니다:
이름 | 유형 |
---|---|
CreatedAtDate | HASH |
CreatedAt | RANGE |
IAM 정책 생성 및 첨부
다음 IAM 정책을 생성하고 Teleport Auth Service의 IAM
신원에 첨부합니다.
정책 예제에서 다음 값을 교체해야 합니다:
자리 표시자 값 | 교체할 내용 |
---|---|
us-west-2 | AWS 지역 |
1234567890 | AWS 계정 ID |
teleport-helm-backend | Teleport 백엔드에 사용할 DynamoDB 테이블 이름 |
teleport-helm-events | Teleport 감사 로그에 사용할 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-2 | AWS 지역 |
1234567890 | AWS 계정 ID |
teleport-helm-backend | Teleport 백엔드에 사용할 DynamoDB 테이블 이름 |
teleport-helm-events | Teleport 감사 로그에 사용할 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 버킷이 존재하는지 확인합니다. 만약 해당 버킷이 존재하지 않는 경우, 인증 서비스는 버킷을 생성하고 구성하려고 시도합니다.
인증 서비스가 세션 기록 버킷을 관리하기 위해 필요한 IAM 권한은 사용자가 직접 버킷을 생성할 것인지, 아니면 인증 서비스가 버킷을 생성하고 구성하도록 허용할 것인지에 따라 달라집니다.
Teleport은 버전 관리가 활성화된 S3 버킷만 사용합니다. 이는 세션 로그가 영구적으로 변경되거나 삭제될 수 없음을 보장합니다. Teleport는 항상 녹화의 가장 오래된 버전을 참조합니다.
아래 정책 예제에서 이러한 값을 변경해야 합니다:
자리 표시자 값 | 변경할 값 |
---|---|
your-sessions-bucket | Teleport S3 세션 녹화 버킷으로 사용할 이름 |
{
"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/*"
}
]
}
아래 정책 예제에서 이러한 값을 변경해야 합니다:
자리 표시자 값 | 변경할 값 |
---|---|
your-sessions-bucket | Teleport S3 세션 녹화 버킷으로 사용할 이름 |
{
"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
차트는 Teleport Proxy 서비스에 대한 수신 연결을 처리하기 위해 Kubernetes LoadBalancer
또는 Kubernetes Ingress
를 배포할 수 있습니다.
접근 방식 결정
AWS를 사용할 때 지원되는 세 가지 옵션이 있습니다. 이 중 하나만 선택해야 합니다:
접근 방식 | AWS 로드 밸런서 유형 | Kubernetes 트래픽 목적지 | 기존 AWS LB 사용 가능? | 주의 사항 |
---|---|---|---|---|
Using cert-manager | Network Load Balancer (NLB) | LoadBalancer | 아니요 | 도메인에 대한 DNS 레코드를 변경할 수 있는 IAM 권한으로 구성된 Issuer 와 함께 Route 53 도메인이 필요합니다. |
Using AWS Certificate Manager | Application Load Balancer (ALB) | Ingress | 예 | Kubernetes 클러스터에 AWS Load Balancer 컨트롤러의 올바른 인스턴스가 설치되어 있어야 합니다. |
Using your own TLS credentials | Network Load Balancer (NLB) | LoadBalancer | 아니요 | Teleport의 웹 리스너를 보호하는 TLS 인증서의 유지 관리, 갱신 및 신뢰성을 독립적으로 관리해야 합니다. |
cert-manager
사용하기
cert-manager
를 사용하여 TLS 자격 증명을 프로비저닝하고 자동으로 갱신할 수 있습니다.
이는 Let's Encrypt를 통해 ACME 챌린지를 완료함으로써 가능해집니다.
또한 cert-manager
를 EKS에서 AWS Private Certificate Authority (PCA)와 함께 사용할 수 있습니다
aws-privateca-issuer
플러그인을 사용합니다.
이 방법은 수신 트래픽을 처리하기 위해 기본 AWS Network Load Balancer (NLB)를 프로비저닝하는 Kubernetes LoadBalancer
를 사용합니다.
AWS Certificate Manager 사용하기
AWS Certificate Manager를 사용하여 AWS 관리 인증서를 통한 TLS 종료를 처리할 수 있습니다.
이 방법은 Kubernetes Ingress
를 사용하며, 경우에 따라 기본 AWS Application Load Balancer (ALB)를 프로비저닝하여 수신 트래픽을 처리합니다. 또한 AWS Load Balancer 컨트롤러의 설치 및 설정이 필요합니다.
Teleport와 함께 Layer 7 로드 밸런서를 사용할 때 이러한 잠재적인 제한 사항 및 차이점에 유의해야 합니다:
- 커맨드 라인에서 Kubernetes 클러스터에 연결하려면
tsh proxy kube
또는tsh kubectl
명령과tsh proxy db
/tsh db connect
명령을 사용해야 합니다. 이 모드에서는tsh
를 프록시 클라이언트로 사용하지 않고는kubectl
을 직접 Teleport 리스너에 연결할 수 없습니다. - 커맨드 라인에서 데이터베이스에 연결하려면
tsh proxy db
또는tsh db connect
명령을 사용해야 합니다. 이 모드에서는tsh
를 프록시 클라이언트로 사용하지 않고 데이터베이스 클라이언트를 직접 Teleport 리스너에 연결할 수 없습니다. - 이러한 요구 사항의 이유는 Teleport가 인증을 위해 X509 인증서를 사용하기 때문이며, 이는 Teleport 프록시에서 모든 수신 TLS 트래픽을 자체적으로 종료해야 함을 요구합니다. Layer 7 로드 밸런서를 사용할 경우 이는 직접적으로 불가능하므로,
tsh
클라이언트가 이 흐름을 ALPN 연결 업그레이드를 사용하여 구현합니다. - Teleport와
tsh
v13 이상 사용이 필요합니다.
Warning
ALB와 함께 ACM을 사용하는 경우, 클러스터에는 필요한 IAM 권한을 가진 AWS Load Balancer 컨트롤러가 완전히 설치되어 있어야 합니다. 이 가이드는 아래에서 더 많은 세부정보를 제공합니다.
자체 TLS 자격 증명 사용하기
이 접근 방식에서는 Teleport 클러스터에 대한 TLS 인증서 및 개인 키를 얻는 방법과 자격 증명을 주기적으로 갱신하는 방법을 결정할 책임이 있습니다. Let's Encrypt 또는 AWS Certificate Manager 대신 신뢰할 수 있는 내부 인증 기관을 사용하고 싶다면 이 방법을 사용하십시오. 이 방법은 Kubernetes LoadBalancer
를 사용하며 기본 AWS NLB를 프로비저닝합니다.
따라야 할 단계
위의 세부정보를 기반으로 접근 방식을 선택한 후, 아래의 올바른 탭을 선택하여 지침을 참조하십시오.
이 예제에서는 여러 팟을 사용하여 고가용성 Teleport 클러스터를 생성하고 있습니다. 따라서 cert-manager
를 사용하여 Let's Encrypt를 사용한 TLS 인증서를 중앙에서 프로비저닝할 것입니다. 이러한 인증서는 각 Teleport 팟에 탑재되며, cert-manager
에 의해 자동으로 갱신되고 최신 상태로 유지됩니다.
cert-manager
를 사용할 계획이라면, Route53 레코드를 업데이트할 수 있도록 클러스터에 IAM 정책을 추가해야 합니다.
Route53 IAM 정책
이 정책은 cert-manager
가 DNS01 Let's Encrypt 챌린지를 사용하여 Teleport 클러스터용 TLS 인증서를 프로비저닝할 수 있도록 허용합니다.
아래 정책 예제의 값을 다음과 같이 바꿔야 합니다:
자리 표시자 값 | 대체할 값 |
---|---|
Z0159221358P96JYAUAA4 | Teleport 클러스터를 호스팅하는 도메인의 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 설치
Teleport를 설치하려는 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 installCRDs=true \--set global.leaderElection.namespace=cert-manager \--set extraArgs="{--issuer-ambient-credentials}" # Issuer 사용 시 환경 AWS 자격 증명을 자동 탑재하는 데 필요
cert-manager
가 설치되면, Issuer
를 생성하고 추가해야 합니다.
아래의 Issuer
예제에서 이러한 값들을 변경해야 합니다:
자리 표시자 값 | 변경할 값 |
---|---|
email@address.com | Let's Encrypt로부터의 통신을 받을 이메일 주소 |
example.com | Teleport 클러스터를 호스팅하는 Route 53 도메인 이름 |
us-west-2 | 클러스터가 실행되고 있는 AWS 리전 |
Z0159221358P96JYAUAA4 | Teleport 클러스터를 호스팅하는 도메인의 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 namespacekubectl label namespace teleport 'pod-security.kubernetes.io/enforce=baseline'kubectl --namespace namespace create -f aws-issuer.yaml
이 단계에서는 Teleport가 AWS Certificate Manager (ACM)를 사용하여 Teleport 인스턴스에 TLS 자격 증명을 프로비저닝하도록 구성합니다.
전제 조건: AWS 로드 밸런서 컨트롤러 설치 및 구성
AWS 로드 밸런서 컨트롤러 설치에 대한 AWS 유지 관리 문서를 따르거나 이 지침을 계속 진행하기 전에 AWS LB 컨트롤러가 성공적으로 설치되어 있어야 합니다. 이를 수행하지 않으면 사용할 수 없는 Teleport 클러스터가 생성됩니다.
위의 AWS 가이드를 따르는 경우, app.kubernetes.io/name=aws-load-balancer-controller
레이블이 있는 포드를 찾아
클러스터에서 AWS LB 컨트롤러가 실행 중인지 확인할 수 있습니다:
kubectl get pods -A -l app.kubernetes.io/name=aws-load-balancer-controllerNAMESPACE 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
클러스터에서 alb
가 IngressClass
로 등록되어 있는지도 확인할 수 있습니다:
kubectl get ingressclassNAME 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으로 교체합니다.
teleport-cluster
Helm 차트를 구성하여 Kubernetes 비밀 내의 기존 TLS 자격 증명을 사용하여
Teleport Web UI를 보호할 수 있습니다.
다음 명령을 사용하여 비밀을 생성합니다:
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단계. 클러스터 구성 값을 설정합니다
Teleport Enterprise를 실행하는 경우, Kubernetes 클러스터에 Teleport를 설치하기 전에 Teleport 라이선스 정보가 포함된 비밀을 생성해야 합니다.
Teleport Auth 서비스는 Teleport Enterprise 계정을 인증하기 위해 라이센스 파일을 읽습니다.
라이센스 파일을 얻으려면 Teleport 계정 대시보드로 이동하여 로그인하십시오. teleport.sh에서 시작하여 Teleport 계정 이름(예: my-company)을 입력합니다. 로그인 후 "GENERATE LICENSE KEY" 버튼이 표시되며, 이를 클릭하면 새 라이센스 파일이 생성되고 다운로드할 수 있습니다.
라이선스 파일에서 비밀을 생성합니다. 파일 이름이 license.pem
인 경우, Teleport는 이 비밀을 자동으로 발견합니다.
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의 자동 확장을 구성해야 하는지 여부
highAvailability:
replicaCount: 2 # 구성할 복제본 수
certManager:
enabled: true # TLS 인증서 획득을 위한 cert-manager 지원 활성화
issuerName: letsencrypt-production # 위에서 구성한 cert-manager 발급자 이름
# 이것이 Teleport Enterprise 배포임을 나타냅니다. Teleport Community Edition의 경우 false로 설정하십시오.
enterprise: true
# 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의 자동 확장을 구성해야 하는지 여부
highAvailability:
replicaCount: 2 # 구성할 복제본 수
# 이것이 Teleport Enterprise 배포임을 나타냅니다. Teleport Community Edition의 경우 false로 설정하십시오.
enterprise: true
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 Application Load Balancer(인터넷을 통한 ALB가 아닌)를 사용하려면
alb.ingress.kubernetes.io/scheme
주석을 다음과 같이 수정해야 합니다:
alb.ingress.kubernetes.io/scheme: internal
포트 80의 HTTP 요청을 포트 443의 HTTPS 요청으로 자동으로 리디렉션하려면, 선택적으로 annotations.ingress
아래에 이 두 값을 제공할 수 있습니다:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
alb.ingress.kubernetes.io/ssl-redirect: "443"
aws-values.yaml
파일의 값을 사용하여 차트를 설치하려면 다음 명령을 사용합니다:
helm install release-name teleport/teleport-cluster \ --create-namespace \ --namespace namespace \ -f aws-values.yaml
Note
클러스터가 구성된 후에는 clusterName
을 변경할 수 없으므로, 신중하게
선택하십시오. Teleport 클러스터에 대한 외부 액세스에 사용할 완전한 도메인
이름을 사용해야 합니다.
차트가 설치되면 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는 Application Access에 대해 구성하는 각 애플리케이션에 서브도메인을 할당합니다. 예를 들어, 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 클라우드 플랫폼을 사용하는 경우, 서브도메인과 애플리케이션에 대한 서명된 TLS 인증서를 자동으로 제공하므로 DNS 업데이트가 필요하지 않습니다.
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 Zone ID 및 ELB Zone 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": "레코드 생성", "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 Zone ID 및 Ingress Controller ALB Zone 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": "레코드 생성", "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를 사용할 때, 읽기/쓰기 할당량 증가를 요청해야 할 수 있습니다.
다음 단계
텔레포트 클러스터를 배포했으니, 사용자를 등록하고 RBAC 설정을 시작하기 위해 접근 관리 섹션을 읽어보세요.
고가용성에 대한 자세한 내용은 Helm 차트 참조의 고가용성 섹션을 참조하세요.
cert-manager
문서를 읽어보세요.