InfoGrab Docs

AWS에서 Terraform으로 프로덕션 Teleport 배포

요약

이 가이드는 참조 Terraform 코드와 함께 사용하여 결과 Teleport 배포를 관리하는 방법을 설명합니다. 이 가이드는 인프라가 AWS GovCloud에 호스팅되지 않고 에어갭 AWS 환경(EKS Anywhere)에 있지 않다고 가정합니다.

이 가이드는 참조 Terraform 코드와 함께 사용하여 결과 Teleport 배포를 관리하는 방법을 설명합니다.

사전 요구사항#

이 가이드는 인프라가 AWS GovCloud에 호스팅되지 않고 에어갭 AWS 환경(EKS Anywhere)에 있지 않다고 가정합니다. 그런 경우라면 배포 계획 지원을 위해 Teleport 팀에 연락하세요.

이 가이드에는 다음도 필요합니다:

  • 시스템에 설치된 Terraform. 지침은 Terraform 설치를 방문하세요. terraform이 경로에 있다고 가정합니다.

    $ which terraform
    /usr/local/bin/terraform
    $ terraform version
    Terraform v1.5.6
    
  • aws 명령줄 도구. Ubuntu/Debian/Fedora/CentOS 및 macOS Homebrew에서 awscli 패키지로 사용 가능합니다.

    Fedora/CentOS: yum -y install awscli

    Ubuntu/Debian: apt-get -y install awscli

    macOS (Homebrew 사용): brew install awscli

    가능한 경우 패키지를 통한 설치가 항상 더 좋습니다. 배포에 사용 가능한 패키지를 찾을 수 없는 경우 https://aws.amazon.com/cli/에서 도구를 다운로드할 수도 있습니다.

  • ~/.aws/credentials에서 사용 가능한 자격 증명으로 AWS CLI 접근이 구성되어 있다고 가정합니다:

    $ cat ~/.aws/credentials
    # [default]
    # aws_access_key_id = (=aws.aws_access_key=)
    # aws_secret_access_key = (=aws.aws_secret_access_key=)
    
  • ~/.aws/config에 기본 리전이 설정되어 있어야 합니다:

    $ cat ~/.aws/config
    # [default]
    # region = us-west-2
    

    결과적으로 aws ec2 describe-instances와 같은 명령을 실행하여 실행 중인 EC2 인스턴스를 나열할 수 있어야 합니다. "액세스 거부됨", "403 Forbidden" 또는 유사한 메시지가 표시되면 aws_access_key_idaws_secret_access_key가 참조하는 AWS IAM 사용자에게 추가 권한을 부여해야 합니다.

  • Route 53 영역. Terraform 모듈은 이 영역에 Teleport 클러스터에 대한 DNS 레코드를 생성합니다.

  • AWS에서 생성된 키 쌍. 이 가이드에서 보여주는 Terraform 모듈을 사용하여 생성하는 Amazon EC2 인스턴스에 접근하는 데 사용합니다.

일반적인 규칙으로 Terraform을 실행하는 모든 사용자에게 다음 AWS 서비스에 대한 관리자 수준 권한이 있다고 가정합니다:

Terraform 배포 자체는 AWS 서비스에 대해 적절히 제한된 권한 범위를 가진 Teleport 인스턴스에서 사용할 새 IAM 역할을 생성합니다. 그러나 초기 클러스터 설정은 높은 수준의 AWS 권한이 있는 사용자가 수행해야 합니다.

Terraform 코드 가져오기#

먼저 Teleport 리포지토리를 클론하여 시스템에서 Terraform 코드를 사용할 수 있도록 해야 합니다:

$ git clone https://github.com/gravitational/teleport -b branch/v(=teleport.major_version=)
# Cloning into 'teleport'...
# remote: Enumerating objects: 106, done.
# remote: Counting objects: 100% (106/106), done.
# remote: Compressing objects: 100% (95/95), done.
# remote: Total 61144 (delta 33), reused 35 (delta 11), pack-reused 61038
# Receiving objects: 100% (61144/61144), 85.17 MiB | 4.66 MiB/s, done.
# Resolving deltas: 100% (39141/39141), done.

완료되면 Terraform 코드가 체크아웃된 디렉터리로 변경하고 terraform init을 실행할 수 있습니다:

$ cd teleport/examples/aws/terraform/ha-autoscale-cluster
$ terraform init

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...
- Installing hashicorp/aws v5.31.0...
- Installed hashicorp/aws v5.31.0 (signed by HashiCorp)

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

이렇게 하면 참조 코드를 사용하여 Teleport를 실행하는 데 필요한 적절한 Terraform 플러그인이 다운로드됩니다.

변수 설정#

Terraform 모듈은 변수를 사용하여 입력을 전달합니다. 다음과 같은 몇 가지 방법으로 수행할 수 있습니다:

  • terraform apply에 대한 명령줄에서
  • vars.tf 파일을 편집하여
  • 환경 변수를 설정하여

이 가이드에서는 환경 변수를 광범위하게 사용할 것입니다. 클러스터가 생성된 후 Teleport 명령을 실행할 때 구성의 값을 더 쉽게 참조할 수 있기 때문입니다.

TF_VAR_로 시작하는 모든 설정 환경 변수는 Terraform에 의해 자동으로 처리되고 제거되므로 TF_VAR_test_variabletest_variable이 됩니다.

Teleport 리포의 examples/aws/terraform/ha-autoscale-cluster 섹션에 있는 README.md 파일에 변수와 기능에 대한 최신 목록을 유지하지만 여기서 예시 목록을 살펴보겠습니다.

결정해야 할 사항:

region#

$ export TF_VAR_region=""

실행할 AWS 리전입니다. README에 자세히 나온 지원 목록에서 선택해야 합니다. 이들은 DynamoDB 저장 암호화를 지원하는 리전입니다.

cluster_name#

$ export TF_VAR_cluster_name="teleport-example"

사용할 내부 Teleport 클러스터 이름입니다. 이는 고유해야 하며 공백, 점(.) 또는 기타 특수 문자를 포함하지 않아야 합니다. 일부 AWS 서비스는 이름에 점을 사용하는 것을 허용하지 않으므로 도메인 이름으로 설정하지 않아야 합니다. 이것은 클러스터의 웹 UI에 나타나며 처음부터 클러스터를 재구축하지 않고는 생성 후에 변경할 수 없으므로 신중하게 선택합니다. teleport-<company-name>과 같은 것이 좋은 예일 수 있습니다.

ami_name#

$ export TF_VAR_ami_name="teleport-ent-(=teleport.version=)-x86_64"

Teleport(Gravitational)는 Teleport의 새 버전을 릴리즈할 때 자동으로 Teleport Community Edition, Enterprise 및 Enterprise FIPS AMI를 빌드하고 게시합니다. AMI 이름은 teleport-<type>-<version>-<arch> 형식을 따르며, <type>oss 또는 ent(Enterprise), <version>은 Teleport 버전(예: <code>[teleport.version]</code>), <arch>x86_64 또는 arm64입니다.

