인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
AWS에서 Teleport 고가용성 모드 설정
이 가이드는 우리의 참조 Terraform 코드와 함께 사용하도록 설계되었으며, 결과적으로 생성된 Teleport 배포를 관리하는 방법에 대해 설명합니다.
Tip
Teleport Enterprise Cloud는 이 설정을 자동으로 처리하므로 즉시 인프라에 대한 안전한 액세스를 제공할 수 있습니다.
Teleport Enterprise Cloud의 무료 평가판으로 시작하세요.
필수 조건
우리의 코드는 Terraform 0.13+를 요구합니다. 여기서 Terraform을 다운로드할 수 있습니다. terraform
이 설치되어 있고 경로에 추가되어 있다고 가정합니다.
which terraform/usr/local/bin/terraformterraform versionTerraform 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 CLI 접근 권한이 ~/.aws/credentials
에 있는 자격 증명으로 구성되어 있다고 가정합니다:
cat ~/.aws/credentials[default]
aws_access_key_id = abcd1234-this-is-an-example
aws_secret_access_key = zyxw9876-this-is-an-example
또한 ~/.aws/config
에 기본 리전이 설정되어 있어야 합니다:
cat ~/.aws/config[default]
region = us-west-2
그 결과, aws ec2 describe-instances
와 같은 명령을 실행하여 실행 중인 EC2 인스턴스를 나열할 수 있어야 합니다. "액세스 거부", "403 Forbidden" 또는 유사한 메시지가 표시되면, aws_access_key_id
와 aws_secret_access_key
가 참조하는 AWS IAM 사용자에게 추가 권한을 부여해야 합니다.
일반적으로, Terraform을 실행하는 모든 사용자는 다음 AWS 서비스에 대해 관리자로서의 권한을 가지고 있다고 가정합니다:
Terraform 배포 자체는 적절히 제한된 권한 범위를 가진 새로운 IAM 역할을 생성하여 Teleport 인스턴스에서 사용됩니다. 그러나 초기 클러스터 설정은 높은 수준의 AWS 권한을 가진 사용자에 의해 수행되어야 합니다.
Terraform 코드 가져오기
첫째, 시스템에서 Terraform 코드를 사용하기 위해 Teleport 저장소를 복제해야 합니다:
git clone https://github.com/gravitational/teleport -b branch/v17'teleport'로 복제 중...
remote: 객체 수 세기: 106, 완료.
remote: 객체 수 세기: 100% (106/106), 완료.
remote: 압축 중: 100% (95/95), 완료.
remote: 총 61144 (차이 33), 35 (차이 11) 재사용, 61038 패키지 재사용
객체 수 수신 중: 100% (61144/61144), 85.17 MiB | 4.66 MiB/s, 완료.
차이 해결 중: 100% (39141/39141), 완료.
이 작업이 완료되면, Terraform 코드가 체크아웃된 디렉토리로 이동하여 terraform init
를 실행할 수 있습니다:
cd teleport/examples/aws/terraform/ha-autoscale-clusterterraform init
백엔드 초기화 중...
프로바이더 플러그인 초기화 중...- 사용 가능한 프로바이더 플러그인 검색 중...- hashicorp/aws v5.31.0 설치 중...- hashicorp/aws v5.31.0 설치 완료 (HashiCorp에서 서명됨)
Terraform이 성공적으로 초기화되었습니다!
이제 Terraform을 사용하여 작업을 시작할 수 있습니다. 인프라에 필요한 변경 사항을 보려면 "terraform plan"을 실행해 보십시오. 모든 Terraform 명령이 이제 작동해야 합니다.
모듈이나 Terraform의 백엔드 구성을 설정하거나 변경하는 경우, 작업 중인 디렉토리를 재초기화하기 위해 이 명령을 다시 실행하십시오. 이를 잊으면 다른 명령이 이를 감지하고 필요 시 상기시켜 줄 것입니다.
이 작업은 참조 코드를 사용하여 Teleport를 시작하는 데 필요한 적절한 Terraform 플러그인을 다운로드합니다.
변수 설정
Terraform 모듈은 입력 값을 전달하기 위해 변수를 사용합니다. 이를 몇 가지 방법으로 수행할 수 있습니다:
terraform apply
명령줄에서vars.tf
파일을 수정하여- 환경 변수를 설정하여
이 가이드에서는 환경 변수를 광범위하게 사용할 것입니다. 이는 클러스터가 생성된 후 Teleport 명령을 실행할 때 구성을 참조하는 데 더 용이하기 때문입니다.
TF_VAR_
로 시작하는 모든 설정된 환경 변수는 자동으로 처리되어 Terraform에 의해 축소됩니다. 따라서 TF_VAR_test_variable
은 test_variable
이 됩니다.
우리는 Teleport 리포지토리의 examples/aws/terraform/ha-autoscale-cluster
섹션에서 변수와 그 기능에 대한 최신 목록을 유지하지만, 여기에서 예시 목록을 살펴보겠습니다.
결정해야 할 사항:
region
export TF_VAR_region="us-west-2"
실행할 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-17.0.0-dev-x86_64"
Teleport (Gravitational)은 새로운 버전의 Teleport가 출시될 때마다 Teleport Community Edition, Enterprise 및 Enterprise FIPS 140-2 AMI를 자동으로 빌드하고 게시합니다. AMI 이름은 다음 형식을 따릅니다: teleport-<type>-<version>-<arch>
여기서 <type>
은 oss
또는 ent
(Enterprise), <version>
은 Teleport의 버전, e.g. 17.0.0-dev
, 그리고 <arch>
는 x86_64
또는 arm64
입니다.
FIPS 140-2 호환 AMI(기본적으로 FIPS 140-2 모드로 Teleport를 배포함)는 <arch>
뒤에 -fips
접미사가 붙습니다, e.g. teleport-ent-17.0.0-dev-x86_64-fips
.
이 AMI를 게시하는 AWS 계정 ID는 146628656107
입니다. 아래의 예시 awscli
명령을 사용하여 사용 가능한 AMI를 나열할 수 있습니다. 출력은 기본적으로 JSON 형식입니다.
Teleport AMI 목록 보기
OSS AMI
aws --region us-west-2 ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-oss-17.0.0-dev-*'
Enterprise AMI
aws --region us-west-2 ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-ent-17.0.0-dev-*'
Enterprise FIPS 140-2 AMI
aws --region us-west-2 ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-ent-17.0.0-dev-*-fips-*'
key_name
export TF_VAR_key_name="exampleuser"
EC2 인스턴스를 배포할 때 사용할 AWS 키페어 이름입니다. 이는 region
변수에서 지정한 것과 동일한 지역에 존재해야 하며,
배포된 EC2 인스턴스에 연결할 수 있도록 이 키페어의 사본이 필요합니다. 접근할 수 없는 키페어는 사용하지 마십시오.
license_path
Teleport Auth 서비스는 Teleport Enterprise 계정을 인증하기 위해 라이센스 파일을 읽습니다.
라이센스 파일을 얻으려면 Teleport 계정 대시보드로 이동하여 로그인하십시오. teleport.sh에서 시작하여 Teleport 계정 이름(예: my-company)을 입력합니다. 로그인 후 "GENERATE LICENSE KEY" 버튼이 표시되며, 이를 클릭하면 새 라이센스 파일이 생성되고 다운로드할 수 있습니다.
export TF_VAR_license_path="/home/user/license.pem"
이 라이선스는 AWS SSM에 업로드되고, Teleport Auth Service 인스턴스에 자동으로 다운로드되어 Teleport Enterprise 기능을 활성화하는 데 사용됩니다.
(Teleport Community Edition 사용자는 로컬에서 touch /tmp/license.pem
을 실행하여 빈 파일을 생성한 후,
여기에서 '/tmp/license.pem' 경로를 제공할 수 있습니다. 라이선스 파일은 Teleport Community Edition 설치에서는 사용되지 않습니다.)
route53_zone
export TF_VAR_route53_zone="example.com"
우리의 Terraform 설정은 도메인이 AWS 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.example.com"
웹 액세스를 위한 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
으로 Teleport 로드 밸런서를 가리킵니다.
ACM에 대해 와일드카드 인증서가 포함되며, 설정이 true
로 되어 있으면 Let's Encrypt는 발급한 인증서에 와일드카드 서브도메인을 자동으로 포함합니다.
enable_mongodb_listener
export TF_VAR_enable_mongodb_listener="false"
이 설정이 true로 설정되면, Teleport MongoDB 리스너 포트와 연결되는 네트워크 로드 밸런서에서 포트 27017
이 활성화됩니다.
TLS 라우팅을 사용하지 않는 경우 MongoDB 연결에 필요합니다.
enable_mysql_listener
export TF_VAR_enable_mysql_listener="false"
Teleport MySQL 리스너 포트와 연결되는 네트워크 로드 밸런서에서 포트 3036
이 활성화됩니다.
TLS 라우팅을 사용하지 않는 경우 MySQL 연결에 필요합니다.
enable_postgres_listener
export TF_VAR_enable_postgres_listener="false"
Teleport PostgreSQL 리스너 포트와 연결되는 네트워크 로드 밸런서에서 포트 5432
가 활성화됩니다.
TLS 라우팅을 사용하지 않는 경우 PostgreSQL 연결에 필요합니다.
s3_bucket_name
export TF_VAR_s3_bucket_name="teleport-example"
Terraform 예제는 LetsEncrypt에 의해 프로비저닝된 인증서를 보유하고 이를 EC2 인스턴스에 배포하기 위해 S3 버킷도 프로비저닝합니다. 이는 S3 호환 이름이면 무엇이든 가능하며, 위에서 설정한 것과 동일한 지역에서 생성됩니다.
이 버킷은 Teleport 세션 로그를 저장하는 데도 사용되므로 ACM을 사용할 때도 여전히 프로비저닝됩니다.
S3 버킷 이름은 전세계적으로 고유해야 하므로, S3 프로비저닝 관련 오류가 발생하면 더 고유한 버킷 이름을 선택하십시오.
이메일
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입니다). 이는 Teleport 클러스터의 웹 UI로의 연결을 로드 밸런싱하기 위해 AWS 네트워크 로드 밸런서를 사용하며, SSL 종료는 Teleport 자체에서 처리됩니다.
문자열 "true"
로 설정하면, Terraform은 클러스터의 퍼블릭 UI 인증서를 프로비저닝하기 위해 AWS ACM을 사용합니다. 이는 Teleport 클러스터의 웹 UI로의 연결을 로드 밸런싱하기 위해 AWS 애플리케이션 로드 밸런서를 사용하며, 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 라우팅을 사용하여 모든 트래픽을 단일 포트를 통해 다중화합니다. 이 설정은 배포를 단순화하므로 설정에서 별도의 포트를 사용해야 할 특별한 필요가 없는 한 항상 사용해야 합니다.
가장 간단하고 저렴한 배포를 위해, 모든 트래픽을 AWS 관리 인증서가 있는 단일 애플리케이션 로드 밸런서를 통해 유도하기 위해 ACM과 TLS 라우팅을 모두 활성화하십시오.
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 server AWS Autoscaling Group (ASG)에서 자동 인스턴스 새로 고침을 활성화하는 데 사용할 수 있습니다 - 새로 고침은 시작 템플릿 또는 구성의 변경에 의해 트리거됩니다. auth ASG 인스턴스 새로 고침을 활성화할 때는 주의해야 하며, Teleport 버전을 업그레이드할 경우 인스턴스 새로 고침이 트리거되고 auth 서버는 Teleport 클러스터를 업그레이드하기 전에 오직 하나의 인스턴스만으로 축소되어야 합니다.
enable_proxy_asg_instance_refresh
export TF_VAR_enable_proxy_asg_instance_refresh="false"
이 변수는 Teleport 프록시 서버 AWS 자동 확장 그룹(ASG)에서 자동 인스턴스 새로 고침을 활성화하는 데 사용할 수 있습니다. 새로 고침은 시작 템플릿이나 구성의 변경으로 트리거됩니다.
enable_node_asg_instance_refresh
export TF_VAR_enable_node_asg_instance_refresh="false"
이 변수는 Teleport 노드 서버 AWS 자동 확장 그룹(ASG)에서 자동 인스턴스 새로 고침을 활성화하는 데 사용할 수 있습니다. 새로 고침은 시작 템플릿이나 구성의 변경으로 트리거됩니다.
참조 배포 기본값
인스턴스
우리의 참조 배포는 AWS 자동 확장 그룹(ASG)을 사용하여 클러스터에 다음 인스턴스를 프로비저닝합니다. 이 기본 설정:
- 2 x
m7g.large
Teleport Auth 서비스 인스턴스가 내부 네트워크 로드 밸런서 뒤에서 ASG에 존재하며, 공유 저장소를 위해 DynamoDB를 사용하여 구성됩니다. ASG의 원하는 크기는 여기에서 구성됩니다 - 2 x
m7g.large
Teleport Proxy 서비스 인스턴스가 외부 로드 밸런서 뒤에서 ASG에 존재합니다 - LetsEncrypt 용 NLB, ACM 용 ALB. ASG의 원하는 크기는 여기에서 구성됩니다 - 1 x
m7g.large
Teleport SSH 서비스 인스턴스가 ASG에 존재합니다. 이 ASG의 서버 인스턴스는 Teleport SSH 서비스가 활성화된 상태로 연결되며 auth 서비스에 연결됩니다. ASG의 원하는 크기는 여기에서 구성됩니다 - 1 x
t4g.medium
배스천 서버는 인스턴스로의 인바운드 SSH 트래픽에 대해 허용된 유일한 출처입니다. 이는 각 인스턴스를 인터넷에 직접 노출하는 것을 피하기 위해 수행됩니다.
각 ASG에 사용되는 인스턴스 유형은 여기에서 구성할 수 있습니다
노드 또는 모니터링 서비스를 설정할 필요가 없으면 ASG의 desired_size
와 min_size
를 0
으로 설정하면 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는 Amazon S3 Object Lock을 제공합니다, 이는 규제가 있는 환경에서 Teleport를 배포하는 고객에게 유용합니다. 객체 잠금 설정은 이 가이드의 범위를 벗어납니다.
클러스터 도메인
참조 Terraform 배포는 Route 53에 정의된 도메인에서 사용할 수 있게 Teleport 클러스터를 설정하며, 이는 route53_domain
변수로 참조됩니다. 우리의 예시에서는 teleport.example.com이 됩니다.
Teleport의 웹 인터페이스는 포트 443에서 사용할 수 있으며 - https://teleport.example.com - 이는 AWS 로드 밸런서에 설정된 CNAME을 통해 가능합니다.
use_tls_routing
를 true
로 설정하면, 모든 Teleport SSH, 터널, Kubernetes 및 데이터베이스 트래픽은
route53_domain
에서 설정한 동일한 호스트 이름의 포트 443을 통해 흐르게 됩니다.
use_tls_routing
를 false
로 설정하면:
- Teleport Proxy Service의 SSH 인터페이스는 AWS가 제어하는 호스트 이름으로 네트워크 로드 밸런서를 통해 포트 3023에서 사용할 수 있습니다.
이는
tsh
클라이언트로 연결할 때 기본적으로 사용되는 포트이며 추가 설정이 필요하지 않습니다. - Teleport Proxy Service의 리버스 터널 리스너는 AWS가 제어하는 호스트 이름의 네트워크 로드 밸런서를 통해 포트 3024에서 사용할 수 있습니다. 이는 신뢰할 수 있는 클러스터와 노드가 리버스 터널을 통해 클러스터에 접근할 수 있도록 합니다.
- Teleport Proxy Service의 Kubernetes 리스너는 AWS가 제어하는 호스트 이름의 네트워크 로드 밸런서를 통해 포트 3026에서 사용할 수 있습니다. 이는 Kubernetes 클라이언트가 Teleport 클러스터를 통해 Kubernetes 클러스터에 접근할 수 있도록 합니다.
- MongoDB 리스너 포트가 활성화된 경우, AWS가 제어하는 호스트 이름의 네트워크 로드 밸런서를 통해 포트 27017에서 사용할 수 있습니다. 이는 클라이언트가 Teleport 클러스터에 등록된 MongoDB 데이터베이스에 연결할 수 있도록 합니다.
- MySQL 리스너 포트가 활성화된 경우, AWS가 제어하는 호스트 이름의 네트워크 로드 밸런서를 통해 포트 3036에서 사용할 수 있습니다. 이는 클라이언트가 Teleport 클러스터에 등록된 MySQL 데이터베이스에 연결할 수 있도록 합니다.
- Postgres 리스너 포트가 활성화된 경우, AWS가 제어하는 호스트 이름의 네트워크 로드 밸런서를 통해 포트 5432에서 사용할 수 있습니다. 이는 클라이언트가 Teleport 클러스터에 등록된 Postgres 데이터베이스에 연결할 수 있도록 합니다.
배포 후, 필요에 따라 다음 명령어를 사용하여 Teleport Proxy Service 네트워크 로드 밸런서의 호스트 이름을 얻을 수 있습니다:
aws elbv2 describe-load-balancers --names "${TF_VAR_cluster_name}-proxy" --query "LoadBalancers[*].DNSName" --output textexample-cluster-proxy-7c97b76593d6bf21.elb.us-east-1.amazonaws.com
Teleport의 Auth Service 리스너는 AWS가 제어하는 호스트 이름의 내부 로드 밸런서를 통해 포트 3025에서 사용할 수 있습니다.
배포 후, 필요에 따라 다음 명령어를 사용하여 내부 Auth Service 로드 밸런서의 호스트 이름을 얻을 수 있습니다:
aws elbv2 describe-load-balancers --names "${TF_VAR_cluster_name}-auth" --query "LoadBalancers[*].DNSName" --output textexample-cluster-auth-c5b0fc2764ee015b.elb.us-east-1.amazonaws.com
Terraform으로 배포하기
위에 설명한 모든 변수에 대한 값을 설정하고 내보낸 후, terraform plan
을 실행하여 구성을 검증해야 합니다.
terraform plan계획에 앞서 Terraform 상태를 메모리 내에서 새로 고침합니다...
새로 고쳐진 상태는 이 계획을 계산하는 데 사용되지만,
로컬 또는 원격 상태 저장소에 영구적으로 저장되지는 않습니다.
data.template_file.monitor_user_data: 상태를 새로 고침 중...
data.aws_kms_alias.ssm: 상태를 새로 고침 중...
data.aws_caller_identity.current: 상태를 새로 고침 중...
data.aws_ami.base: 상태를 새로 고침 중...
data.aws_availability_zones.available: 상태를 새로 고침 중...
data.aws_route53_zone.proxy: 상태를 새로 고침 중...
data.aws_region.current: 상태를 새로 고침 중...
------------------------------------------------------------------------
실행 계획이 생성되었으며 아래에 표시됩니다.
리소스 작업은 다음 기호로 표시됩니다:
+ 생성
<= 읽기 (데이터 리소스)
Terraform은 다음 작업을 수행합니다:
<출력 생략>
계획: 추가 121, 변경 0, 삭제 0.
------------------------------------------------------------------------
참고: 이 계획을 저장하기 위해 "-out" 매개변수를 지정하지 않았습니다. 따라서 Terraform은 "terraform apply"를 다음에 실행할 때 정확히 이러한 작업이 수행될 것이라고 보장할 수 없습니다.
이것은 괜찮아 보입니다 (Terraform에 의해 오류가 생성되지 않음) 따라서 terraform apply
를 실행할 수 있습니다:
terraform apply<출력 생략>
계획: 추가 121, 변경 0, 삭제 0.
이러한 작업을 수행하시겠습니까?
Terraform은 위에 설명된 작업을 수행합니다.
'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_addresshttps://teleport.example.com
Teleport 클러스터에 관리자 사용자 추가하기
Teleport 클러스터에 사용자를 추가하려면, SSH를 통해 Teleport Auth Service 인스턴스에 연결하고 tctl
명령을 실행해야 합니다.
-
terraform output -raw bastion_ip_public
을 사용하여 bastion 서버의 공용 IP를 가져옵니다:export BASTION_IP=$(terraform output -raw bastion_ip_public)echo ${BASTION_IP}1.2.3.4
-
terraform output -json auth_instance_private_ips
를 사용하고awk
로 파이프하여 첫 번째 IP를 추출하여 Auth Service 인스턴스의 IP를 가져옵니다.export AUTH_IP=$(terraform output -json auth_instance_private_ips | awk -F\" '{print $2}')echo ${AUTH_IP}172.31.0.196
-
이 두 값을 사용하여 Auth Service 인스턴스에 SSH로 접속합니다.
key_name
변수에 지정한 AWS 키페어가 현재 디렉토리에 있어야 하거나,-i
매개변수를 업데이트하여 이를 가리키도록 합니다: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}호스트 '1.2.3.4 (1.2.3.4)'의 인증이 확립되지 않았습니다.
ECDSA 키 지문은 SHA256:vFPnCFliRsRQ1Dk+muIv2B1Owm96hXiihlOUsj5H3bg입니다.
계속 연결하시겠습니까 (yes/no/[fingerprint])? yes
경고: '1.2.3.4' (ECDSA)가 알려진 호스트 목록에 영구적으로 추가되었습니다.
호스트 '172.31.0.196 (<no hostip for proxy command>)'의 인증이 확립되지 않았습니다.
ECDSA 키 지문은 SHA256:vFPnCFliRsRQ1Dk+muIv2B1Owm96hXiihlOUsj5H3bg입니다.
계속 연결하시겠습니까 (yes/no/[fingerprint])? yes
경고: '172.31.0.196' (ECDSA)가 알려진 호스트 목록에 영구적으로 추가되었습니다.
마지막 로그인: 2020년 3월 3일 화요일 18:57:12 (1.2.3.5)에서
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
보안에 필요한 패키지 1개, 사용할 수 있는 패키지 6개
모든 업데이트를 적용하려면 "sudo yum update"를 실행하십시오.
[ec2-user@ip-172-31-0-196 ~]$
-
tctl
명령을 사용하여 Teleport의 관리자 사용자를 생성합니다:
EC2 Auth Service 호스트에서
sudo tctl users add teleport-admin --roles=editor,access --logins=root,ec2-user사용자 "teleport-admin"이 생성되었으나 비밀번호가 필요합니다. 사용자가 사용자 설정을 완료하도록 이 URL을 공유하세요. 링크는 1시간 동안 유효합니다:
https://teleport.example.com:443/web/newuser/6489ae886babf4232826076279bcb2fb
# 참고: teleport.example.com:443이 사용자들이 접근할 수 있는 Teleport 프록시를 가리키는지 확인하세요.
EC2 Auth Service 호스트에서
sudo tctl users add teleport-admin --roles=editor,access,reviewer --logins=root,ec2-user사용자 "teleport-admin"이 생성되었으나 비밀번호가 필요합니다. 사용자가 사용자 설정을 완료하도록 이 URL을 공유하세요. 링크는 1시간 동안 유효합니다:
https://teleport.example.com:443/web/newuser/6489ae886babf4232826076279bcb2fb
참고: teleport.example.com:443이 사용자들이 접근할 수 있는 Teleport 프록시를 가리키는지 확인하세요.
- 링크를 클릭하여 Teleport 웹 UI를 시작하고 사용자를 설정하세요. WebAuthn 호환 하드웨어 키(예: Yubikey, passkey 또는 Touch ID)를 사용하거나, Google Authenticator나 Authy와 같은 TOTP 호환 앱으로 QR 코드를 스캔할 수 있습니다.
이 페이지에서
teleport-admin
사용자에 대한 비밀번호도 설정합니다.
이 사용자가 성공적으로 구성되면, Teleport 웹 UI에 로그인되어 있어야 합니다.
클러스터에 tsh로 로그인하기
사용자를 프로비저닝한 후 Teleport 명령줄 도구(tsh
)를 사용하여 Teleport 클러스터에 로그인할 수 있습니다.
tsh 클라이언트를 포함하는 Teleport 패키지를 여기에서 다운로드할 수 있습니다.
- 클라이언트는 Teleport Community Edition과 Teleport Enterprise 모두에서 동일합니다.
tsh로 로그인할 때 URL의 시작 부분에 https://가 필요하지 않습니다.
export PROXY_ADDRESS=$(terraform output -raw cluster_web_address | sed 's_https://__')tsh login --proxy=${PROXY_ADDRESS} --user=teleport-adminTeleport 사용자 teleport-admin의 비밀번호를 입력하십시오:
보안 키를 누르십시오
보안 키 눌림 감지됨
> 프로필 URL: https://teleport.example.com:443
로그인한 사용자: teleport-admin
클러스터: example-cluster
역할: editor, access
로그인: root
유효 기간: 2023-10-06 22:07:11 -0400 AST [12시간 유효]
확장: permit-agent-forwarding, permit-port-forwarding, permit-pty
tsh ls노드 이름 주소 레이블
---------------------------- ----------------- ------
ip-172-31-11-69-ec2-internal 172.31.11.69:3022
tsh ssh root@ip-172-31-11-69-ec2-internal[root@ip-172-31-11-69 ~]#
tsh로 로그인할 때 URL의 시작 부분에 https://가 필요하지 않습니다.
export PROXY_ADDRESS=$(terraform output -raw cluster_web_address | sed 's_https://__')tsh login --proxy=${PROXY_ADDRESS} --user=teleport-adminTeleport 사용자 teleport-admin의 비밀번호를 입력하십시오:
보안 키를 누르십시오
보안 키 눌림 감지됨
> 프로필 URL: https://teleport.example.com:443
로그인한 사용자: teleport-admin
클러스터: example-cluster
역할: editor, access, reviewer
로그인: root
유효 기간: 2023-10-06 22:07:11 -0400 AST [12시간 유효]
확장: permit-agent-forwarding, permit-port-forwarding, permit-pty
tsh ls노드 이름 주소 레이블
---------------------------- ----------------- ------
ip-172-31-11-69-ec2-internal 172.31.11.69:3022
tsh ssh root@ip-172-31-11-69-ec2-internal[root@ip-172-31-11-69 ~]#
Teleport 서비스 재시작/확인
Teleport Auth 서비스
systemctl status teleport-auth.service● teleport-auth.service - Teleport Auth 서비스
Loaded: loaded (/etc/systemd/system/teleport-auth.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-03-05 16:45:18 UTC; 4h 14min ago
Main PID: 3766 (teleport)
CGroup: /system.slice/teleport-auth.service
└─3766 /usr/bin/teleport start --config=/etc/teleport.yaml --diag-addr=127.0.0.1:3000 --pid-file=/run/teleport/teleport.pid
Mar 05 17:54:58 ip-172-31-0-196.ec2.internal /usr/bin/teleport[3766]: INFO [CA] TLS 인증서 생성 중 {0x3767920 0xc0012802f0 CN=teleport-admin,O=admin,POSTALCODE={\"kubernetes_groups\":null\,\"logins\":null},STREET=,L=root 2020-03-06 05:54:58.846233666 +0000 UTC []}. common_name:teleport-admin dns_name...
Mar 05 18:04:39 ip-172-31-0-196.ec2.internal /usr/bin/teleport[3766]: INFO [CA] TLS 인증서 생성 중 {0x3767920 0xc00155d200 CN=teleport-admin,O=admin,POSTALCODE={\"kubernetes_groups\":null\,\"logins\":null},STREET=,L=root 2020-03-06 06:04:39.844777551 +0000 UTC []}. common_name:teleport-admin dns_name...
journalctl
명령어를 사용하면 Teleport Auth 서비스에 대한 자세한 로그를 얻을 수 있습니다:
journalctl -u teleport-auth.service
고가용성 배포에서는 하나 이상의 Teleport Auth 서비스 인스턴스가 있습니다. 연결해야 할 각 Auth 서비스 인스턴스의 IP 주소를 얻으려면 이 명령을 사용하십시오:
terraform output -json auth_instance_private_ips["172.31.0.33","172.31.1.136"]
그러나 클러스터에 연결된 모든 Teleport Auth 서비스 인스턴스에서 tctl
명령을 실행할 수 있습니다.
Teleport Proxy Service
Teleport Proxy Service의 systemd
서비스 이름은 Let's Encrypt (teleport-proxy.service
)와 ACM (teleport-proxy-acm.service
) 간에 다릅니다.
use_acm
변수가 "false"
로 설정된 경우, LetsEncrypt를 사용하고 있습니다.
systemctl status teleport-proxy.service● teleport-proxy.service - Teleport Proxy Service
Loaded: loaded (/etc/systemd/system/teleport-proxy.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-03-05 17:14:37 UTC; 3h 47min ago
Process: 4502 ExecStartPre=/usr/bin/teleport-ssm-get-token (code=exited, status=0/SUCCESS)
Main PID: 4514 (teleport)
CGroup: /system.slice/teleport-proxy.service
└─4514 /usr/bin/teleport start --config=/etc/teleport.yaml --diag-addr=127.0.0.1:3000 --pid-file=/run/teleport/teleport.pid
Mar 05 20:58:25 ip-172-31-2-109.ec2.internal /usr/bin/teleport[4514]: ERRO read tcp 172.31.2.109:3024->172.31.2.143:1577: read: connection reset by peer
Mar 05 20:58:50 ip-172-31-2-109.ec2.internal /usr/bin/teleport[4514]: ERRO read tcp 172.31.2.109:3023->172.31.2.143:38011: read: connection reset by peer
Teleport Proxy Service의 상세 로그는 journalctl
명령어를 사용하여 확인할 수 있습니다.
journalctl -u teleport-proxy.service
Note
use_acm
변수가 "true"
로 설정된 경우, ACM을 사용하고 있습니다.
systemctl status teleport-proxy-acm.service● teleport-proxy-acm.service - Teleport Proxy Service (ACM)
Loaded: loaded (/etc/systemd/system/teleport-proxy-acm.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-03-05 17:14:37 UTC; 3h 47min ago
Process: 4502 ExecStartPre=/usr/bin/teleport-ssm-get-token (code=exited, status=0/SUCCESS)
Main PID: 4514 (teleport)
CGroup: /system.slice/teleport-proxy-acm.service
└─4514 /usr/bin/teleport start --config=/etc/teleport.yaml --diag-addr=127.0.0.1:3000 --pid-file=/run/teleport/teleport.pid
Mar 05 20:58:25 ip-172-31-2-109.ec2.internal /usr/bin/teleport[4514]: ERRO read tcp 172.31.2.109:3024->172.31.2.143:1577: read: connection reset by peer
Mar 05 20:58:50 ip-172-31-2-109.ec2.internal /usr/bin/teleport[4514]: ERRO read tcp 172.31.2.109:3023->172.31.2.143:38011: read: connection reset by peer
Teleport Proxy Service의 상세 로그는 journalctl
명령어를 사용하여 확인할 수 있습니다.
journalctl -u teleport-proxy-acm.service
고가용성 배포에서는 하나 이상의 Teleport Proxy Service 인스턴스가 있음을 기억하세요. 로그를 확인하기 위해 연결해야 할 각 프록시 인스턴스의 IP 주소를 얻으려면 다음 명령어를 사용할 수 있습니다:
terraform output -json proxy_instance_private_ips["172.31.2.221","172.31.3.12"]
Teleport SSH 서비스
systemctl status teleport-node.service● teleport-node.service - Teleport SSH 노드 서비스
Loaded: loaded (/etc/systemd/system/teleport-node.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-03-05 17:18:25 UTC; 3h 44min ago
Process: 4444 ExecStartPre=/usr/bin/teleport-ssm-get-token (code=exited, status=0/SUCCESS)
Main PID: 4456 (teleport)
CGroup: /system.slice/teleport-node.service
└─4456 /usr/bin/teleport start --config=/etc/teleport.yaml --diag-addr=127.0.0.1:3000 --pid-file=/run/teleport/teleport.pid
Mar 05 17:18:25 ip-172-31-11-69.ec2.internal /usr/bin/teleport[4456]: INFO [AUDIT:1] Creating directory /var/lib/teleport/log/upload/sessions. ser...o:1630
Mar 05 17:18:25 ip-172-31-11-69.ec2.internal /usr/bin/teleport[4456]: INFO [AUDIT:1] Setting directory /var/lib/teleport/log/upload/sessions owner...o:1639
Teleport SSH 서비스에 대한 자세한 로그는 journalctl
명령어를 사용하여 확인할 수 있습니다:
journalctl -u teleport-node.service
Teleport 클러스터에 에이전트 추가하기
고객은 AWS 내에서 많은 작업 부하를 운영하며, 작업 방식에 따라 Teleport를 서버에 통합하는 방법이 많습니다. 설치 가이드를 참조하시기를 권장합니다.
"SSH로 연결할 수 있는" 새로운 노드/EC2 서버를 추가하려면 다음이 필요합니다:
- 서버에 Teleport 바이너리 설치하기
- Teleport 실행하기 - systemd 사용을 권장합니다
- /etc/teleport.yaml에서 올바른 설정하기
- Teleport 클러스터에 노드 추가하기
SSH 서비스 조인 토큰 가져오기
Teleport 클러스터에 대한 조인 토큰을 가져오려면 이 명령어를 사용할 수 있습니다:
CLUSTER_NAME=$(terraform output -raw cluster_name)aws ssm get-parameter --region us-west-2 --name "/teleport/${CLUSTER_NAME}/tokens/node" --query "Parameter.Value" --with-decryption --output text --no-cli-pager992a9725-0a64-428d-8e5e-308e6877743d
또한 tctl tokens add --type=node
를 사용하여 SSH 서비스 조인 토큰을 생성할 수 있습니다 관리자 가이드의 여기에 자세히 설명되어 있습니다.
클러스터에 에이전트 조인하기
클러스터에 노드를 신속하게 조인하는 가장 쉬운 방법은 Teleport 웹 UI의 "신규 리소스 등록" 마법사를 사용하는 것입니다.
Teleport 에이전트를 클러스터에 수동으로 조인하려면 조인 토큰이 필요합니다.
에이전트를 공개 Proxy Service 주소 - teleport.example.com:443
를 사용하여 조인해야 합니다.
teleport:
proxy_server: teleport.example.com:443
신뢰할 수 있는 클러스터
신뢰할 수 있는 클러스터를 추가하려면 프록시 로드 밸런서의 호스트 이름이 필요합니다.
이 예제에서 신뢰할 수 있는 클러스터 구성의 web_proxy_addr
는 다음과 같이 설정해야 합니다:
spec:
web_proxy_addr: teleport.example.com:443
신뢰할 수 있는 클러스터를 추가하기 위해 토큰을 생성하려면 Teleport Auth Service 인스턴스에 연결한 후 tctl tokens add --type=trusted_cluster
를 사용하십시오. 신뢰할 수 있는 클러스터 가이드의 지침을 따르세요.
인스턴스에 빠르게 연결하는 스크립트
examples/aws/terraform/ha-autoscale-cluster
디렉토리의 connect.sh
스크립트를 사용하여 배치된 중개 인스턴스를 통해 Teleport 인스턴스에 SSH 접근을 얻을 수 있습니다.
스크립트에 실행 권한 부여
chmod +x connect.sh사용 예
첫 번째 Teleport Auth Service 인스턴스에 연결
./connect.sh auth 0두 번째 Teleport Auth Service 인스턴스에 연결
./connect.sh auth 1첫 번째 Teleport Proxy Service 인스턴스에 연결
./connect.sh proxy 0두 번째 Teleport Proxy Service 인스턴스에 연결
./connect.sh proxy 1예제 Teleport SSH Service 인스턴스에 연결
./connect.sh node
문제 해결
AWS 쿼터
배포한 Teleport 서비스가 기본 서비스 할당량을 초과하는 경우, AWS 지원 센터에 할당량 증가를 요청할 수 있습니다. 자세한 내용은 Amazon의 AWS 서비스 할당량 문서를 참조하십시오.
예를 들어, Teleport 클러스터 상태의 백엔드로 DynamoDB를 사용할 때, 읽기/쓰기 할당량 증가를 요청해야 할 수 있습니다.