[AWS] RDS : 자격 증명과 Connection (+ AWS Secrets Manager & RDS Proxy)

이번 포스팅에서는 프로비저닝한 RDS 서비스에 접근하기 위한 인증 방식과, 그것을 활용한 접근 방법에 대해서 살펴보려고 한다.
RDS 인증 방식

1. 전통적인 User/Password 기반 인증
- 일반적인 DB 사용자명과 비밀번호를 사용하여 인증
- AWS Secrets Manager와 연동 가능, 비밀번호 자동 관리 및 보안 강화
2. 추가 인증 방식: IAM 기반 인증
- IAM 사용자 또는 역할을 통해 RDS에 접근 가능
- 비밀번호 없이 안전한 접근을 제공하며, AWS 환경에서 보안성을 강화하는 방식
- 임시 토큰을 생성하여 인증 수행
- RDS에서 IAM 인증을 허용할 사용자(User)를 사전에 설정해야 함
- 토큰 생성을 위해 IAM 정책에 rds-db:connect 권한이 필요
Public Subnet에 위치한 DB 인스턴스 접속

RDS를 프로비저닝 할 때, 퍼블릭 엑세스를 허용해두면, Public Subnet에 위치하게 되어 외부에서 접근이 가능하다.

따라서 기본적인 ID/Password 방식의 인증을 통해서 Public Subnet에 위치한 RDS에 Connection이 가능하다.
Private Subnet에 위치한 DB 인스턴스 접속
Private Subnet에 위치한 인스턴스는 기본적으로 외부 인터넷을 통해서 접속이 불가능하다.
RDS 또한 EC2 인스턴스를 기반으로 동작하기 때문에 Private Subnet에 위치한 EC2 인스턴스에 접근하는 방법들을 사용할 수 있다.
- Bastian Host
- Instance Connect Endpoint (3389번 포트만 활용 가능)
- VPN / Direct Connect 등 사용

먼저 다음과 같이 VPC의 서브넷을 구성했다고 생각해보자.
해당 VPC에는 두 개의 AZ에 각각 Public Subnet과 Private Subnet을 할당해주었다.


- RDS를 프로비저닝할 때, VPC의 두 개의 Private Subnet을 선택하여 서브넷 그룹을 할당해주었다. 이로서 RDS 인스턴스는 Private Subnet에 위치하게 된다.
- 더불어 퍼블릭 엑세스 또한 허용하지 않도록 설정하였다. (퍼블릭 액세스를 허용해도 RDS가 Private Subnet에 위치하면 외부 인터넷에서 직접 접근할 수 없긴 하다.)
- 데이터베이스 인증 방식으로는 암호 방식과 IAM 인증 방식 둘 다 활용해 볼 것이므로 해당 옵션을 선택해주었다.

- Bastion Host로 사용할 EC2 인스턴스도 함께 프로비저닝 해 주었다.
<함께 보기> Private 인스턴스의 연결 방법
https://sjh9708.tistory.com/256
[AWS] Private EC2 연결 방법 : Bastion Host & SSM & Instance Connect Endpoint
Private Subnet에 위치한 EC2는 인터넷 게이트웨이(IGW)와 퍼블릭 IP가 없기 때문에 외부에서 직접 접근할 수 없다. 따라서 인스턴스에 접속하거나 접근하려면 우회적인 방식을 사용해야 한다. 이번
sjh9708.tistory.com
SSH 터널링을 통한 Bation Host를 매개체로 Connection

- RDS가 Private Subnet에 위치한 경우, 외부 인터넷에서 직접 접근할 수 없음.
- 대신 퍼블릭 서브넷에 위치한 Bastion Host (Jump Server)를 경유하여 RDS에 접속해야 한다.
- 이를 위해 SSH 터널링을 사용하여 Bastion Host를 중간 매개체로 설정하고, 로컬에서 마치 RDS가 직접 연결된 것처럼 접속 가능하게 만들었다.
SSH 터널링 설정
- SSH Hostname: Bastion Host의 퍼블릭 IP 또는 도메인 이름
- SSH Username: EC2 인스턴스의 기본 사용자
- SSH Key File: EC2 접속을 위한 프라이빗 키(.pem 파일) 지정
MySQL 접속 정보
- MySQL Hostname: Private Subnet에 위치한 RDS의 엔드포인트
- MySQL Server Port: MySQL 기본 포트
- Username / Password: RDS의 인증 정보
IAM 인증 방식을 통한 Connection
IAM 인증을 활성화한 RDS 인스턴스에서는 IAM 사용자 또는 역할을 통해 데이터베이스에 접근할 수 있다.
- 비밀번호 대신 AWS SDK 또는 CLI를 통해 임시 인증 토큰을 생성하여 로그인하는 방식을 주로 사용한다.
- 토큰은 일정 시간(기본 15분) 동안만 유효하며, 주기적으로 갱신해야 한다.
- 사용자는 rds-db:connect 권한을 부여받아야 하며, RDS 내부에서 해당 사용자의 DB 계정을 미리 생성해야 한다.
데이터베이스에 IAM 인증 방식을 사용할 수 있는 DB 사용자를 생성해서 사용해야 한다.
CREATE USER 'my-user' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
GRANT ALL PRIVILEGES ON mydb.* TO 'my-user'@'%';