FIPS 140 호환 AMI(기본적으로 FIPS 모드에서 Teleport를 배포)는 <arch> 뒤에 -fips 접미사가 있습니다. 예: teleport-ent-<code>[teleport.version]</code>-x86_64-fips.

이러한 AMI를 게시하는 AWS 계정 ID는 146628656107입니다. 아래 예시 awscli 명령으로 사용 가능한 AMI를 나열할 수 있습니다. 출력은 기본적으로 JSON 형식입니다.

팁: Teleport AMI 나열

OSS AMI:

$ aws --region  ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-oss-(=teleport.version=)-*'

Enterprise AMI:

$ aws --region  ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-ent-(=teleport.version=)-*'

Enterprise FIPS AMI:

$ aws --region  ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-ent-(=teleport.version=)-*-fips-*'

key_name#

$ export TF_VAR_key_name="exampleuser"

EC2 인스턴스를 배포할 때 사용할 AWS 키 쌍 이름입니다. 이것은 region 변수에 지정한 것과 동일한 리전에 있어야 하며, 배포된 EC2 인스턴스에 연결하기 위해 이 키 쌍의 사본이 필요합니다. 접근할 수 없는 키 쌍을 사용하지 마세요.

license_path#

라이선스를 획득합니다.

$ export TF_VAR_license_path="/home/user/license.pem"

이 라이선스는 AWS SSM에 업로드되고 Teleport Enterprise 기능을 활성화하기 위해 Teleport Auth Service 인스턴스에 자동으로 다운로드됩니다.

(Teleport Community Edition 사용자는 로컬에서 touch /tmp/license.pem을 실행하여 빈 파일을 생성한 다음 여기에 '/tmp/license.pem' 경로를 제공할 수 있습니다. 라이선스 파일은 Teleport Community Edition 설치에서 사용되지 않습니다.)

route53_zone#

$ export TF_VAR_route53_zone="example.com"

Terraform 설정에는 Amazon Route 53에서 도메인이 프로비저닝되어 있어야 합니다 - 아래에 설정된 대로 route53_domain에 대한 DNS 레코드를 자동으로 추가합니다. 다음 명령으로 이를 나열할 수 있습니다:

$ aws route53 list-hosted-zones --query "HostedZones[*].Name" --output json
[
    "example.com.",
    "testing.net.",
    "subdomain.wow.org."
]

후행 점 없이 적절한 도메인을 사용해야 합니다.

route53_domain#

$ export TF_VAR_route53_domain=""

웹 접근을 위한 Teleport 로드 밸런서에 대한 CNAME으로 설정할 서브도메인. 이것은 사람들이 Teleport 클러스터에 연결하는 데 사용할 공개 도메인이 되므로 신중하게 선택합니다.

이것은 위의 route53_zone에 선택한 도메인의 서브도메인이어야 합니다.

add_wildcard_route53_record#

$ export TF_VAR_add_wildcard_route53_record="true"

Teleport Proxy Service의 공개 웹 주소의 서브도메인에 대한 Teleport Application Service를 활성화하는 데 사용합니다. 공개 도메인에 대한 와일드카드 항목이 Route 53에 설정됩니다(예: *.teleport.example.com). ACM의 경우 이것이 true로 설정되면 와일드카드 인증서가 포함됩니다. Let's Encrypt는 발급하는 인증서에 와일드카드 서브도메인을 자동으로 포함합니다.

enable_mongodb_listener#

$ export TF_VAR_enable_mongodb_listener="false"

true로 설정하면 Teleport MongoDB 리스너 포트에 연결하는 Network Load Balancer에서 포트 27017이 활성화됩니다. TLS 라우팅을 사용하지 않는 경우 MongoDB 연결에 필요합니다.

enable_mysql_listener#

$ export TF_VAR_enable_mysql_listener="false"

Teleport MySQL 리스너 포트에 연결하는 Network Load Balancer에서 포트 3036이 활성화됩니다. TLS 라우팅을 사용하지 않는 경우 MySQL 연결에 필요합니다.

enable_postgres_listener#

$ export TF_VAR_enable_postgres_listener="false"

Teleport PostgreSQL 리스너 포트에 연결하는 Network Load Balancer에서 포트 5432가 활성화됩니다. TLS 라우팅을 사용하지 않는 경우 PostgreSQL 연결에 필요합니다.

s3_bucket_name#

$ export TF_VAR_s3_bucket_name="teleport-example"

Terraform 예시는 LetsEncrypt에서 프로비저닝한 인증서를 보관하고 EC2 인스턴스에 배포하는 S3 버킷도 프로비저닝합니다. 이것은 S3 호환 이름이 될 수 있으며 위에서 설정한 것과 동일한 리전에서 생성됩니다.

ACM을 사용할 때도 이 버킷은 Teleport 세션 로그를 저장하는 데도 사용되므로 프로비저닝됩니다.

S3 버킷 이름은 전 세계적으로 고유해야 하므로 S3 프로비저닝과 관련된 오류가 표시되면 더 고유한 버킷 이름을 선택하세요.

email#

$ export TF_VAR_email="support@example.com"

Let's Encrypt는 알림과 유용한 정보를 전송하는 데 사용할 수 있는 등록된 모든 인증서에 대한 이메일 주소가 필요합니다. Teleport를 배포하는 팀이 접근할 수 있는 일반 ops/support 이메일 주소를 권장합니다.

use_acm#

$ export TF_VAR_use_acm="true"

"false"로 설정하면 Terraform은 Let's Encrypt를 사용하여 Teleport 클러스터의 공개 웹 UI 인증서를 프로비저닝합니다(route53_domain - 이 예시에서 https://teleport.example.com). 이것은 AWS 네트워크 로드 밸런서를 사용하여 Teleport 클러스터의 웹 UI에 대한 연결을 로드 밸런싱하며, SSL 종료는 Teleport 자체에 의해 처리됩니다.

"true"로 설정하면 Terraform은 AWS ACM을 사용하여 클러스터의 공개 웹 UI 인증서를 프로비저닝합니다. 이것은 AWS 애플리케이션 로드 밸런서를 사용하여 Teleport 클러스터의 웹 UI에 대한 연결을 로드 밸런싱하며, SSL 종료는 로드 밸런서에 의해 처리됩니다.

Terraform이 생성하는 대신 기존 ACM 인증서를 사용하려면 terraform apply 전에 다음 명령을 실행하여 Terraform이 이를 사용하도록 할 수 있습니다:

$ terraform import aws_acm_certificate.cert <certificate_arn>

가능하면 ACM을 사용하는 것을 권장합니다. Teleport 클러스터에 대한 인증서 관리를 단순화하기 때문입니다.

use_tls_routing#

$ export TF_VAR_use_tls_routing="true"

true 문자열로 설정하면 Teleport는 TLS 라우팅을 사용하여 모든 트래픽을 단일 포트를 통해 다중화합니다. 배포를 단순화하므로 설정에서 별도 포트를 사용할 특정 필요가 없는 한 이 설정을 항상 사용해야 합니다.

