Infograb logo
AWS 계정 간 데이터베이스 액세스

Teleport 데이터베이스 서비스를 하나의 AWS 계정에 AWS IAM 자격 증명으로 배포하고 다른 AWS 계정의 데이터베이스에 대한 Teleport 액세스를 허용하는 AWS IAM 역할을 사용할 수 있습니다.

AWS 계정 간 데이터베이스 액세스는 Teleport 13.0부터 사용할 수 있습니다.

Teleport 데이터베이스 서비스가 AWS 데이터베이스를 탐색, 구성 또는 단기 인증 토큰을 검색해야 할 때, AWS API에 요청을 하기 위해 AWS IAM 신원에 대한 자격 증명을 사용합니다. AWS 계정 간의 리소스에 액세스하려면, Teleport 데이터베이스 서비스를 다른 계정의 AWS 역할을 가정하도록 구성한 후 AWS API를 사용하여 추가 작업을 수행할 수 있습니다.

이는 단일 AWS 역할에 국한되지 않습니다: Teleport 데이터베이스 서비스는 자신의 AWS 계정과 여러 외부 AWS 계정의 데이터베이스에 동시에 연결하도록 구성할 수 있습니다.

Teleport 데이터베이스 서비스가 AWS IAM 역할을 가정하도록 구성하고 AssumeRole 호출을 허용하도록 AWS IAM 권한이 구성되어 있는지 확인해야 합니다.

Note

AWS에서 Teleport 데이터베이스 서비스가 데이터베이스에 연결할 수 있도록 네트워크 구성이 허용되는지도 확인해야 합니다.

이 가이드는 특정 AWS 네트워크 설정과 Teleport에 연결하고자 하는 AWS 데이터베이스 유형에 따라 달라지기 때문에 AWS 네트워크 구성에 대한 내용을 다루지 않습니다. 더 자세한 정보는 데이터베이스 연결 방법을 참조하세요.

Teleport 구성

Teleport 데이터베이스 서비스는 외부 AWS IAM 역할을 가정하도록 구성해야 하며, 선택적으로 해당 역할을 가정할 때 외부 ID를 전달할 수도 있습니다. 구성된 AWS IAM 역할은 Teleport 데이터베이스 서비스가 AWS API를 사용해 AWS 데이터베이스에 대한 단기 인증 토큰을 탐색, 구성 또는 검색하기 전에 AWS STS AssumeRole 호출을 통해 가정됩니다.

"외부 ID"는 AWS가 혼란스러운 대리인 문제라고 부르는 문제를 해결하는 데 사용됩니다. Teleport 데이터베이스 서비스를 외부 ID를 사용하도록 구성하면, AWS STS AssumeRole을 호출할 때 해당 외부 ID를 포함하게 됩니다. 외부 AWS IAM 역할의 신뢰 정책은 AssumeRole 호출에서 제공된 정확한 외부 ID를 검증하는 데 사용됩니다. 외부 ID를 언제 사용해야 하는지에 대한 정보는 다음을 참조하세요: AWS 외부 ID의 목적.

AWS 데이터베이스 탐색 구성, 정적 데이터베이스 구성, 동적 데이터베이스 구성 모두 assume_role_arnexternal_id 설정을 지원합니다.

AWS 데이터베이스를 탐색할 때 외부 AWS IAM 역할을 가정하도록 Teleport 데이터베이스 서비스 구성 파일을 수정합니다.

# 이 예제 구성은 외부 AWS IAM 역할
# "example-role"을 가정하여 AWS 계정 `222222222222` 내에서
# us-west-1의 AWS RDS 데이터베이스를 탐색합니다.
db_service:
  enabled: "yes"
  aws:
    - types: ["rds"]
      regions: ["us-west-1"]
      assume_role_arn: "arn:aws:iam::222222222222:role/example-role"
      external_id: "example-external-id"

구성 파일 변경 사항이 적용되도록 Teleport 데이터베이스 서비스를 재시작해야 합니다.

