Infograb logo
AWS 크로스 계정 데이터베이스 접근

Teleport 데이터베이스 서비스를 하나의 AWS 계정에서 AWS IAM 자격 증명으로 배포하고, 다른 AWS 계정의 데이터베이스에 대한 Teleport 접근 권한을 부여하기 위해 AWS IAM 역할을 사용할 수 있습니다.

AWS 크로스 계정 데이터베이스 접근은 Teleport 13.0 부터 가능합니다.

Teleport 데이터베이스 서비스는 AWS 데이터베이스에 대한 단기 인증 토큰을 발견, 구성 또는 검색할 필요가 있을 때 AWS API에 요청을 하기 위해 AWS IAM 아이덴티티의 자격 증명을 사용합니다.
AWS 계정 간 리소스에 접근하기 위해, Teleport 데이터베이스 서비스를 구성하여 AWS API를 사용하기 전에 다른 계정의 AWS 역할을 가정하도록 설정할 수 있습니다.

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

Teleport 데이터베이스 서비스가 AWS IAM 역할을 가정하도록 구성하고 AWS IAM 권한이 sts:AssumeRole 호출을 허용하도록 설정해야 합니다.

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 계정 `222222222222` 내의 us-west-1에서 AWS RDS 데이터베이스를 발견하기 위해
# 외부 AWS IAM 역할 "example-role"을 가정합니다.
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 계정 `222222222222` 내의 us-west-1에서 RDS PostgreSQL 인스턴스를 정적으로 등록하기 위해
# 외부 AWS IAM 역할 "example-role"을 가정합니다.
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 인스턴스 메타데이터 서비스 방법을 사용할 수 있습니다.
  • the Database Service 를 Kubernetes에서 실행 중인 경우, IAM Roles for Service Accounts (IRSA)를 사용할 수 있습니다.
  • 그렇지 않은 경우, 환경 변수를 사용해야 합니다.

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

EC2 인스턴스는 EC2 인스턴스 프로필을 사용하도록 구성되어야 합니다. 자세한 내용은 인스턴스 프로필 사용을 참조하십시오.

AWS의 IAM Roles for Service Accounts (IRSA)를 참조하여 AWS에서 OIDC 공급자를 설정하고 포드의 서비스 계정이 해당 역할을 맡을 수 있도록 하는 AWS IAM 역할을 구성하십시오.

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 크로스 계정 정책 평가.

데이터베이스 서비스 IAM 정책

다음 권한 정책을 Teleport 데이터베이스 서비스의 AWS IAM 아이덴티티에 연결하십시오:

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

외부 AWS IAM 권한 정책

외부 AWS IAM 역할에 대해서도, 접근할 데이터베이스 유형에 특정한 권한을 구성해야 합니다.

데이터베이스 유형

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DocumentDBConnectAsIAMRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::aws-account-id:role/DatabaseUserRole"
            ]
        },
        {
            "Sid": "DocumentDBCheckDomainURL",
            "Effect": "Allow",
            "Action": "rds:DescribeDBClusters",
            "Resource": "*"
        }
    ]
}
StatementPurpose
DocumentDBConnectAsIAMRoleIAM 인증으로 DocumentDB 클러스터에 연결하기 위해 IAM 역할을 가져옵니다.
DocumentDBCheckDomainURLDiscovery Service에 의해 자동 검색된 경우 도메인의 URL을 검증합니다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DynamoDBConnectAsIAMRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::aws-account-id\:role/DatabaseUserRole"
            ]
        },
        {
            "Sid": "DynamoDBSessionTagging",
            "Effect": "Allow",
            "Action": "sts:TagSession",
            "Resource": [
                "*"
            ]
        }
    ]
}
StatementPurpose
DynamoDBConnectAsIAMRoleDynamoDB에 요청을 전달하기 위해 IAM 역할을 가정합니다.
DynamoDBSessionTaggingTeleport 데이터베이스 구성의 aws.session_tags 아래에 태그가 지정된 경우 가정된 역할 세션에 태그를 추가합니다.