가장 간단하고 저렴한 배포를 위해 ACM과 TLS 라우팅을 모두 활성화하여 AWS 관리 인증서가 있는 단일 Application Load Balancer를 통해 모든 트래픽을 전달합니다.

teleport_auth_type#

$ export TF_VAR_teleport_auth_type="local"

이 값은 Teleport 클러스터에 사용되는 기본 인증 유형을 변경하는 데 사용할 수 있습니다. DynamoDB에 SAML, OIDC 또는 GitHub 커넥터가 구성되어 있을 때 AMI 업그레이드 시 기본 인증 유형을 유지하는 데 유용합니다. 기본값은 local입니다.

  • Teleport Community Edition은 local 또는 github 지원
  • Teleport Enterprise Edition은 local, github, oidc, 또는 saml 지원
  • Teleport Enterprise FIPS 배포는 로컬 인증이 비활성화되어 있으므로 github, oidc, 또는 saml 사용 필요

자세한 내용은 Teleport 인증 참조를 참조하세요.

default_tags#

$ export TF_VAR_default_tags='{"key":"value", "env":"dev"}'

이 값은 AWS Auto Scaling Groups(ASG)에 의해 동적으로 생성된 리소스를 포함하여 모든 리소스에 적용되는 기본 태그를 제어하는 데 사용할 수 있습니다. 기본값은 태그 없음입니다.

enable_auth_asg_instance_refresh#

$ export TF_VAR_enable_auth_asg_instance_refresh="false"

이 변수는 Teleport Auth Service AWS Autoscaling Group(ASG)에서 자동 인스턴스 새로 고침을 활성화하는 데 사용할 수 있습니다 - 새로 고침은 시작 템플릿 또는 구성 변경에 의해 트리거됩니다. Auth ASG 인스턴스 새로 고침을 활성화할 때는 주의하세요 - Teleport 버전을 업그레이드하면 인스턴스 새로 고침이 트리거되며 Teleport 클러스터를 업그레이드하기 전에 Auth 서버를 하나의 인스턴스로만 축소해야 합니다.

enable_proxy_asg_instance_refresh#

$ export TF_VAR_enable_proxy_asg_instance_refresh="false"

이 변수는 Teleport 프록시 서버 AWS Autoscaling Group(ASG)에서 자동 인스턴스 새로 고침을 활성화하는 데 사용할 수 있습니다 - 새로 고침은 시작 템플릿 또는 구성 변경에 의해 트리거됩니다.

enable_node_asg_instance_refresh#

$ export TF_VAR_enable_node_asg_instance_refresh="false"

이 변수는 Teleport 노드 서버 AWS Autoscaling Group(ASG)에서 자동 인스턴스 새로 고침을 활성화하는 데 사용할 수 있습니다 - 새로 고침은 시작 템플릿 또는 구성 변경에 의해 트리거됩니다.

참조 배포 기본값#

인스턴스#

참조 배포는 다음 기본 설정으로 AWS Auto Scaling Groups(ASG)를 사용하여 클러스터에 다음 인스턴스를 프로비저닝합니다:

  • 2 x m7g.large Teleport Auth Service 인스턴스 - 내부 네트워크 로드 밸런서 뒤에 있는 ASG, DynamoDB를 사용하여 공유 스토리지로 구성
  • 2 x m7g.large Teleport Proxy Service 인스턴스 - 공개 로드 밸런서(LetsEncrypt의 경우 NLB, ACM의 경우 ALB) 뒤에 있는 ASG
  • 1 x m7g.large Teleport SSH Service 인스턴스 - 이 ASG의 서버 인스턴스는 Teleport SSH Service가 활성화된 상태로 auth 서비스에 연결하여 합류합니다.
  • 1 x t4g.medium 배스천 서버 - 인스턴스에 대한 인바운드 SSH 트래픽의 유일한 허용 소스. 각 인스턴스가 인터넷에 직접 노출되지 않도록 수행됩니다.

노드 또는 모니터링 서비스를 설정하지 않으려면 ASG의 desired_sizemin_size0으로 설정하면 Terraform이 이를 프로비저닝하지 않습니다.

클러스터 상태 데이터베이스 스토리지#

참조 Terraform 배포는 Teleport가 DynamoDB에 클러스터 상태 데이터베이스를 저장하도록 설정합니다. 클러스터 상태 테이블 이름은 위의 cluster_name 변수에 구성된 클러스터 이름과 동일합니다.

이 예시에서 DynamoDB 테이블은 teleport-example로 불립니다.

Teleport가 DynamoDB로 작동하는 방법에 대한 자세한 내용은 스토리지 백엔드 가이드를 참조하세요.

감사 이벤트 스토리지#

참조 Terraform 배포는 Teleport가 DynamoDB에 클러스터 감사 로그를 저장하도록 설정합니다. 감사 이벤트 스토리지 테이블 이름은 위의 cluster_name 변수에 구성된 클러스터 이름과 동일하며 끝에 -events가 추가됩니다.

이 예시에서 DynamoDB 테이블은 teleport-example-events로 불립니다.

Teleport가 DynamoDB로 작동하는 방법에 대한 자세한 내용은 스토리지 백엔드 가이드를 참조하세요.

녹화된 세션 스토리지#

참조 Terraform 배포는 Teleport가 s3_bucket_name 변수에 구성된 동일한 S3 버킷의 records 디렉터리에 녹화된 세션 로그를 저장하도록 설정합니다.

이 예시에서는 s3://teleport-example/records입니다.

S3는 규제 환경에서 Teleport를 배포하는 고객에게 유용한 Amazon S3 Object Lock을 제공합니다. 오브젝트 잠금 구성은 이 가이드의 범위를 벗어납니다.

클러스터 도메인#

참조 Terraform 배포는 route53_domain 변수에서 참조하는 Route 53에 정의된 도메인에서 Teleport 클러스터를 사용할 수 있도록 설정합니다. 이 예시에서는 입니다.

Teleport의 웹 인터페이스는 Teleport 클러스터 호스트의 포트 443에서 사용할 수 있습니다 - https://teleport.example.com - 이것은 AWS 로드 밸런서에 대한 구성된 CNAME을 통해 이루어집니다.

TLS 라우팅 사용: use_tls_routingtrue로 설정되면 모든 Teleport SSH, 터널, Kubernetes 및 데이터베이스 트래픽도 route53_domain에 설정된 동일한 호스트 이름의 포트 443을 통해 흐릅니다.