토큰을 발급받을 IAM 사용자의 권한(rds-db:connect)을 함께 설정해주어야 한다.

SDK나 CLI 등을 통해서 해당 IAM 사용자로 자격 증명을 하여 RDS에 접근할 수 있는 토큰을 조회할 수 있다.
aws rds generate-db-auth-token --hostname my-database.c7q6mc8m8zw5.ap-northeast-2.rds.amazonaws.com --port 3306 --region ap-northeast-2 --username my-user

Bastion Host + SSH 터널링 방식으로 RDS 인스턴스에 마찬가지로 접근해주었다.
- 인증 시 MySQL의 Username에는 DB에서 생성한 사용자를, Password에는 발급받은 토큰을 입력해준다.
- 이 때 토큰은 비밀번호를 암호화되지 않은 평문(Cleartext)으로 MySQL 서버에 전송해야 하기 때문에 Cleartext Authentication Plugin을 활성화 시켜주어야 할 수 있다.


AWS Secrets Manager

AWS Secrets Manager는 데이터베이스 암호, API 키 등의 보안 정보를 안전하게 저장하고 관리하는 AWS 서비스이다.
AWS Secrets Manager를 RDS에 활용하면, 애플리케이션에서 데이터베이스 접속 정보를 직접 코드에 하드코딩할 필요 없이 안전하게 저장하고 동적으로 불러올 수 있다.
또한 암호를 주기적으로 자동 회전(Rotation)하여 보안성을 강화할 수 있기 때문에 수동으로 암호를 변경하고 애플리케이션을 업데이트해야 하는 기존의 관리 부담을 해결한다.
- 보안 정보 저장 및 관리
- RDS, Redshift, DocumentDB 등의 데이터베이스 암호를 안전하게 저장 및 검색 가능
- 애플리케이션에서 직접 AWS SDK 또는 CLI를 통해 암호를 안전하게 불러와 사용 가능
- 주기적인 암호 자동 교체 지원
- 설정된 주기에 따라 자동으로 암호를 변경하고 RDS에 적용 가능
- 보안 강화를 위해 주기적인 암호 변경이 필요한 경우 유용
- 비용 차이 (Secrets Manager vs Parameter Store)
- Secrets Manager는 보안 정보 저장 및 불러오는 데 비용이 발생
- Parameter Store(AWS Systems Manager)도 보안 정보 저장 가능하지만, 10,000개 이하의 기본 사용량은 무료


RDS를 프로비저닝 할 때 Secrets Manager에서 관리하는 자격 증명 정보를 기반으로 인증을 설정할 수 있다. 이 때 Secrets Manager에는 해당 RDS에서 사용할 보안 암호가 자동으로 생성된다.

사용자나 애플리케이션이 RDS에 대한 Connection 정보를 얻기 위해서는 Secrets Manager에 저장되어 있는 암호 값에 대해 접근해야 한다.
이 때 IAM 권한으로서 SecretsManagerReadWrite 권한이 있어야 접근이 가능하다. 따라서 해당 Policy가 존재하는 IAM 사용자나 Role을 사용하여 접근해야 한다.
다음은 AWS CLI 등을 사용하여 자격 증명을 통해서 Secrets 값에 접근하는 방식 중 하나이다. (사전에 aws configure를 통해서 Profile을 지정해주었다.)
aws secretsmanager get-secret-value --secret-id 'YOUR_RDS_NAME' --profile 'CLI PROFILE' --region ap-northeast-2
# aws secretsmanager get-secret-value --secret-id 'rds!db-25664e62-846e-44ec-ad51-ec82073fbabf' --profile wisefee-app --region ap-northeast-2

