AWS 크로스 계정 데이터베이스 접근
Teleport v18.9하나의 AWS 계정에서 AWS IAM 자격 증명을 사용하여 Teleport 데이터베이스 서비스를 배포하고, AWS IAM 역할을 사용하여 Teleport가 다른 AWS 계정의 데이터베이스에 접근하도록 허용할 수 있습니다.
하나의 AWS 계정에서 AWS IAM 자격 증명을 사용하여 Teleport 데이터베이스 서비스를 배포하고, AWS IAM 역할을 사용하여 Teleport가 다른 AWS 계정의 데이터베이스에 접근하도록 허용할 수 있습니다.
이 페이지에서는 AWS 계정 간에 데이터베이스를 보호하도록 Teleport를 구성하기 위한 요구 사항을 설명합니다.
작동 방식#
Teleport 데이터베이스 서비스가 AWS 데이터베이스에 대한 단기 인증 토큰을 검색, 구성 또는 조회해야 할 때, AWS IAM 아이덴티티의 자격 증명을 사용하여 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 API를 사용하여 AWS 데이터베이스에 대한 단기 인증 토큰을 검색, 구성 또는 조회하기 전에 AWS STS AssumeRole 호출을 통해 수임됩니다.
"외부 ID"는 AWS에서 혼동된 대리인 문제(confused deputy problem)라고 부르는 문제를 해결하는 데 사용됩니다.
Teleport 데이터베이스 서비스가 외부 ID를 사용하도록 구성하면, AWS STS AssumeRole을 호출할 때 해당 외부 ID를 포함합니다.
외부 AWS IAM 역할의 신뢰 정책은 AssumeRole 호출에서 올바른 외부 ID가 제공되었는지 확인하는 데 사용됩니다.
외부 ID를 사용해야 하는 시점에 대한 자세한 내용은 AWS 외부 ID의 목적을 참조하세요.
AWS 데이터베이스 검색 구성, 정적 데이터베이스 구성, 동적 데이터베이스 구성 모두 assume_role_arn 및 external_id 설정을 지원합니다.
AWS 데이터베이스를 검색할 때 외부 AWS IAM 역할을 수임하도록 Teleport 데이터베이스 서비스 구성 파일을 수정하세요.
# This example configuration will discover Amazon RDS databases in us-west-1
# within AWS account `222222222222` by assuming the external AWS IAM role
# "example-role".
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 데이터베이스 서비스 구성 파일을 수정하세요.
# This example configuration will statically register an RDS PostgreSQL instance
# in us-west-1 within AWS account `222222222222` by assuming an external AWS
# IAM role "example-role".
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 데이터베이스를 동적으로 등록하고 그 연결을 프록시하려면 동적 데이터베이스 리소스를 생성하세요.
# This example configuration will dynamically register an RDS PostgreSQL instance
# in us-west-1 within AWS account `222222222222`.
# Teleport Database Service agents that match its labels with resource selectors
# will proxy the database by assuming the configured external AWS IAM role.
kind: db
version: v3
metadata:
name: "rds-postgres"
description: "Example dynamic database resource"
labels:
env: "dev"
spec:
protocol: "postgres"
uri: "rds-postgres.abcdef012345.us-west-1.rds.amazonaws.com:5432"
aws:
# Note that account_id must match the AWS account ID in `assume_role_arn`.
# Dynamic database resources do not derive `account_id` from
# `assume_role_arn` automatically (unlike static configuration).
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 아이덴티티#
AWS IAM 역할을 수임하려면, Teleport 데이터베이스 서비스에 자체 AWS IAM 아이덴티티에 대한 자격 증명이 필요합니다.
the Database Service이(가) AWS에 인증하는 데 사용할 수 있는 자격 증명에 대한 접근 권한을 부여합니다.
- the Database Service을(를) EC2 인스턴스에서 실행하는 경우 EC2 Instance Metadata Service 방식을 사용할 수 있습니다
- the Database Service을(를) Kubernetes에서 실행하는 경우 IAM Roles for Service Accounts (IRSA)를 사용할 수 있습니다
- 그 외의 경우에는 환경 변수를 사용해야 합니다
Instance Metadata Service
Teleport는 EC2 인스턴스에서 실행 중일 때를 감지하고 Instance Metadata Service를 사용하여 자격 증명을 가져옵니다.
EC2 인스턴스는 EC2 인스턴스 프로파일을 사용하도록 구성되어야 합니다. 자세한 내용은 Using Instance Profiles를 참고하세요.
Kubernetes IRSA
AWS에서 OIDC provider를 설정하고 pod의 서비스 계정이 role을 assume할 수 있도록 허용하는 AWS IAM role을 구성하려면 IAM Roles for Service Accounts (IRSA)를 참고하세요.
Environment Variables
Teleport의 내장 AWS 클라이언트는 다음 환경 변수에서 자격 증명을 읽습니다:
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_DEFAULT_REGION
the Database Service을(를) 시작하면 서비스는 /etc/default/teleport 경로의
파일에서 환경 변수를 읽습니다. 이러한 자격 증명은 조직에서 얻으세요. 각
변수의 값을 교체하여 /etc/default/teleport가 다음 내용을 담도록 하세요:
AWS_ACCESS_KEY_ID=00000000000000000000
AWS_SECRET_ACCESS_KEY=0000000000000000000000000000000000000000
AWS_DEFAULT_REGION=
Keyspaces
aws-account-id를 AWS 계정 ID로 지정합니다:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "KeyspacesConnectAsIAMRole",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::aws-account-id:role/DatabaseUserRole"
]
}
]
}
Statement
목적
KeyspacesConnectAsIAMRole
Keyspaces로 요청을 전달하기 위해 IAM 역할을 assume합니다.
MemoryDB
MemoryDB는 Redis 엔진 버전 7.0 이상에 대해 IAM 인증을 지원합니다.
이것이 MemoryDB에 대한 Teleport 접근을 구성하는 권장 방법입니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "MemoryDBFetchMetadata",
"Effect": "Allow",
"Action": "memorydb:DescribeClusters",
"Resource": "*"
},
{
"Sid": "MemoryDBDescribeUsers",
"Effect": "Allow",
"Action": "memorydb:DescribeUsers",
"Resource": "*"
},
{
"Sid": "MemoryDBConnect",
"Effect": "Allow",
"Action": "memorydb:Connect",
"Resource": "*"
}
]
}
Statement
Purpose
MemoryDBFetchMetadata
AWS 태그를 데이터베이스 레이블로 자동으로 가져오거나 데이터베이스의 AWS 리전과 같은 누락된 정보를 찾습니다.
MemoryDBDescribeUsers
사용자가 IAM 인증과 호환되는지 확인합니다.
MemoryDBConnect
IAM 인증을 사용하여 연결합니다.
MemoryDBConnect 문의 범위를 특정 MemoryDB 클러스터와 IAM 사용자만 허용하도록 업데이트하여 줄일 수 있습니다. 지정할 수 있는 리소스 ARN은 다음과 같은 형식을 가집니다.
arn:aws:memorydb:{Region}:{AccountID}:cluster:{ClusterName}
arn:aws:memorydb:{Region}:{AccountID}:user:{UserName}
자세한 내용은
Authenticating with IAM for
MemoryDB를
참고하십시오.
Opensearch
aws-account-id에 사용자의 AWS 계정 ID를 할당하십시오:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "OpenSearchCheckDomainURL",
"Effect": "Allow",
"Action": "es:DescribeDomains",
"Resource": [
"*"
]
},
{
"Sid": "OpenSearchConnectAsIAMRole",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::aws-account-id:role/DatabaseUserRole"
]
}
]
}
Statement
용도
OpenSearchCheckDomainURL
Discovery Service에 의해 자동 디스커버리된 경우 도메인의 URL을 검증합니다.
OpenSearchConnectAsIAMRole
OpenSearch로 요청을 전달하기 위해 IAM 역할을 assume합니다.
RDS
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RDSAutoEnableIAMAuth",
"Effect": "Allow",
"Action": [
"rds:ModifyDBCluster",
"rds:ModifyDBInstance"
],
"Resource": "*"
},
{
"Sid": "RDSConnect",
"Effect": "Allow",
"Action": "rds-db:connect",
"Resource": "*"
},
{
"Sid": "RDSFetchMetadata",
"Effect": "Allow",
"Action": [
"rds:DescribeDBClusters",
"rds:DescribeDBInstances"
],
"Resource": "*"
}
]
}
Statement
Purpose
RDSAutoEnableIAMAuth
RDS 인스턴스와 Aurora 클러스터에서 IAM 인증을 자동으로 활성화합니다.
RDSConnect
데이터베이스에 연결하기 위한 IAM 인증 토큰을 생성합니다.
RDSFetchMetadata
AWS 태그를 데이터베이스 레이블로 자동으로 가져오거나 데이터베이스의 AWS 리전과 같은 누락된 정보를 찾습니다.
Teleport Database Service는 rds:ModifyDBInstance와
rds:ModifyDBCluster를 사용하여 각각 RDS 인스턴스와 Aurora 클러스터에서
IAM 인증을
자동으로 활성화합니다.
데이터베이스에서 IAM 인증이 이미 활성화되어 있다면 RDSAutoEnableIAMAuth 권한을
생략할 수 있습니다.
데이터베이스에 연결하려면 rds-db:connect 권한이 필요합니다.
특정 데이터베이스, 리전 또는 사용자만 허용하도록 권한의 범위를
좁힐 수 있습니다.
리소스 ARN은 다음과 같은 형식을 가집니다:
arn:aws:rds-db:{Region}:{AccountID}:dbuser:{ResourceID}/{UserName}
rds-db:connect 권한 부여 구문에 대한 자세한 내용은
Creating and using an IAM policy for IAM database access
를 참조하십시오.
Teleport Discovery Service에 의해 검색된 데이터베이스는 완전한 메타데이터와 함께
등록되어야 하므로, 모든 AWS 데이터베이스가 자동 검색되고 있다면 RDSFetchMetadata
권한을 생략할 수도 있습니다.
RDS Proxy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RDSProxyConnect",
"Effect": "Allow",
"Action": "rds-db:connect",
"Resource": "*"
},
{
"Sid": "RDSProxyFetchMetadata",
"Effect": "Allow",
"Action": [
"rds:DescribeDBProxies",
"rds:DescribeDBProxyEndpoints"
],
"Resource": "*"
}
]
}
Statement
목적
RDSProxyConnect
데이터베이스에 연결하기 위한 IAM 인증 토큰을 생성합니다.
RDSProxyFetchMetadata
AWS 태그를 데이터베이스 레이블로 자동으로 가져오거나 데이터베이스의 AWS 리전과 같은 누락된 정보를 찾습니다.
데이터베이스에 연결하려면 rds-db:connect 권한이 필요합니다.
특정 데이터베이스, 리전 또는 사용자만 허용하도록 권한의 범위를
좁힐 수 있습니다.
리소스 ARN은 다음과 같은 형식을 가집니다:
arn:aws:rds-db:{Region}:{AccountID}:dbuser:{ResourceID}/{UserName}
rds-db:connect 권한 부여 구문에 대한 자세한 내용은
Creating and using an IAM policy for IAM database access
를 참조하십시오.
Teleport Discovery Service에 의해 검색된 데이터베이스는 완전한 메타데이터와 함께
등록되어야 하므로, 모든 AWS 데이터베이스가 자동 검색되고 있다면 RDSProxyFetchMetadata
권한을 생략할 수도 있습니다.
Redshift
aws-account-id에 AWS 계정 ID를 할당합니다:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RedshiftConnectAsDBUser",
"Effect": "Allow",
"Action": "redshift:GetClusterCredentials",
"Resource": "*"
},
{
"Sid": "RedshiftConnectAsIAMRole",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::aws-account-id:role/DatabaseUserRole"
]
},
{
"Sid": "RedshiftFetchMetadata",
"Effect": "Allow",
"Action": "redshift:DescribeClusters",
"Resource": "*"
}
]
}
Statement
용도
RedshiftConnectAsDBUser
기존 데이터베이스 사용자로 데이터베이스에 연결합니다.
RedshiftConnectAsIAMRole
IAM 역할을 가장하여 해당 역할의 IAM 권한을 데이터베이스에 1:1로 매핑한 권한으로 데이터베이스에 연결합니다.
RedshiftFetchMetadata
AWS 태그를 데이터베이스 레이블로 자동 가져오거나 데이터베이스의 AWS 리전과 같은 누락된 정보를 찾습니다.
RedshiftConnectAsDBUser statement를 특정 사용자, 데이터베이스, 데이터베이스
그룹만 허용하도록 업데이트하여 그 범위를 줄일 수 있습니다.
지정할 수 있는 리소스 ARN은 다음 형식을 가집니다:
arn:aws:redshift:{Region}:{AccountID}:dbuser:{ClusterName}/{UserName}
arn:aws:redshift:{Region}:{AccountID}:dbname:{ClusterName}/{DatabaseName}
arn:aws:redshift:{Region}:{AccountID}:dbgroup:{ClusterName}/{DatabaseGroupName}
redshift:GetClusterCredentials 권한 부여 구문에 대한 자세한 내용은
GetClusterCredentials를 호출할 수 있는 권한을 가진 IAM 역할 또는 사용자 생성을
참조하십시오.
기존 데이터베이스 사용자로 인증하거나 데이터베이스에 자동으로 매핑되는 IAM 역할로
인증할 수 있습니다.
해당 IAM statement는 사용하려는 방식에 대해서만 필요합니다.
IAM 역할이 Database Service의 identity를 신뢰할 수 있는 principal로 지정하고 두
identity가 동일한 AWS 계정에 있다면, RedshiftConnectAsIAMRole statement도 생략할
수 있습니다.
Teleport Discovery Service에 의해 검색된 데이터베이스는 완전한 메타데이터와 함께
등록되어야 하므로, 모든 AWS 데이터베이스가 자동 검색되고 있다면 RedshiftFetchMetadata
권한을 생략할 수도 있습니다.
Redshift Serverless
aws-account-id에 여러분의 AWS 계정 ID를 지정합니다:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RedshiftServerlessConnectAsIAMRole",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::aws-account-id:role/DatabaseUserRole"
]
},
{
"Sid": "RedshiftServerlessFetchMetadata",
"Effect": "Allow",
"Action": [
"redshift-serverless:GetEndpointAccess",
"redshift-serverless:GetWorkgroup"
],
"Resource": "*"
}
]
}
Statement
목적
RedshiftServerlessFetchMetadata
AWS 태그를 데이터베이스 레이블로 자동 가져오거나 데이터베이스의 AWS 리전과 같은 누락된 정보를 찾습니다.
RedshiftServerlessConnectAsIAMRole
IAM 역할을 assume하여 데이터베이스 사용자로 연결합니다.
Teleport Discovery Service에 의해 검색된 데이터베이스는 완전한 메타데이터와 함께
등록되어야 하므로, 모든 AWS 데이터베이스가 자동 검색되고 있다면 RedshiftServerlessFetchMetadata
권한을 생략할 수도 있습니다.
Redshift Serverless는 IAM 역할을 데이터베이스 사용자에 매핑합니다. Teleport Database
Service는 IAM 인증 토큰을 생성할 수 있는 IAM 권한이 부여된 이러한 "access" IAM 역할을
assume할 수 있어야 합니다.
외부 AWS IAM 신뢰 정책#
Teleport 데이터베이스 서비스의 AWS IAM 아이덴티티를 신뢰할 수 있는 주체로 허용하도록 외부 AWS IAM 역할의 신뢰 정책을 수정하세요. 외부 ID가 필요한 경우, 올바른 외부 ID가 제공된 경우에만 해당 작업을 허용하는 조건을 정책 문(statement)에 제공하세요.
예를 들어, 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"
}
}
}
]
}
다음 단계#
- 연결 가이드를 통해 데이터베이스 설정을 시작하세요.