TLS 라우팅 미사용: use_tls_routingfalse로 설정되면:

  • Teleport Proxy Service의 SSH 인터페이스는 AWS 제어 호스트 이름이 있는 네트워크 로드 밸런서를 통해 포트 3023에서 사용할 수 있습니다. tsh 클라이언트로 연결할 때 사용되는 기본 포트이며 추가 구성이 필요하지 않습니다.
  • Teleport Proxy Service의 역방향 터널 리스너는 AWS 제어 호스트 이름이 있는 동일한 네트워크 로드 밸런서를 통해 포트 3024에서 사용할 수 있습니다. 이를 통해 역방향 터널을 통해 연결된 신뢰할 수 있는 클러스터와 노드가 클러스터에 접근할 수 있습니다.
  • Teleport Proxy Service의 Kubernetes 리스너는 AWS 제어 호스트 이름이 있는 동일한 네트워크 로드 밸런서를 통해 포트 3026에서 사용할 수 있습니다. 이를 통해 Kubernetes 클라이언트가 Teleport 클러스터를 통해 Kubernetes 클러스터에 접근할 수 있습니다.

Terraform으로 배포#

위에 자세히 설명된 모든 변수에 대한 값을 설정하고 내보낸 후 구성을 유효성 검사하기 위해 terraform plan을 실행해야 합니다.

$ terraform plan
# ...
# Plan: 121 to add, 0 to change, 0 to destroy.

오류가 없으면 terraform apply를 실행할 수 있습니다:

$ terraform apply
# Plan: 121 to add, 0 to change, 0 to destroy.
#
# Do you want to perform these actions?
#  Enter a value: yes

여기에 yes를 입력하면 Terraform 배포가 시작됩니다. 완전히 배포하는 데 약 8-10분이 걸립니다.

Terraform 배포 제거/종료#

실행 중인 배포를 어떤 이유로든 종료해야 하는 경우 terraform destroy를 실행할 수 있습니다.

Terraform 설정 후 클러스터에 접근#

Terraform 설정이 완료되면 Teleport 클러스터의 웹 UI URL이 cluster_web_address Terraform 출력에 설정됩니다.

terraform output -raw cluster_web_address를 실행하여 배포 후 이를 볼 수 있습니다:

$ terraform output -raw cluster_web_address
https://teleport.example.com

Teleport 클러스터에 관리자 사용자 추가#