Note

데이터베이스를 탐색하는 데 사용되는 AWS IAM 역할은 Teleport 데이터베이스 서비스가 해당 데이터베이스에 대한 액세스를 제공하는 데에도 사용됩니다.

외부 계정에서 AWS 데이터베이스를 정적으로 등록하고 연결을 프록시하도록 Teleport 데이터베이스 서비스 구성 파일을 수정합니다.

# 이 예제 구성은 외부 AWS IAM 역할
# "example-role"을 가정하여 AWS 계정 `222222222222` 내에서 
# us-west-1에 RDS PostgreSQL 인스턴스를 정적으로 등록합니다.
db_service:
  enabled: "yes"
  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 신원

AWS IAM 역할을 가정하려면, Teleport 데이터베이스 서비스는 자신의 AWS IAM 신원에 대한 자격 증명이 필요합니다.

the Database Service에 AWS에 인증하는 데 사용할 수 있는 자격 증명에 대한 액세스를 부여합니다.

the Database Service를 EC2 인스턴스에서 실행하는 경우 EC2 인스턴스 메타데이터 서비스 방법을 사용할 수 있습니다. 그렇지 않은 경우 환경 변수를 사용해야 합니다:

Teleport는 EC2 인스턴스에서 실행될 때 이를 감지하고 인스턴스 메타데이터 서비스를 사용하여 자격 증명을 가져옵니다.

EC2 인스턴스는 EC2 인스턴스 프로파일을 사용하도록 구성되어 있어야 합니다. 자세한 내용은 인스턴스 프로파일 사용하기를 참조하세요.

Teleport의 내장 AWS 클라이언트는 다음 환경 변수에서 자격 증명을 읽습니다:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_DEFAULT_REGION

the Database Service를 시작하면 서비스는 /etc/default/teleport 경로의 파일에서 환경 변수를 읽습니다. 이 자격 증명은 귀하의 조직에서 가져오십시오. /etc/default/teleport에 다음 내용을 포함하고 각 변수의 값을 대체해야 합니다:

AWS_ACCESS_KEY_ID=00000000000000000000
AWS_SECRET_ACCESS_KEY=0000000000000000000000000000000000000000
AWS_DEFAULT_REGION=<YOUR_REGION>

Teleport의 AWS 클라이언트는 자격 증명을 다음 순서로 다양한 출처에서 로드합니다:

  • 환경 변수
  • 공유 자격 증명 파일
  • 공유 구성 파일 (Teleport는 항상 공유 구성을 활성화합니다)
  • EC2 인스턴스 메타데이터 (자격 증명 전용)

공유 자격 증명 파일 또는 공유 구성 파일을 통해 AWS 자격 증명을 제공할 수 있지만, the Database Service를 실행할 때 AWS_PROFILE 환경 변수를 선택한 프로파일의 이름으로 지정해야 합니다.

위의 지침이 고려하지 않은 특정 사용 사례가 있는 경우, 자격 증명 로딩 동작에 대한 자세한 설명을 보려면 AWS SDK for Go의 문서를 참조하십시오.

AWS IAM 권한

AWS IAM 정책은 Teleport 데이터베이스 서비스의 AWS IAM 신원과 외부 AWS IAM 역할 모두에 대해 구성되어야 합니다:

  • Teleport 데이터베이스 서비스의 AWS IAM 신원은 외부 역할을 가정할 수 있는 권한이 있어야 합니다.
  • 외부 AWS IAM 역할의 신뢰 정책은 Teleport 데이터베이스 서비스의 AWS IAM 신원을 신뢰해야 합니다.

동일한 AWS 계정에서 역할을 가정하는 것과 달리, AWS IAM 역할이 IAM 신원과 다른 AWS 계정에 있을 경우, 역할의 신뢰 정책만으로는 역할을 가정할 수 있도록 허용할 수 없습니다.