세션 태깅 권한은 Teleport 데이터베이스 구성의 aws.session_tags 섹션에서 태그를 구성한 경우에만 필요합니다.

{/* this comment is here to make the include below it render */}

(!docs/pages/includes/database-access/reference/aws-iam/redis/access-policy.mdx dbType="ElastiCache" permissionType="elasticache"!)

다음 링크를 참조하십시오.  
[ElastiCache에 대한 IAM 인증](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/auth-iam.html)  
자세한 내용은 여기를 클릭하십시오.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "KeyspacesConnectAsIAMRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::aws-account-id:role/DatabaseUserRole"
            ]
        }
    ]
}
StatementPurpose
KeyspacesConnectAsIAMRoleIAM 역할을 가정하여 Keyspaces로 요청을 전달합니다.

MemoryDB는 Redis 엔진 버전 7.0 이상에서 IAM 인증을 지원합니다. 이는 MemoryDB에 대한 Teleport 액세스를 구성하는 권장 방법입니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "MemoryDBDescribeUsers",
            "Effect": "Allow",
            "Action": "memorydb:DescribeUsers",
            "Resource": "*"
        },
        {
            "Sid": "MemoryDBConnect",
            "Effect": "Allow",
            "Action": "memorydb:Connect",
            "Resource": [
                "arn:aws:memorydb:us-east-2:aws-account-id:replicationgroup:replication-group",
                "arn:aws:memorydb:us-east-2:aws-account-id:user:*"
            ]
        }
    ]
}
StatementPurpose
MemoryDBDescribeUsers사용자가 IAM 인증과 호환되는지 확인합니다.
MemoryDBConnectIAM 인증을 사용하여 연결합니다.

자세한 내용은
MemoryDB에 대한 IAM 인증 를 참조하십시오.

{
    "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"
            ]
        }
    ]
}
StatementPurpose
OpenSearchCheckDomainURL발견 서비스에 의해 자동 발견된 도메인의 URL을 검증합니다.
OpenSearchConnectAsIAMRoleOpenSearch로 요청을 전달하기 위해 IAM 역할을 가정합니다.
{
    "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": "*"
        }
    ]
}
StatementPurpose
RDSAutoEnableIAMAuthRDS 인스턴스와 Aurora 클러스터에서 IAM 인증을 자동으로 활성화합니다.
RDSConnect데이터베이스에 연결하기 위한 IAM 인증 토큰을 생성합니다.
RDSFetchMetadataAWS 태그를 데이터베이스 레이블로 자동으로 가져오거나 데이터베이스의 AWS 리전과 같은 누락된 정보를 찾습니다.

Teleport 데이터베이스 서비스는 rds:ModifyDBInstancerds:ModifyDBCluster 를 사용하여 RDS 인스턴스와 Aurora 클러스터에서 각각 IAM 인증을 자동으로 활성화합니다. 데이터베이스에서 IAM 인증이 이미 활성화된 경우 RDSAutoEnableIAMAuth 권한을 생략할 수 있습니다.

rds-db:connect 권한은 데이터베이스에 연결하는 데 필요합니다.
권한의 범위를 특정 데이터베이스, 리전 또는 사용자만 허용하도록 줄일 수 있습니다.
리소스 ARN은 다음 형식을 가집니다:

arn:aws:rds-db:{Region}:{AccountID}:dbuser:{ResourceID}/{UserName}

rds-db:connect 권한 부여 구문에 대한 자세한 내용은
IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용 을 참조하십시오.

