AWS 크로스 계정 데이터베이스 접근
하나의 AWS 계정에서 AWS IAM 자격 증명을 사용하여 Teleport 데이터베이스 서비스를 배포하고, AWS IAM 역할을 사용하여 Teleport가 다른 AWS 계정의 데이터베이스에 접근하도록 허용할 수 있습니다.
하나의 AWS 계정에서 AWS IAM 자격 증명을 사용하여 Teleport 데이터베이스 서비스를 배포하고, AWS IAM 역할을 사용하여 Teleport가 다른 AWS 계정의 데이터베이스에 접근하도록 허용할 수 있습니다.
Teleport 데이터베이스 서비스가 AWS 데이터베이스에 대한 단기 인증 토큰을 검색, 구성 또는 검색해야 할 때, AWS IAM ID의 자격 증명을 사용하여 AWS API에 요청합니다. AWS 계정 간에 리소스에 접근하려면, Teleport 데이터베이스 서비스가 추가 AWS API 작업을 수행하기 전에 다른 계정의 AWS 역할을 수임하도록 구성할 수 있습니다.
이는 단일 AWS 역할로 제한되지 않습니다: Teleport 데이터베이스 서비스는 자체 AWS 계정과 여러 외부 AWS 계정의 데이터베이스에 동시에 연결하도록 구성할 수 있습니다.
Teleport 데이터베이스 서비스가 AWS IAM 역할을 수임하도록 구성하고, sts:AssumeRole 호출을 허용하도록 AWS IAM 권한이 구성되어 있는지 확인해야 합니다.
AWS의 네트워크 구성이 Teleport 데이터베이스 서비스가 데이터베이스에 연결할 수 있도록 허용하는지도 확인해야 합니다.
이 가이드는 AWS 네트워크 구성을 다루지 않습니다. 이는 특정 AWS 네트워크 설정과 Teleport에 연결하려는 AWS 데이터베이스 종류에 따라 다르기 때문입니다. 자세한 내용은 데이터베이스 연결 방법을 참조하세요.
Teleport 구성#
Teleport 데이터베이스 서비스는 외부 AWS IAM 역할을 수임하도록 구성되어야 하며, 선택적으로 해당 역할을 수임할 때 외부 ID를 전달해야 합니다.
구성된 AWS IAM 역할은 Teleport 데이터베이스 서비스가 AWS 데이터베이스를 검색, 구성 또는 단기 인증 토큰을 검색하기 위해 AWS API를 사용하기 전에 AWS STS AssumeRole 호출을 통해 수임됩니다.
"외부 ID"는 AWS가 혼동된 대리인 문제라고 부르는 것을 해결하는 데 사용됩니다.
Teleport 데이터베이스 서비스를 외부 ID를 사용하도록 구성하면, AWS STS AssumeRole을 호출할 때 해당 외부 ID를 포함합니다.
외부 AWS IAM 역할의 신뢰 정책은 AssumeRole 호출에 올바른 외부 ID가 제공되었는지 확인하는 데 사용됩니다.
외부 ID를 사용해야 하는 경우에 대한 자세한 내용은 다음을 참조하세요:
AWS 외부 ID의 목적.
AWS 데이터베이스 검색 구성, 정적 데이터베이스 구성, 동적 데이터베이스 구성 모두 assume_role_arn 및 external_id 설정을 지원합니다.
외부 AWS IAM 역할을 수임하면서 AWS 데이터베이스를 검색하도록 Teleport 데이터베이스 서비스 구성 파일을 수정합니다.
# 이 예제 구성은 "example-role" 외부 AWS IAM 역할을 수임하여
# AWS 계정 `222222222222` 내 us-west-1의 Amazon RDS 데이터베이스를 검색합니다.
db_service:
enabled: true
aws:
- types: ["rds"]
regions: ["us-west-1"]
assume_role_arn: "arn:aws:iam::222222222222:role/example-role"
external_id: "example-external-id"
구성 파일 변경 사항을 적용하려면 Teleport 데이터베이스 서비스를 재시작합니다.
데이터베이스를 검색하는 데 사용된 AWS IAM 역할은 Teleport 데이터베이스 서비스가 해당 데이터베이스에 대한 액세스를 제공하는 데도 사용됩니다.
외부 계정의 AWS 데이터베이스를 정적으로 등록하고 연결을 프록시하도록 Teleport 데이터베이스 서비스 구성 파일을 수정합니다.
# 이 예제 구성은 외부 AWS IAM 역할 "example-role"을 수임하여
# AWS 계정 `222222222222` 내 us-west-1의 RDS PostgreSQL 인스턴스를 정적으로 등록합니다.
db_service:
enabled: true
databases:
- name: "rds-postgres"
protocol: "postgres"
uri: "rds-postgres.abcdef012345.us-west-1.rds.amazonaws.com:5432"
aws:
assume_role_arn: "arn:aws:iam::222222222222:role/example-role"
external_id: "example-external-id"
구성 파일 변경 사항을 적용하려면 Teleport 데이터베이스 서비스를 재시작합니다.
동적 데이터베이스 리소스를 생성하여 외부 계정의 AWS 데이터베이스를 동적으로 등록하고 연결을 프록시합니다.
# 이 예제 구성은 AWS 계정 `222222222222` 내 us-west-1의 RDS PostgreSQL 인스턴스를 동적으로 등록합니다.
# 레이블이 리소스 선택기와 일치하는 Teleport 데이터베이스 서비스 에이전트가
# 구성된 외부 AWS IAM 역할을 수임하여 데이터베이스를 프록시합니다.
kind: db
version: v3
metadata:
name: "rds-postgres"
description: "동적 데이터베이스 리소스 예제"
labels:
env: "dev"
spec:
protocol: "postgres"
uri: "rds-postgres.abcdef012345.us-west-1.rds.amazonaws.com:5432"
aws:
# account_id는 `assume_role_arn`의 AWS 계정 ID와 일치해야 합니다.
# 동적 데이터베이스 리소스는 (정적 구성과 달리)
# `assume_role_arn`에서 `account_id`를 자동으로 파생하지 않습니다.
account_id: "222222222222"
assume_role_arn: "arn:aws:iam::222222222222:role/example-role"
external_id: "example-external-id"
database.yaml과 같은 파일에 구성을 저장하고 tctl로 생성합니다:
$ tctl create database.yaml
동적 데이터베이스 리소스를 사용한 데이터베이스 등록에 대한 자세한 내용은 동적 등록을 참조하세요.
Teleport AWS IAM ID#
AWS IAM 역할을 수임하려면 Teleport 데이터베이스 서비스에 자체 AWS IAM ID의 자격 증명이 필요합니다.
Grant the Database Service access to credentials that it can use to authenticate to AWS.
- If you are running the Database Service on an EC2 instance, you may use the EC2 Instance Metadata Service method
- If you are running the Database Service in Kubernetes, you can use IAM Roles for Service Accounts (IRSA)
- Otherwise, you must use environment variables
Have multiple sources of AWS credentials?
Teleport's AWS client loads credentials from different sources in the following order:
- Environment Variables
- Shared credentials file
- Shared configuration file (Teleport always enables shared configuration)
- EC2 Instance Metadata (credentials only)
While you can provide AWS credentials via a shared credentials file or shared
configuration file, you will need to run the Database Service with the AWS_PROFILE
environment variable assigned to the name of your profile of choice.
If you have a specific use case that the instructions above do not account for, consult the documentation for the AWS SDK for Go for a detailed description of credential loading behavior.
AWS IAM 권한#
AWS IAM 정책은 Teleport 데이터베이스 서비스의 AWS IAM ID와 외부 AWS IAM 역할 모두에 대해 구성되어야 합니다:
- Teleport 데이터베이스 서비스의 AWS IAM ID는 외부 역할을 수임할 권한이 있어야 합니다.
- 외부 AWS IAM 역할의 신뢰 정책은 Teleport 데이터베이스 서비스의 AWS IAM ID를 신뢰해야 합니다.
왜 둘 다 필요한가요?
같은 AWS 계정 내에서 역할을 수임하는 것과 달리, AWS IAM 역할이 수임하려는 IAM ID와 다른 AWS 계정에 있는 경우, 역할의 신뢰 정책만으로는 역할 수임을 허용하기에 충분하지 않습니다.자세한 내용은 다음을 참조하세요: AWS 크로스 계정 정책 평가.
데이터베이스 서비스 IAM 정책#
Teleport 데이터베이스 서비스의 AWS IAM ID에 다음 권한 정책을 연결합니다:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::222222222222:role/example-role"
}
]
}
외부 AWS IAM 권한 정책#
액세스에 사용될 데이터베이스 유형에 따라 외부 AWS IAM 역할에 대한 권한을 구성해야 합니다.
외부 AWS IAM 신뢰 정책#
외부 AWS IAM 역할의 신뢰 정책을 수정하여 Teleport 데이터베이스 서비스의 AWS IAM ID를 신뢰할 수 있는 주체로 허용합니다. 외부 ID가 필요한 경우, 올바른 외부 ID가 제공될 때만 작업을 허용하는 조건을 명령문에 제공합니다.
예를 들어, Teleport 데이터베이스 서비스가 AWS 계정 123456789012에서 teleport-db-service 역할이 연결된 EC2 인스턴스에 배포되고, 외부 역할을 수임하기 위해 외부 ID를 요구하려는 경우, 신뢰 정책은 다음과 같을 수 있습니다:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/teleport-db-service"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "example-external-id"
}
}
}
]
}
다음 단계#
- 데이터베이스 연결로 시작하세요.