자세한 내용은 다음을 참조하십시오: AWS 계정 간 정책 평가.

Teleport는 teleport db configure bootstrap 명령어를 사용하여 데이터베이스 서비스의 IAM 권한을 기반으로 설정을 부트스트랩할 수 있습니다. 자동 모드 또는 수동 모드에서 이 명령어를 사용할 수 있습니다:

  • 자동 모드에서는 Teleport가 적절한 IAM 정책을 생성하고 지정된 IAM 정체성 역할에 연결하려고 시도합니다. 이는 IAM 정책을 생성하고 연결할 수 있는 IAM 권한이 필요합니다.
  • 수동 모드에서는 Teleport가 필요한 IAM 정책을 출력합니다. 그런 다음 AWS 관리 콘솔을 사용하여 수동으로 생성하고 연결할 수 있습니다.

Teleport 데이터베이스 서비스가 IAM 역할로 실행될 때 권한을 자동으로 부트스트랩하기 위해 이 명령어를 사용하세요 (예: 연결된 IAM 역할이 있는 EC2 인스턴스에서).

teleport db configure bootstrap -c /etc/teleport.yaml --attach-to-role teleport-db-service

AWS 콘솔에서 생성할 수 있는 필요한 IAM 정책을 표시하기 위해 이 명령어를 사용하세요:

teleport db configure bootstrap -c /etc/teleport.yaml --manual --attach-to-role arn:aws:iam::123456789012:role/teleport-db-service

assume_role_arn이 데이터베이스 또는 AWS 매처에 대해 설정되어 있는 경우, teleport db configure bootstrap은 부트스트랩 대상 AWS IAM 정체성에 필요한 권한을 다음 로직을 사용하여 결정합니다:

  • 대상이 구성 파일의 데이터베이스 리소스 또는 AWS 매처에서 assume_role_arn과 일치하지 않을 때, 대상은 Teleport 데이터베이스 서비스의 AWS IAM 정체성으로 간주되며 모든 구성된 정적 데이터베이스 및 AWS 매처에 대한 권한이 부트스트랩됩니다.
  • --attach-to-role 대상이 구성 파일의 정적 데이터베이스 또는 AWS 매처에 대한 assume_role_arn 설정과 일치할 때, 해당 정적 데이터베이스 또는 AWS 매처에 대해서만 권한이 부트스트랩됩니다.

Teleport 데이터베이스 서비스의 IAM 정체성을 정책 첨부 대상으로 하여 부트스트랩 명령어를 한 번 실행해야 하며, assume_role_arn에 사용되는 각 AWS IAM 역할에 대해 한 번씩 실행해야 합니다.

특히, Teleport 데이터베이스 서비스의 AWS IAM 신원은 외부 AWS IAM 역할에 대한 sts:AssumeRole 권한을 부여받아야 합니다. 예를 들어:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::222222222222:role/example-role"
        }
    ]
}

또한 외부 AWS IAM 역할이 액세스할 데이터베이스 유형에 특정한 권한을 구성해야 합니다.

예를 들어 assume_role_arnarn:aws:iam::222222222222:role/example-role로 설정되어 있다고 가정하면, 다음 명령어를 실행하여 222222222222 계정의 AWS 자격 증명으로 자동으로 부여할 수 있습니다:

teleport db configure bootstrap \ -c /etc/teleport.yaml \ --attach-to-role "example-role"

AWS IAM 신뢰 정책

외부 AWS IAM 역할의 신뢰 정책을 수정하여 Teleport 데이터베이스 서비스의 AWS IAM 신원을 신뢰하는 주체로 허용합니다. 외부 ID가 필요한 경우, 해당 조건을 제공하여 정확한 외부 ID가 주어질 때만 동작을 허용합니다.

예를 들어, Teleport 데이터베이스 서비스가 AWS 계정 123456789012에 있는 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"
                }
            }
        }
    ]
}

다음 단계

Teleport 원문 보기