텔레포트 검색 서비스에 의해 발견된 데이터베이스는 완전한 메타데이터로 등록해야 하므로, 모든 AWS 데이터베이스가 자동 검색되는 경우 RDSFetchMetadata 권한을 생략할 수도 있습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RDSProxyConnect",
            "Effect": "Allow",
            "Action": "rds-db:connect",
            "Resource": "*"
        },
        {
            "Sid": "RDSProxyFetchMetadata",
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBProxies",
                "rds:DescribeDBProxyEndpoints"
            ],
            "Resource": "*"
        }
    ]
}
StatementPurpose
RDSProxyConnect데이터베이스에 연결하기 위해 IAM 인증 Token을 생성합니다.
RDSProxyFetchMetadataAWS 태그를 데이터베이스 레이블로 자동으로 가져오거나 데이터베이스의 AWS 지역과 같은 누락된 정보를 찾습니다.

rds-db:connect 권한은 데이터베이스에 연결하는 데 필요합니다.
권한의 범위를 특정 데이터베이스, 리전 또는 사용자만 허용하도록 줄일 수 있습니다.
리소스 ARN은 다음 형식을 가집니다:

arn:aws:rds-db:{Region}:{AccountID}:dbuser:{ResourceID}/{UserName}

rds-db:connect 권한 부여 구문에 대한 자세한 내용은
IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용 을 참조하십시오.

텔레포트 검색 서비스에 의해 발견된 데이터베이스는 완전한 메타데이터로 등록해야 하므로, 모든 AWS 데이터베이스가 자동 검색되는 경우 RDSProxyFetchMetadata 권한을 생략할 수도 있습니다.

{
    "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기존 데이터베이스 사용자로 데이터베이스에 연결합니다.
RedshiftConnectAsIAMRoleIAM 역할을 가정하여 역할의 IAM 권한에서 1:1로 매핑된 권한으로 데이터베이스에 연결합니다.
RedshiftFetchMetadataAWS 태그를 데이터베이스 레이블로 자동으로 가져오거나 데이터베이스의 AWS 리전과 같은 누락된 정보를 찾습니다.

RedshiftConnectAsDBUser 문장의 범위를 줄이려면 특정 사용자, 데이터베이스 및 데이터베이스 그룹만 허용하도록 업데이트할 수 있습니다.
지정할 수 있는 리소스 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 문장은 사용하고자 하는 방법에 대해서만 필요합니다.
IAM 역할이 데이터베이스 서비스의 신원을 신뢰할 수 있는 주체로 지정하고, 두 신원이 동일한 AWS 계정에 있는 경우,
RedshiftConnectAsIAMRole 문장도 생략할 수 있습니다.

텔레포트 검색 서비스에 의해 발견된 데이터베이스는 완전한 메타데이터로 등록해야 하므로, 모든 AWS 데이터베이스가 자동 검색되는 경우 RedshiftFetchMetadata 권한을 생략할 수도 있습니다.

{
    "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": "*"
        }
    ]
}
StatementPurpose
RedshiftServerlessFetchMetadataAWS 태그를 데이터베이스 레이블로 자동으로 가져오거나 데이터베이스의 AWS 리전과 같은 누락된 정보를 찾습니다.
RedshiftServerlessConnectAsIAMRole데이터베이스 사용자로 연결하기 위해 IAM 역할을 가정합니다.

텔레포트 검색 서비스에 의해 발견된 데이터베이스는 완전한 메타데이터로 등록해야 하므로, 모든 AWS 데이터베이스가 자동 검색되는 경우 RedshiftServerlessFetchMetadata 권한을 생략할 수도 있습니다.

Redshift Serverless는 IAM 역할을 데이터베이스 사용자에 매핑합니다. Teleport 데이터베이스 서비스는 IAM 인증 토큰을 생성하기 위해 이러한 "액세스" IAM 역할을 가정할 수 있어야 합니다.

외부 AWS IAM 신뢰 정책

외부 AWS IAM 역할의 신뢰 정책을 수정하여 Teleport 데이터베이스 서비스의 AWS IAM 아이덴티티를 신뢰할 수 있는 주체로 허용합니다. 외부 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"
        }
      }
    }
  ]
}

다음 단계

  • 데이터베이스를 연결하여 시작하십시오.
Teleport 원문 보기