Amazon RDS 프라이빗 서브넷 RDS에 접속하는 3가지 방법과 IAM 인증

Amazon RDS 프라이빗 서브넷 RDS에 접속하는 3가지 방법과 IAM 인증

Amazon RDS 설명

Amazon RDS(관계형 데이터베이스 서비스)는 데이터베이스 관리를 자동화하여 쉽게 데이터베이스를 운영할 수 있는 서비스입니다. RDS 인스턴스는 기본적으로 프라이빗 IP를 할당받으며, 이를 통해 VPC 내의 다른 리소스가 RDS에 접근할 수 있습니다. 퍼블릭 접근 옵션을 설정하지 않으면 퍼블릭 IP는 할당되지 않으며, 이는 보안적으로 프로덕션 환경에서 자주 사용되는 방식입니다.

IP 주소 변경

RDS 인스턴스의 IP 주소는 여러 이유로 변경될 수 있습니다:

  • 중지 후 재시작
  • 인스턴스 교체
  • AWS에서의 점검
  • OS 패치 또는 DB 엔진 버전 업데이트

따라서 IP 주소로 직접 접근하기보다는 DNS 엔드포인트로 RDS에 접근하는 것이 권장됩니다.


RDS 접속 방법 3가지

RDS 인스턴스를 프라이빗 서브넷에 배치한 경우, 직접적으로 인터넷을 통해 접근할 수 없으므로 아래 3가지 방법으로 접근할 수 있습니다.

1. Bastion Host를 통한 접속

베스천 호스트는 퍼블릭 서브넷에 위치한 EC2 인스턴스입니다. 이 호스트를 통해 SSH 터널링을 사용하여 RDS 인스턴스와 같은 VPC 내의 리소스에 안전하게 접근할 수 있습니다.

예시:
  1. 베스천 호스트를 생성하고, 퍼블릭 서브넷에 배치합니다.
  2. SSH를 통해 베스천 호스트에 접속한 후, RDS 인스턴스에 접근합니다.
ssh -i <your-key.pem> ec2-user@<베스천 호스트의 퍼블릭 IP>

2. EC2 Instance Connect Endpoint를 통한 접속

EC2 인스턴스 연결 엔드포인트를 사용하면 베스천 호스트 없이도 프라이빗 서브넷의 RDS에 접근할 수 있습니다. 이 엔드포인트를 통해 SSH 연결을 생성하고, RDS에 접속할 수 있습니다.
Ec2 instance connect endpoint 생성dms (무료이다 리소스 삭제해도되고 안해도된다.).

예시:
  • DNS 엔드포인트: database-2.cx0ao0u6e4ia.ap-northeast-2.rds.amazonaws.com
  • 프라이빗 IP: 172.31.84.103
  • rds를 생성할때 포트번호를 3389로 설정해줘야됨 (단, 3389포트만 활용 가능, 즉rds를 3389로만 사용해야 함)

터널을 열기 위한 명령어:

aws ec2-instance-connect open-tunnel --instance-connect-endpoint-id eice-0a9515d36403d608e --private-ip-address 172.31.84.103(dig 명령어로 dns 엔드포인트의 ip를 알아낼수있다.)--local-port 3306 --remote-port 3389

이 명령어는 터널을 생성하여 로컬 3306 포트에서 RDS의 3389 포트로 연결을 설정합니다.


3. IAM DB 인증 토큰을 사용한 접속

IAM DB 인증을 사용하면 AWS IAM 사용자나 역할을 통해 임시 인증 토큰(최대 15분 유효)을 생성하여 RDS에 접속할 수 있습니다. 이는 비밀번호 대신 임시 토큰을 사용하여 보안성을 높입니다.

예시:
  1. RDS IAM 인증을 활성화합니다.
  2. IAM 정책에서 rds-db:connect 권한을 부여합니다.
  3. IAM 인증 토큰을 생성합니다.

IAM 인증 토큰을 생성하는 명령어:

aws rds generate-db-auth-token --hostname database-2.cx0ao0u6e4ia.ap-northeast-2.rds.amazonaws.com --port 3389 --region ap-northeast-2 --username testuser

database-2.cx0ao0u6e4ia.ap-northeast-2.rds.amazonaws.com:3389/?Action=connect&DBUser=testuser&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA6ODU7WIUIMW4L7KH%2F20240923%2Fap-northeast-2%2Frds-db%2Faws4_request&X-Amz-Date=20240923T084528Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=d75f65f49c2c2f515aa6e19afdfd18b083f180bf36eee849aed0088de943d014

이렇게 생성된 토큰은 15분 동안만 유효하며, 이를 통해 MySQL Workbench와 같은 클라이언트 툴로 RDS에 접속할 수 있습니다.
또한, MySQL Workbench를 사용할 경우 advanced 설정에서 cleartext authentication 플러그인을 활성화해야 합니다.


AWS IAM Policy 설정

RDS에 IAM 인증을 사용하려면, 해당 유저에게 rds-db:connect 권한을 부여해야 합니다. 아래는 IAM 인증을 위한 정책 예시입니다:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["rds-db:connect"],
      "Resource": [
        "arn:aws:rds-db:us-east-2:1234567890:dbuser:db-ABCDEFGHIJKL01234/db_user"
      ]
    }
  ]
}

이 정책은 특정 RDS 인스턴스에 대해 rds-db:connect 권한을 부여하며, 이는 IAM 사용자가 RDS에 접근할 수 있도록 해줍니다. 필요에 따라 조건을 추가해 세부적인 접근 권한 제어가 가능합니다.

여러 rds 인증

일반적인 usernmae/password를 활용한 인증 aws secrets managers 로 관리 가능 iam 인증 iam 을 활용해 임시 토큰을 생성하여(15분) rds에 접속하는 방법 이때 iam 인증을 허용해줄 유저를 db에 넣어줘야함 토큰 생성을 위해서 Rds-db:connect 권한 필요 iam 컨디션 활용 가능 인턴은 Type: devonly 태그가 붙은 Rds 인스턴스에 회사 아이피로 1월1일부터 1월 16일까지 아침 9시부터 저녁6시까지만 접속가능 kerberos