인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
AWS EC2 Identity Document를 통한 서비스 연결
이 가이드는 EC2 조인 방법을 사용하여 Teleport 프로세스를 구성하여 AWS에서 실행 중일 때 비밀을 공유하지 않고 Teleport 클러스터에 조인하는 방법을 설명합니다.
EC2 조인 방법은 셀프 호스팅된 Teleport 배포에서만 사용할 수 있습니다. 사용 사례에 따라 두 가지 다른 AWS 조인 방법이 있습니다:
- IAM 조인 방법은 IAM 자격 증명에 액세스할 수 있는 모든 Teleport 프로세스에서 사용할 수 있으며, 예를 들어 연결된 IAM 역할이 있는 EC2 인스턴스(자세한 내용은 문서 참조)가 있습니다. 특정 권한이나 IAM 정책이 필요하지 않으며, 부착된 정책이 없는 IAM 역할이 충분합니다. Teleport Auth Service에서 IAM 자격 증명이 필요하지 않습니다.
- AWS에 의해 서명되지 않은 토큰: AWS에서 실행 중인 Teleport 프로세스를 Teleport 조인 토큰을 통해 클러스터에 조인하도록 구성하거나, Kubernetes에서 실행 중인 Teleport 프로세스의 경우 서명된 ServiceAccount 토큰을 사용할 수 있습니다. 이러한 접근 방식은 클라우드 중립 접근 방식을 채택할 때 AWS 특정 API에 의존하고 싶지 않을 때 Teleport 프로세스를 클러스터에 조인할 수 있게 해줍니다.
작동 원리
EC2 조인 방법은 EC2 인스턴스에서 실행 중인 모든 Teleport 프로세스에서 사용할 수 있습니다. EC2 인스턴스당 하나의 Teleport 프로세스만 EC2 조인 방법을 사용할 수 있습니다. 프로세스는 Teleport Auth Service에 EC2 인스턴스 신원 문서를 제시합니다.
한편, Teleport Auth Service는 신원 문서가 정당한 EC2 인스턴스에 속하는지 확인하기 위해 ec2:DescribeInstances
권한을 가진 AWS IAM 자격 증명을 가지고 있습니다. 클러스터에 조인하는 Teleport 프로세스에서는 IAM 자격 증명이 필요하지 않습니다.
필수 조건
-
실행 중인 자체 호스팅 Teleport 클러스터. 자체 호스팅 Teleport Enterprise를 시작하려면 영업팀에 문의하십시오. 또한 Teleport Community Edition으로 데모 환경을 설정할 수 있습니다.
-
tctl
관리 도구와tsh
클라이언트 도구 버전 >= 17.0.0-dev.tctl
및tsh
다운로드에 대한 지침은 설치 를 방문하십시오.
- 연결이 가능한지 확인하기 위해
tsh login
으로 로그인한 다음, 현재 자격 증명을 사용하여tctl
명령어를 실행할 수 있는지 확인하십시오. 예를 들어:클러스터에 연결할 수 있고tsh login --proxy=teleport.example.com --user=email@example.comtctl status클러스터 teleport.example.com
버전 17.0.0-dev
CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678
tctl status
명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 워크스테이션에서 후속tctl
명령어를 실행할 수 있습니다.
자신의 Teleport 클러스터를 호스팅하는 경우, Teleport Auth Service를 호스팅하는 컴퓨터에서 전체 권한으로tctl
명령어를 실행할 수도 있습니다. - Teleport 프로세스를 호스팅할 AWS EC2 인스턴스, Teleport 바이너리가 설치되어 있어야 합니다. 호스트에는 기존 데이터 디렉터리(
/var/lib/teleport
기본값)가 없어야 합니다. 이 인스턴스가 이전에 Teleport 클러스터에 조인한 적이 있다면 데이터 디렉터리를 제거하십시오.
1/4단계. AWS IAM 자격 증명 설정
Teleport Auth Service는 ec2:DescribeInstances
를 호출할 수 있는 권한이 필요하여 클러스터에 조인하려는 EC2 인스턴스가 정당하고 현재 실행 중인지 확인합니다.
IAM 정책 생성
다음 AWS IAM 정책을 teleport-DescribeInstances-policy
라는 이름으로 귀하의 계정에 생성하십시오:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:DescribeInstances",
"Resource": "*"
}
]
}
IAM 정책 연결
귀하의 Teleport Auth Service가 EC2 인스턴스에서 실행 중이고 이미 "Amazon EC2용 IAM 역할"이 부착되어 있으면, 위의 teleport-DescribeInstances-policy
를 기존 역할에 추가하십시오. 인스턴스에 아직 부착된 역할이 없다면, 위 정책이 포함된 IAM 역할을 생성하고 Teleport Auth Service가 실행 중인 EC2 인스턴스에 부착하십시오.
AWS 외부에서 Teleport Auth Service를 실행하는 경우, IAM 자격 증명을 Teleport가 인증에 사용할 IAM 사용자에 직접 부착할 수 있습니다.
공유 구성 파일이나 환경 변수를 통해 Teleport에 IAM 자격 증명을 제공할 수 있습니다. 자세한 내용은 자격 증명 지정을 참조하십시오.
2/4단계. AWS 조인 토큰 생성
특별한 동적 토큰으로 Teleport Auth Service를 구성하여 AWS 계정의 서비스가 Teleport 클러스터에 조인할 수 있도록 합니다.
서비스는 AWS 계정에서 실행 중임을 증명하기 위해, AWS 조인 토큰에 구성된 허용 규칙과 일치하는 서명된 EC2 인스턴스 아이덴티티 문서를 전송합니다.
AWS 계정과 EC2 인스턴스가 실행될 AWS 리전을 지정하는 allow
규칙이 포함된 token.yaml
파일을 생성하세요.
# token.yaml
kind: token
version: v2
metadata:
# 토큰 이름은 비밀이 아니며, 인스턴스는 이 토큰을 사용하기 위해
# 귀하의 AWS 계정에서 실행 중임을 증명해야 합니다.
name: ec2-token
spec:
# 필요한 최소 역할 집합을 사용하십시오 (예: Node, App, Kube, DB, WindowsDesktop)
roles: [Node]
# 이 토큰에 허용되는 조인 방법을 설정하십시오.
join_method: ec2
# aws_iid_ttl은 EC2 인스턴스가 시작된 후 클러스터에 조인할 수 있는
# 시간의 양입니다. 도난된 EC2 인스턴스 ID 문서가 클러스터에 조인되는
# 위험을 줄이기 위해 짧은 TTL을 사용하십시오.
#
# EC2 조인 방법을 사용하여 첫 번째 Teleport 프로세스를 시작할 때,
# Teleport를 설정하고 구성할 수 있는 시간을 확보하기 위해
# 일시적으로 더 높은 `aws_iid_ttl` 값을 구성해야 할 수 있습니다.
# 이 기능은 Teleport가 EC2 AMI에 자동으로 시작되도록 구성된 경우에
# 가장 잘 작동합니다.
aws_iid_ttl: 5m
allow:
- aws_account: "111111111111" # 귀하의 AWS 계정 ID
aws_regions: # 필요한 최소 AWS 리전 집합을 사용하십시오.
- us-west-1
- us-west-2
tctl create token.yaml
을 실행하여 토큰을 생성합니다.
3/4단계. 서비스 구성
EC2 조인 방법은 SSH, 프록시, Kubernetes, 애플리케이션, 데이터베이스, 또는 Windows 데스크탑 서비스가 실행 중인 Teleport 프로세스에 사용할 수 있습니다. Teleport 프로세스는 AWS EC2 인스턴스에서 직접 실행되어야 하며 AWS EC2 IMDSv2에 네트워크 접근이 가능해야 합니다 (대부분의 EC2 인스턴스에 대해 기본적으로 사용 가능).
커스텀 teleport.yaml
파일로 Teleport 프로세스를 구성하세요. 다음 예제 구성에서 2단계에서 생성한 토큰과 일치하는 token_name
과 method: ec2
를 사용하세요:
# /etc/teleport.yaml
version: v3
teleport:
join_params:
token_name: ec2-token
method: ec2
proxy_server: https://teleport.example.com:443
ssh_service:
enabled: yes
auth_service:
enabled: no
proxy_service:
enabled: no
4/4단계. Teleport 프로세스 시작
중요
Teleport 프로세스를 시작하기 전에 데이터 디렉토리(/var/lib/teleport
, 기본값)는 비어 있어야 합니다. 이 Teleport 프로세스가 이전에 다른 방법(예: 토큰 또는 IAM)으로 조인한 적이 있는 경우, 호스트 UUID가 예상 이름(<AWS Account number>-<instance id>
)과 일치하지 않으며 조인할 수 없습니다.
호스트에서 Teleport를 시작하고 클러스터에 연결하고 조인할 수 있는지 확인하십시오. 모두 설정되었습니다!
여러 AWS 계정에 대한 EC2 조인 방법 구성
Teleport 프로세스가 Teleport Auth Service가 실행되는 계정을 제외한 AWS 계정의 EC2 인스턴스에서 조인하려면, Teleport는 각 계정에서 IAM 역할을 가정하고 외부 계정에서 ec2:DescribeInstances
를 호출할 수 있는 권한을 가져야 합니다.
EC2 인스턴스가 실행될 각 AWS 계정에서:
-
1단계.1에서
teleport-DescribeInstances-policy
를 생성합니다. -
Teleport Auth Service가 실행되는 계정에서 가정할 수 있는 IAM 역할
teleport-DescribeInstances-role
을 생성합니다.AWS IAM 콘솔로 이동하여 역할 생성(Create Role)을 선택하고 "신뢰할 수 있는 엔티티 유형 선택"에서 "다른 AWS 계정"을 선택한 다음 Teleport Auth Service가 실행되는 계정의 AWS Account ID를 입력합니다.
-
역할에
teleport-DescribeInstances-policy
를 연결합니다.
Teleport Auth Service가 실행되는 AWS 계정에서:
- 각 외부 계정에 대한
AssumeRole
문이 포함된teleport-AssumeRole-policy
라는 이름의 IAM 정책을 생성합니다:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::222222222222:role/teleport-DescribeInstances-role"
},
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::333333333333:role/teleport-DescribeInstances-role"
}
]
}
- Teleport Auth Service가 자격 증명을 가진 IAM 역할에 이
teleport-AssumeRole-policy
를 연결합니다. 1단계.2를 참조하세요.
AWS 조인 토큰을 생성할 때 각 외부 계정에 대한 허용 규칙을 포함하고 외부 teleport-DescribeInstances-role
에 대한 AWS ARN을 지정합니다.
# token.yaml
kind: token
version: v2
metadata:
name: ec2-multiaccount-token
spec:
roles: [Node]
aws_iid_ttl: 5m
allow:
- aws_account: "222222222222"
aws_regions:
- us-west-1
- us-west-2
aws_role: "arn:aws:iam::222222222222:role/teleport-DescribeInstances-role"
- aws_account: "333333333333"
aws_regions:
- us-west-1
- us-west-2
aws_role: "arn:aws:iam::333333333333:role/teleport-DescribeInstances-role"