Teleport 클러스터에 사용자를 추가하려면 SSH를 통해 Teleport Auth Service 인스턴스에 연결하고 tctl 명령을 실행해야 합니다.

  1. Bastion 서버의 공개 IP를 terraform output -raw bastion_ip_public을 사용하여 가져옵니다:

    $ export BASTION_IP=$(terraform output -raw bastion_ip_public)
    $ echo ${BASTION_IP}
    # 1.2.3.4
    
  2. terraform output -json auth_instance_private_ips를 사용하고 awk로 파이프하여 Auth Service 인스턴스의 IP를 가져옵니다:

    $ export AUTH_IP=$(terraform output -json auth_instance_private_ips | awk -F\" '{print $2}')
    $ echo ${AUTH_IP}
    # 172.31.0.196
    
  3. 이 두 값을 사용하여 Auth Service 인스턴스에 SSH로 연결합니다:

    $ export KEY_NAME=$(terraform output -raw key_name)
    $ ssh -i ${KEY_NAME}.pem -o ProxyCommand="ssh -i ${KEY_NAME}.pem -W '[%h]:%p' ec2-user@${BASTION_IP}" ec2-user@${AUTH_IP}
    
  4. tctl 명령을 사용하여 Teleport의 관리자 사용자를 생성합니다:

    Teleport Community Edition:

    # EC2 Auth Service 호스트에서
    $ sudo tctl users add teleport-admin --roles=editor,access --logins=root,ec2-user
    # User "teleport-admin" has been created but requires a password. Share this URL with the user to complete user setup, link is valid for 1h:
    # https://teleport.example.com:443/web/newuser/6489ae886babf4232826076279bcb2fb
    

    Commercial:

    # EC2 Auth Service 호스트에서
    $ sudo tctl users add teleport-admin --roles=editor,access,reviewer --logins=root,ec2-user
    # User "teleport-admin" has been created but requires a password. Share this URL with the user to complete user setup, link is valid for 1h:
    # https://teleport.example.com:443/web/newuser/6489ae886babf4232826076279bcb2fb
    
  5. 링크를 클릭하여 Teleport 웹 UI를 실행하고 사용자 설정을 완료합니다.

tsh로 클러스터에 로그인#

Teleport 명령줄 도구(tsh)를 사용하여 사용자를 프로비저닝한 후 Teleport 클러스터에 로그인할 수 있습니다.

Teleport Community Edition:

# tsh로 로그인할 때 URL 시작 부분의 https://는 필요하지 않습니다
$ export PROXY_ADDRESS=$(terraform output -raw cluster_web_address | sed 's_https://__')
$ tsh login --proxy=${PROXY_ADDRESS} --user=teleport-admin
# ...
$ tsh ls
$ tsh ssh root@ip-172-31-11-69-ec2-internal

Teleport 서비스 재시작/확인#

Teleport Auth Service#

$ systemctl status teleport-auth.service

HA 배포에서는 두 개 이상의 Teleport Auth Service 인스턴스가 있습니다. 각 Auth Service 인스턴스의 IP 주소를 가져오려면 이 명령을 사용하세요:

$ terraform output -json auth_instance_private_ips
["172.31.0.33","172.31.1.136"]

Teleport Proxy Service#

Teleport Proxy Service의 systemd 서비스 이름은 Let's Encrypt(teleport-proxy.service)와 ACM(teleport-proxy-acm.service) 사이에 다릅니다.

Let's Encrypt 사용 시:

$ systemctl status teleport-proxy.service

ACM 사용 시:

$ systemctl status teleport-proxy-acm.service

Teleport 클러스터에 에이전트 추가#

클러스터에 새 리소스를 빠르게 추가하는 가장 쉬운 방법은 Teleport 웹 UI의 "Enroll New Resource" 마법사를 사용하는 것입니다.

새 노드/EC2 서버를 "SSH로 접근"할 수 있도록 추가하려면 다음이 필요합니다:

SSH Service 합류 토큰 가져오기#

다음 명령을 사용하여 Teleport 클러스터에 대한 합류 토큰을 가져올 수 있습니다:

$ CLUSTER_NAME=$(terraform output -raw cluster_name)
$ aws ssm get-parameter --region  --name "/teleport/${CLUSTER_NAME}/tokens/node" --query "Parameter.Value" --with-decryption --output text --no-cli-pager
# 992a9725-0a64-428d-8e5e-308e6877743d

신뢰할 수 있는 클러스터#

신뢰할 수 있는 클러스터를 추가하려면 프록시 로드 밸런서의 호스트 이름이 필요합니다.

이 예시에서 신뢰할 수 있는 클러스터 구성의 web_proxy_addr은 다음과 같이 설정해야 합니다:

spec:
  web_proxy_addr:  name="teleport.example.com" />:443

문제 해결#

AWS 할당량#

AWS 서비스 할당량 제한에 도달하면 Terraform 배포에서 오류가 발생할 수 있습니다. 현재 AWS 계정의 할당량을 확인하려면 AWS Service Quotas 콘솔을 사용하거나 AWS CLI를 사용하여 특정 서비스 할당량을 확인하세요.

AWS에서 Terraform으로 프로덕션 Teleport 배포

원문 보기
요약

이 가이드는 참조 Terraform 코드와 함께 사용하여 결과 Teleport 배포를 관리하는 방법을 설명합니다. 이 가이드는 인프라가 AWS GovCloud에 호스팅되지 않고 에어갭 AWS 환경(EKS Anywhere)에 있지 않다고 가정합니다.

이 가이드는 참조 Terraform 코드와 함께 사용하여 결과 Teleport 배포를 관리하는 방법을 설명합니다.

사전 요구사항#

이 가이드는 인프라가 AWS GovCloud에 호스팅되지 않고 에어갭 AWS 환경(EKS Anywhere)에 있지 않다고 가정합니다. 그런 경우라면 배포 계획 지원을 위해 Teleport 팀에 연락하세요.

이 가이드에는 다음도 필요합니다:

  • 시스템에 설치된 Terraform. 지침은 Terraform 설치를 방문하세요. terraform이 경로에 있다고 가정합니다.

    $ which terraform
    /usr/local/bin/terraform
    $ terraform version
    Terraform v1.5.6
    
  • aws 명령줄 도구. Ubuntu/Debian/Fedora/CentOS 및 macOS Homebrew에서 awscli 패키지로 사용 가능합니다.

    Fedora/CentOS: yum -y install awscli

    Ubuntu/Debian: apt-get -y install awscli

    macOS (Homebrew 사용): brew install awscli

    가능한 경우 패키지를 통한 설치가 항상 더 좋습니다. 배포에 사용 가능한 패키지를 찾을 수 없는 경우 https://aws.amazon.com/cli/에서 도구를 다운로드할 수도 있습니다.

  • ~/.aws/credentials에서 사용 가능한 자격 증명으로 AWS CLI 접근이 구성되어 있다고 가정합니다:

    $ cat ~/.aws/credentials
    # [default]
    # aws_access_key_id = (=aws.aws_access_key=)
    # aws_secret_access_key = (=aws.aws_secret_access_key=)
    
  • ~/.aws/config에 기본 리전이 설정되어 있어야 합니다:

    $ cat ~/.aws/config
    # [default]
    # region = us-west-2
    

    결과적으로 aws ec2 describe-instances와 같은 명령을 실행하여 실행 중인 EC2 인스턴스를 나열할 수 있어야 합니다. "액세스 거부됨", "403 Forbidden" 또는 유사한 메시지가 표시되면 aws_access_key_idaws_secret_access_key가 참조하는 AWS IAM 사용자에게 추가 권한을 부여해야 합니다.

  • Route 53 영역. Terraform 모듈은 이 영역에 Teleport 클러스터에 대한 DNS 레코드를 생성합니다.

  • AWS에서 생성된 키 쌍. 이 가이드에서 보여주는 Terraform 모듈을 사용하여 생성하는 Amazon EC2 인스턴스에 접근하는 데 사용합니다.

일반적인 규칙으로 Terraform을 실행하는 모든 사용자에게 다음 AWS 서비스에 대한 관리자 수준 권한이 있다고 가정합니다:

Terraform 배포 자체는 AWS 서비스에 대해 적절히 제한된 권한 범위를 가진 Teleport 인스턴스에서 사용할 새 IAM 역할을 생성합니다. 그러나 초기 클러스터 설정은 높은 수준의 AWS 권한이 있는 사용자가 수행해야 합니다.

Terraform 코드 가져오기#

먼저 Teleport 리포지토리를 클론하여 시스템에서 Terraform 코드를 사용할 수 있도록 해야 합니다:

$ git clone https://github.com/gravitational/teleport -b branch/v(=teleport.major_version=)
# Cloning into 'teleport'...
# remote: Enumerating objects: 106, done.
# remote: Counting objects: 100% (106/106), done.
# remote: Compressing objects: 100% (95/95), done.
# remote: Total 61144 (delta 33), reused 35 (delta 11), pack-reused 61038
# Receiving objects: 100% (61144/61144), 85.17 MiB | 4.66 MiB/s, done.
# Resolving deltas: 100% (39141/39141), done.

완료되면 Terraform 코드가 체크아웃된 디렉터리로 변경하고 terraform init을 실행할 수 있습니다:

$ cd teleport/examples/aws/terraform/ha-autoscale-cluster
$ terraform init

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...
- Installing hashicorp/aws v5.31.0...
- Installed hashicorp/aws v5.31.0 (signed by HashiCorp)

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

이렇게 하면 참조 코드를 사용하여 Teleport를 실행하는 데 필요한 적절한 Terraform 플러그인이 다운로드됩니다.

변수 설정#

Terraform 모듈은 변수를 사용하여 입력을 전달합니다. 다음과 같은 몇 가지 방법으로 수행할 수 있습니다:

  • terraform apply에 대한 명령줄에서
  • vars.tf 파일을 편집하여
  • 환경 변수를 설정하여

이 가이드에서는 환경 변수를 광범위하게 사용할 것입니다. 클러스터가 생성된 후 Teleport 명령을 실행할 때 구성의 값을 더 쉽게 참조할 수 있기 때문입니다.

TF_VAR_로 시작하는 모든 설정 환경 변수는 Terraform에 의해 자동으로 처리되고 제거되므로 TF_VAR_test_variabletest_variable이 됩니다.

Teleport 리포의 examples/aws/terraform/ha-autoscale-cluster 섹션에 있는 README.md 파일에 변수와 기능에 대한 최신 목록을 유지하지만 여기서 예시 목록을 살펴보겠습니다.

결정해야 할 사항:

region#

$ export TF_VAR_region=""

실행할 AWS 리전입니다. README에 자세히 나온 지원 목록에서 선택해야 합니다. 이들은 DynamoDB 저장 암호화를 지원하는 리전입니다.

cluster_name#

$ export TF_VAR_cluster_name="teleport-example"

사용할 내부 Teleport 클러스터 이름입니다. 이는 고유해야 하며 공백, 점(.) 또는 기타 특수 문자를 포함하지 않아야 합니다. 일부 AWS 서비스는 이름에 점을 사용하는 것을 허용하지 않으므로 도메인 이름으로 설정하지 않아야 합니다. 이것은 클러스터의 웹 UI에 나타나며 처음부터 클러스터를 재구축하지 않고는 생성 후에 변경할 수 없으므로 신중하게 선택합니다. teleport-<company-name>과 같은 것이 좋은 예일 수 있습니다.

ami_name#

$ export TF_VAR_ami_name="teleport-ent-(=teleport.version=)-x86_64"

Teleport(Gravitational)는 Teleport의 새 버전을 릴리즈할 때 자동으로 Teleport Community Edition, Enterprise 및 Enterprise FIPS AMI를 빌드하고 게시합니다. AMI 이름은 teleport-<type>-<version>-<arch> 형식을 따르며, <type>oss 또는 ent(Enterprise), <version>은 Teleport 버전(예: <code>[teleport.version]</code>), <arch>x86_64 또는 arm64입니다.

FIPS 140 호환 AMI(기본적으로 FIPS 모드에서 Teleport를 배포)는 <arch> 뒤에 -fips 접미사가 있습니다. 예: teleport-ent-<code>[teleport.version]</code>-x86_64-fips.

이러한 AMI를 게시하는 AWS 계정 ID는 146628656107입니다. 아래 예시 awscli 명령으로 사용 가능한 AMI를 나열할 수 있습니다. 출력은 기본적으로 JSON 형식입니다.

팁: Teleport AMI 나열

OSS AMI:

$ aws --region  ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-oss-(=teleport.version=)-*'

Enterprise AMI:

$ aws --region  ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-ent-(=teleport.version=)-*'

Enterprise FIPS AMI:

$ aws --region  ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-ent-(=teleport.version=)-*-fips-*'

key_name#

$ export TF_VAR_key_name="exampleuser"

EC2 인스턴스를 배포할 때 사용할 AWS 키 쌍 이름입니다. 이것은 region 변수에 지정한 것과 동일한 리전에 있어야 하며, 배포된 EC2 인스턴스에 연결하기 위해 이 키 쌍의 사본이 필요합니다. 접근할 수 없는 키 쌍을 사용하지 마세요.

license_path#

라이선스를 획득합니다.

$ export TF_VAR_license_path="/home/user/license.pem"

이 라이선스는 AWS SSM에 업로드되고 Teleport Enterprise 기능을 활성화하기 위해 Teleport Auth Service 인스턴스에 자동으로 다운로드됩니다.

(Teleport Community Edition 사용자는 로컬에서 touch /tmp/license.pem을 실행하여 빈 파일을 생성한 다음 여기에 '/tmp/license.pem' 경로를 제공할 수 있습니다. 라이선스 파일은 Teleport Community Edition 설치에서 사용되지 않습니다.)

route53_zone#

$ export TF_VAR_route53_zone="example.com"

Terraform 설정에는 Amazon Route 53에서 도메인이 프로비저닝되어 있어야 합니다 - 아래에 설정된 대로 route53_domain에 대한 DNS 레코드를 자동으로 추가합니다. 다음 명령으로 이를 나열할 수 있습니다:

$ aws route53 list-hosted-zones --query "HostedZones[*].Name" --output json
[
    "example.com.",
    "testing.net.",
    "subdomain.wow.org."
]

후행 점 없이 적절한 도메인을 사용해야 합니다.

route53_domain#

$ export TF_VAR_route53_domain=""

웹 접근을 위한 Teleport 로드 밸런서에 대한 CNAME으로 설정할 서브도메인. 이것은 사람들이 Teleport 클러스터에 연결하는 데 사용할 공개 도메인이 되므로 신중하게 선택합니다.

이것은 위의 route53_zone에 선택한 도메인의 서브도메인이어야 합니다.

add_wildcard_route53_record#

$ export TF_VAR_add_wildcard_route53_record="true"

Teleport Proxy Service의 공개 웹 주소의 서브도메인에 대한 Teleport Application Service를 활성화하는 데 사용합니다. 공개 도메인에 대한 와일드카드 항목이 Route 53에 설정됩니다(예: *.teleport.example.com). ACM의 경우 이것이 true로 설정되면 와일드카드 인증서가 포함됩니다. Let's Encrypt는 발급하는 인증서에 와일드카드 서브도메인을 자동으로 포함합니다.

enable_mongodb_listener#

$ export TF_VAR_enable_mongodb_listener="false"

true로 설정하면 Teleport MongoDB 리스너 포트에 연결하는 Network Load Balancer에서 포트 27017이 활성화됩니다. TLS 라우팅을 사용하지 않는 경우 MongoDB 연결에 필요합니다.

enable_mysql_listener#

$ export TF_VAR_enable_mysql_listener="false"

Teleport MySQL 리스너 포트에 연결하는 Network Load Balancer에서 포트 3036이 활성화됩니다. TLS 라우팅을 사용하지 않는 경우 MySQL 연결에 필요합니다.

enable_postgres_listener#

$ export TF_VAR_enable_postgres_listener="false"

Teleport PostgreSQL 리스너 포트에 연결하는 Network Load Balancer에서 포트 5432가 활성화됩니다. TLS 라우팅을 사용하지 않는 경우 PostgreSQL 연결에 필요합니다.

s3_bucket_name#

$ export TF_VAR_s3_bucket_name="teleport-example"

Terraform 예시는 LetsEncrypt에서 프로비저닝한 인증서를 보관하고 EC2 인스턴스에 배포하는 S3 버킷도 프로비저닝합니다. 이것은 S3 호환 이름이 될 수 있으며 위에서 설정한 것과 동일한 리전에서 생성됩니다.

ACM을 사용할 때도 이 버킷은 Teleport 세션 로그를 저장하는 데도 사용되므로 프로비저닝됩니다.

S3 버킷 이름은 전 세계적으로 고유해야 하므로 S3 프로비저닝과 관련된 오류가 표시되면 더 고유한 버킷 이름을 선택하세요.

email#

$ export TF_VAR_email="support@example.com"

Let's Encrypt는 알림과 유용한 정보를 전송하는 데 사용할 수 있는 등록된 모든 인증서에 대한 이메일 주소가 필요합니다. Teleport를 배포하는 팀이 접근할 수 있는 일반 ops/support 이메일 주소를 권장합니다.

use_acm#

$ export TF_VAR_use_acm="true"

"false"로 설정하면 Terraform은 Let's Encrypt를 사용하여 Teleport 클러스터의 공개 웹 UI 인증서를 프로비저닝합니다(route53_domain - 이 예시에서 https://teleport.example.com). 이것은 AWS 네트워크 로드 밸런서를 사용하여 Teleport 클러스터의 웹 UI에 대한 연결을 로드 밸런싱하며, SSL 종료는 Teleport 자체에 의해 처리됩니다.

"true"로 설정하면 Terraform은 AWS ACM을 사용하여 클러스터의 공개 웹 UI 인증서를 프로비저닝합니다. 이것은 AWS 애플리케이션 로드 밸런서를 사용하여 Teleport 클러스터의 웹 UI에 대한 연결을 로드 밸런싱하며, SSL 종료는 로드 밸런서에 의해 처리됩니다.

Terraform이 생성하는 대신 기존 ACM 인증서를 사용하려면 terraform apply 전에 다음 명령을 실행하여 Terraform이 이를 사용하도록 할 수 있습니다:

$ terraform import aws_acm_certificate.cert <certificate_arn>

가능하면 ACM을 사용하는 것을 권장합니다. Teleport 클러스터에 대한 인증서 관리를 단순화하기 때문입니다.

use_tls_routing#

$ export TF_VAR_use_tls_routing="true"

true 문자열로 설정하면 Teleport는 TLS 라우팅을 사용하여 모든 트래픽을 단일 포트를 통해 다중화합니다. 배포를 단순화하므로 설정에서 별도 포트를 사용할 특정 필요가 없는 한 이 설정을 항상 사용해야 합니다.

가장 간단하고 저렴한 배포를 위해 ACM과 TLS 라우팅을 모두 활성화하여 AWS 관리 인증서가 있는 단일 Application Load Balancer를 통해 모든 트래픽을 전달합니다.

teleport_auth_type#

$ export TF_VAR_teleport_auth_type="local"

이 값은 Teleport 클러스터에 사용되는 기본 인증 유형을 변경하는 데 사용할 수 있습니다. DynamoDB에 SAML, OIDC 또는 GitHub 커넥터가 구성되어 있을 때 AMI 업그레이드 시 기본 인증 유형을 유지하는 데 유용합니다. 기본값은 local입니다.

  • Teleport Community Edition은 local 또는 github 지원
  • Teleport Enterprise Edition은 local, github, oidc, 또는 saml 지원
  • Teleport Enterprise FIPS 배포는 로컬 인증이 비활성화되어 있으므로 github, oidc, 또는 saml 사용 필요

자세한 내용은 Teleport 인증 참조를 참조하세요.

default_tags#

$ export TF_VAR_default_tags='{"key":"value", "env":"dev"}'

이 값은 AWS Auto Scaling Groups(ASG)에 의해 동적으로 생성된 리소스를 포함하여 모든 리소스에 적용되는 기본 태그를 제어하는 데 사용할 수 있습니다. 기본값은 태그 없음입니다.

enable_auth_asg_instance_refresh#

$ export TF_VAR_enable_auth_asg_instance_refresh="false"

이 변수는 Teleport Auth Service AWS Autoscaling Group(ASG)에서 자동 인스턴스 새로 고침을 활성화하는 데 사용할 수 있습니다 - 새로 고침은 시작 템플릿 또는 구성 변경에 의해 트리거됩니다. Auth ASG 인스턴스 새로 고침을 활성화할 때는 주의하세요 - Teleport 버전을 업그레이드하면 인스턴스 새로 고침이 트리거되며 Teleport 클러스터를 업그레이드하기 전에 Auth 서버를 하나의 인스턴스로만 축소해야 합니다.

enable_proxy_asg_instance_refresh#

$ export TF_VAR_enable_proxy_asg_instance_refresh="false"

이 변수는 Teleport 프록시 서버 AWS Autoscaling Group(ASG)에서 자동 인스턴스 새로 고침을 활성화하는 데 사용할 수 있습니다 - 새로 고침은 시작 템플릿 또는 구성 변경에 의해 트리거됩니다.

enable_node_asg_instance_refresh#

$ export TF_VAR_enable_node_asg_instance_refresh="false"

이 변수는 Teleport 노드 서버 AWS Autoscaling Group(ASG)에서 자동 인스턴스 새로 고침을 활성화하는 데 사용할 수 있습니다 - 새로 고침은 시작 템플릿 또는 구성 변경에 의해 트리거됩니다.

참조 배포 기본값#

인스턴스#

참조 배포는 다음 기본 설정으로 AWS Auto Scaling Groups(ASG)를 사용하여 클러스터에 다음 인스턴스를 프로비저닝합니다:

  • 2 x m7g.large Teleport Auth Service 인스턴스 - 내부 네트워크 로드 밸런서 뒤에 있는 ASG, DynamoDB를 사용하여 공유 스토리지로 구성
  • 2 x m7g.large Teleport Proxy Service 인스턴스 - 공개 로드 밸런서(LetsEncrypt의 경우 NLB, ACM의 경우 ALB) 뒤에 있는 ASG
  • 1 x m7g.large Teleport SSH Service 인스턴스 - 이 ASG의 서버 인스턴스는 Teleport SSH Service가 활성화된 상태로 auth 서비스에 연결하여 합류합니다.
  • 1 x t4g.medium 배스천 서버 - 인스턴스에 대한 인바운드 SSH 트래픽의 유일한 허용 소스. 각 인스턴스가 인터넷에 직접 노출되지 않도록 수행됩니다.

노드 또는 모니터링 서비스를 설정하지 않으려면 ASG의 desired_sizemin_size0으로 설정하면 Terraform이 이를 프로비저닝하지 않습니다.

클러스터 상태 데이터베이스 스토리지#

참조 Terraform 배포는 Teleport가 DynamoDB에 클러스터 상태 데이터베이스를 저장하도록 설정합니다. 클러스터 상태 테이블 이름은 위의 cluster_name 변수에 구성된 클러스터 이름과 동일합니다.

이 예시에서 DynamoDB 테이블은 teleport-example로 불립니다.

Teleport가 DynamoDB로 작동하는 방법에 대한 자세한 내용은 스토리지 백엔드 가이드를 참조하세요.

감사 이벤트 스토리지#

참조 Terraform 배포는 Teleport가 DynamoDB에 클러스터 감사 로그를 저장하도록 설정합니다. 감사 이벤트 스토리지 테이블 이름은 위의 cluster_name 변수에 구성된 클러스터 이름과 동일하며 끝에 -events가 추가됩니다.

이 예시에서 DynamoDB 테이블은 teleport-example-events로 불립니다.

Teleport가 DynamoDB로 작동하는 방법에 대한 자세한 내용은 스토리지 백엔드 가이드를 참조하세요.

녹화된 세션 스토리지#

참조 Terraform 배포는 Teleport가 s3_bucket_name 변수에 구성된 동일한 S3 버킷의 records 디렉터리에 녹화된 세션 로그를 저장하도록 설정합니다.

이 예시에서는 s3://teleport-example/records입니다.

S3는 규제 환경에서 Teleport를 배포하는 고객에게 유용한 Amazon S3 Object Lock을 제공합니다. 오브젝트 잠금 구성은 이 가이드의 범위를 벗어납니다.

클러스터 도메인#

참조 Terraform 배포는 route53_domain 변수에서 참조하는 Route 53에 정의된 도메인에서 Teleport 클러스터를 사용할 수 있도록 설정합니다. 이 예시에서는 입니다.

Teleport의 웹 인터페이스는 Teleport 클러스터 호스트의 포트 443에서 사용할 수 있습니다 - https://teleport.example.com - 이것은 AWS 로드 밸런서에 대한 구성된 CNAME을 통해 이루어집니다.

TLS 라우팅 사용: use_tls_routingtrue로 설정되면 모든 Teleport SSH, 터널, Kubernetes 및 데이터베이스 트래픽도 route53_domain에 설정된 동일한 호스트 이름의 포트 443을 통해 흐릅니다.

TLS 라우팅 미사용: use_tls_routingfalse로 설정되면:

  • Teleport Proxy Service의 SSH 인터페이스는 AWS 제어 호스트 이름이 있는 네트워크 로드 밸런서를 통해 포트 3023에서 사용할 수 있습니다. tsh 클라이언트로 연결할 때 사용되는 기본 포트이며 추가 구성이 필요하지 않습니다.
  • Teleport Proxy Service의 역방향 터널 리스너는 AWS 제어 호스트 이름이 있는 동일한 네트워크 로드 밸런서를 통해 포트 3024에서 사용할 수 있습니다. 이를 통해 역방향 터널을 통해 연결된 신뢰할 수 있는 클러스터와 노드가 클러스터에 접근할 수 있습니다.
  • Teleport Proxy Service의 Kubernetes 리스너는 AWS 제어 호스트 이름이 있는 동일한 네트워크 로드 밸런서를 통해 포트 3026에서 사용할 수 있습니다. 이를 통해 Kubernetes 클라이언트가 Teleport 클러스터를 통해 Kubernetes 클러스터에 접근할 수 있습니다.

Terraform으로 배포#

위에 자세히 설명된 모든 변수에 대한 값을 설정하고 내보낸 후 구성을 유효성 검사하기 위해 terraform plan을 실행해야 합니다.

$ terraform plan
# ...
# Plan: 121 to add, 0 to change, 0 to destroy.

오류가 없으면 terraform apply를 실행할 수 있습니다:

$ terraform apply
# Plan: 121 to add, 0 to change, 0 to destroy.
#
# Do you want to perform these actions?
#  Enter a value: yes

여기에 yes를 입력하면 Terraform 배포가 시작됩니다. 완전히 배포하는 데 약 8-10분이 걸립니다.

Terraform 배포 제거/종료#

실행 중인 배포를 어떤 이유로든 종료해야 하는 경우 terraform destroy를 실행할 수 있습니다.

Terraform 설정 후 클러스터에 접근#

Terraform 설정이 완료되면 Teleport 클러스터의 웹 UI URL이 cluster_web_address Terraform 출력에 설정됩니다.

terraform output -raw cluster_web_address를 실행하여 배포 후 이를 볼 수 있습니다:

$ terraform output -raw cluster_web_address
https://teleport.example.com

Teleport 클러스터에 관리자 사용자 추가#

Teleport 클러스터에 사용자를 추가하려면 SSH를 통해 Teleport Auth Service 인스턴스에 연결하고 tctl 명령을 실행해야 합니다.

  1. Bastion 서버의 공개 IP를 terraform output -raw bastion_ip_public을 사용하여 가져옵니다:

    $ export BASTION_IP=$(terraform output -raw bastion_ip_public)
    $ echo ${BASTION_IP}
    # 1.2.3.4
    
  2. terraform output -json auth_instance_private_ips를 사용하고 awk로 파이프하여 Auth Service 인스턴스의 IP를 가져옵니다:

    $ export AUTH_IP=$(terraform output -json auth_instance_private_ips | awk -F\" '{print $2}')
    $ echo ${AUTH_IP}
    # 172.31.0.196
    
  3. 이 두 값을 사용하여 Auth Service 인스턴스에 SSH로 연결합니다:

    $ export KEY_NAME=$(terraform output -raw key_name)
    $ ssh -i ${KEY_NAME}.pem -o ProxyCommand="ssh -i ${KEY_NAME}.pem -W '[%h]:%p' ec2-user@${BASTION_IP}" ec2-user@${AUTH_IP}
    
  4. tctl 명령을 사용하여 Teleport의 관리자 사용자를 생성합니다:

    Teleport Community Edition:

    # EC2 Auth Service 호스트에서
    $ sudo tctl users add teleport-admin --roles=editor,access --logins=root,ec2-user
    # User "teleport-admin" has been created but requires a password. Share this URL with the user to complete user setup, link is valid for 1h:
    # https://teleport.example.com:443/web/newuser/6489ae886babf4232826076279bcb2fb
    

    Commercial:

    # EC2 Auth Service 호스트에서
    $ sudo tctl users add teleport-admin --roles=editor,access,reviewer --logins=root,ec2-user
    # User "teleport-admin" has been created but requires a password. Share this URL with the user to complete user setup, link is valid for 1h:
    # https://teleport.example.com:443/web/newuser/6489ae886babf4232826076279bcb2fb
    
  5. 링크를 클릭하여 Teleport 웹 UI를 실행하고 사용자 설정을 완료합니다.

tsh로 클러스터에 로그인#

Teleport 명령줄 도구(tsh)를 사용하여 사용자를 프로비저닝한 후 Teleport 클러스터에 로그인할 수 있습니다.

Teleport Community Edition:

# tsh로 로그인할 때 URL 시작 부분의 https://는 필요하지 않습니다
$ export PROXY_ADDRESS=$(terraform output -raw cluster_web_address | sed 's_https://__')
$ tsh login --proxy=${PROXY_ADDRESS} --user=teleport-admin
# ...
$ tsh ls
$ tsh ssh root@ip-172-31-11-69-ec2-internal

Teleport 서비스 재시작/확인#

Teleport Auth Service#

$ systemctl status teleport-auth.service

HA 배포에서는 두 개 이상의 Teleport Auth Service 인스턴스가 있습니다. 각 Auth Service 인스턴스의 IP 주소를 가져오려면 이 명령을 사용하세요:

$ terraform output -json auth_instance_private_ips
["172.31.0.33","172.31.1.136"]

Teleport Proxy Service#

Teleport Proxy Service의 systemd 서비스 이름은 Let's Encrypt(teleport-proxy.service)와 ACM(teleport-proxy-acm.service) 사이에 다릅니다.

Let's Encrypt 사용 시:

$ systemctl status teleport-proxy.service

ACM 사용 시:

$ systemctl status teleport-proxy-acm.service

Teleport 클러스터에 에이전트 추가#

클러스터에 새 리소스를 빠르게 추가하는 가장 쉬운 방법은 Teleport 웹 UI의 "Enroll New Resource" 마법사를 사용하는 것입니다.

새 노드/EC2 서버를 "SSH로 접근"할 수 있도록 추가하려면 다음이 필요합니다:

SSH Service 합류 토큰 가져오기#

다음 명령을 사용하여 Teleport 클러스터에 대한 합류 토큰을 가져올 수 있습니다:

$ CLUSTER_NAME=$(terraform output -raw cluster_name)
$ aws ssm get-parameter --region  --name "/teleport/${CLUSTER_NAME}/tokens/node" --query "Parameter.Value" --with-decryption --output text --no-cli-pager
# 992a9725-0a64-428d-8e5e-308e6877743d

신뢰할 수 있는 클러스터#

신뢰할 수 있는 클러스터를 추가하려면 프록시 로드 밸런서의 호스트 이름이 필요합니다.

이 예시에서 신뢰할 수 있는 클러스터 구성의 web_proxy_addr은 다음과 같이 설정해야 합니다:

spec:
  web_proxy_addr:  name="teleport.example.com" />:443

문제 해결#

AWS 할당량#

AWS 서비스 할당량 제한에 도달하면 Terraform 배포에서 오류가 발생할 수 있습니다. 현재 AWS 계정의 할당량을 확인하려면 AWS Service Quotas 콘솔을 사용하거나 AWS CLI를 사용하여 특정 서비스 할당량을 확인하세요.