웹 애플리케이션 등에서 AWS Secrets Manager를 활용하여 RDS를 연동하는 방법에 대해서는 추후 포스팅에서 자세히 다루어 볼 예정이다.
<함께 보기> Spring 프로젝트에 RDS + Secrets Manager 연동하기
https://sjh9708.tistory.com/265
[AWS + Spring] RDS + Secrets Manager 연동하기
이번 포스팅은 Spring Application에서의 RDS의 Connection 방법과, Secrets Manager를 활용하여 데이터베이스의 Connection 정보를 관리해보려고 한다. Amazone Secrets Manager의 필요성 spring: datasource: driver-class-n
sjh9708.tistory.com
AWS RDS Proxy
AWS RDS Proxy는 RDS와 애플리케이션(EC2, Lambda 등) 사이에서 데이터베이스 연결을 효율적으로 관리하는 Connection Pool 서비스이다.
Connection Pool이란?
- 데이터베이스 연결을 미리 생성하고 재사용하여 성능을 향상시키는 기술
- 커넥션을 새로 생성/소멸하는 오버헤드를 줄여, 응답 속도 개선
- RDS Proxy는 커넥션을 자동으로 최적화하여, 대량의 연결 요청에도 성능을 유지.
1. Connection Pool을 활용해 DB 연결을 미리 생성하고 재사용하여 성능을 최적화하고 연결 비용을 줄인다.
2. Lambda, EC2 Auto Scaling과 같은 대규모 트래픽 환경에서 RDS 부하를 줄이고 안정성을 높이는 데 유용하다.
3. VPC 내부에서만 사용 가능하다. 따라서 보안이 강화되며 퍼블릭 인터넷에서는 접근할 수 없다.
4. RDS와는 별도의 엔드포인트를 제공한다 → 그렇지만 기존 애플리케이션에서 엔드포인트만 변경하면 쉽게 적용 가능하다.
5. User/Password 인증 혹은 IAM 인증을 지원한다.

RDS Proxy와 RDS간의 통신 : RDS Proxy는 내부적으로 항상 AWS Secrets Manager를 활용하여 RDS와 통신한다.
서버와 RDS Proxy간의 통신 : 기존의 RDS 자격증명 시 활용할 수 있는 방법들 (IAM 혹은 User / Password 방식, Secrets Manager를 활용한 방식)을 사용한다.
위의 아키텍쳐는 AWS Lambda(혹은 EC2)가 RDS Proxy를 경유하여 Aurora DB와 통신하는 과정을 설명한다.
- AWS Lambda는 RDS Proxy에 IAM 인증을 요청하여 임시 토큰을 생성한다.
- RDS Proxy는 IAM 정책을 사용하여 Secrets Manager에서 RDS 자격증명을 가져온다.
- Secrets Manager를 통해 획득한 User/Password를 사용하여 RDS와 통신한다.
RDS Proxy 프로비저닝


프록시 생성 과정
- 사용자가 MariaDB, MySQL, PostgreSQL, SQL Server 중 하나를 선택하여 RDS Proxy를 생성.
- 연결 유지 시간을 설정하여 비활성 연결을 자동으로 종료할 시간(Idle timeout)을 결정.
대상 그룹 구성 (Target Group 설정)
- RDS 인스턴스 또는 Aurora DB 클러스터를 Proxy의 대상으로 지정.
- 연결 제한 값을 설정하여 최대 동시 연결 수를 관리할 수 있음.
Secrets Manager 연동
- 애플리케이션이 직접 DB 암호를 관리하지 않도록 AWS Secrets Manager에서 자동으로 인증 정보를 가져오도록 설정.
- 보안 강화를 위해 자동 비밀번호 교체(자동 Rotation)도 가능.
IAM 인증 옵션
- 기존의 User/Password 방식 외에 IAM 인증을 활성화할 수 있음.
- IAM을 통한 인증을 허용하면 임시 토큰을 활용해 비밀번호 없이 안전하게 접속 가능.
References
https://docs.aws.amazon.com/
docs.aws.amazon.com
쉽게 설명하는 AWS 기초 강의 강의 | AWS 강의실 - 인프런
AWS 강의실 | , 안녕하세요. AWS 강의실입니다.AWS 공식 커뮤니티 빌더이자 2만명의 구독자를 보유한 AWS Only 강의 유튜브의 경험으로 AWS를 쉽게 알려드립니다.이 강의는AWS의 서비스 및 활용 지식을
www.inflearn.com
'Backend > AWS' 카테고리의 다른 글
[AWS] CloudWatch : 주요 개념과 구성요소 (로그, 지표, 경보) (0) | 2025.03.23 |
---|---|
[AWS + Spring] RDS + Secrets Manager 연동하기 (0) | 2025.03.11 |
[AWS] RDS : 서비스 개요 및 프로비저닝 설정 (0) | 2025.03.10 |
[AWS] Amazone Athena & Amazone Glue : 데이터 소스에 대한 스키마 분석 및 쿼리 수행 기초 (0) | 2025.02.19 |
[AWS] S3 활용 : Static Hosting (정적 웹 호스팅) (0) | 2025.02.19 |