전공영역 공부 기록

DB비밀번호 없이 AWS RDS 접속하는 방법 (feat, RDS IAM 인증)

악분 2026. 1. 18. 17:58
반응형

안녕하세요. 이 글은 AWS RDS에 인증할 때 비밀번호 없이 로그인하는 방법을 소개합니다.

 

데이터베이스 인증이란

데이터베이스에 접근하려면 인증 과정을 거쳐야 합니다. 계정과 비밀번호를 올바르게 입력해야 인증이 성공하며, 인증에 실패하면 데이터베이스에 접근할 수 없습니다.

 

데이터베이스 인증의 위험

데이터베이스 인증은 비밀번호가 필요하기 때문에, 비밀번호가 실수로 유출되면 데이터베이스가 위험에 노출됩니다. 특히 개인정보가 포함된 데이터베이스이거나 주요정보통신기반시설 시스템인 경우, 내부관리계획에 따라 비밀번호 로테이션과 복잡도를 법적으로 점검해야 합니다.

참고자료: https://www.kisa.or.kr/2060204/form?postSeq=22&page=1#fnPostAttachDownload

 

데이터베이스 비밀번호 유출 위험 최소화하는 방법

데이터베이스 비밀번호 유출을 최소화하는 방법은 두 가지입니다.

  • 주기적으로 데이터베이스 비밀번호 교체
  • 데이터베이스 접근할 때 임시 비밀번호 발급

 

RDS IAM 인증

AWS에서는 RDS에 접근할 때 임시 비밀번호를 발급해주는 기능을 제공합니다. 정확히 말하면 15분 동안 유효한 임시인증토큰을 발급해주는 기능이 있습니다. 임시인증토큰으로 인증하기 때문에, 데이터베이스 비밀번호는 인증 과정에서 사용하지 않아도 됩니다.

 

client는 AWS SDK의 generate-db-auth-token 함수를 호출하여 임시인증토큰을 발급받습니다. 발급받은 임시인증토큰을 비밀번호 대신 사용하여 RDS에 접근할 수 있으며, RDS는 이 토큰을 검증하여 요청 허용 여부를 결정합니다.

 

임시인증토큰의 구조

임시인증토큰은 AWS Signature Version 4로 서명되어 있으며, 다음 정보를 포함합니다:

  • 데이터베이스 호스트명과 포트
  • 데이터베이스 사용자명
  • 서명 알고리즘
  • 유효기간 (900초 = 15분)
  • AWS 자격 증명 정보

 

기능 제한

RDS IAM 인증의 제한 사항은 AWS 공식 문서에서 확인할 수 있습니다.

주요 제한 사항은 다음과 같습니다.

  • 초당 200개 이상의 RDS IAM 인증 요청을 처리할 수 없습니다. AWS 문서에서는 데이터베이스 커넥션 풀 사용을 권장합니다.
  • 임시토큰을 무효화하는 revoke 기능이 없습니다.
  • IAM Administrator 권한이 있으면 모든 데이터베이스 계정에 대해 IAM 임시인증토큰을 발급받을 수 있습니다.
  • SSL 모드를 필수로 사용해야 합니다. AWS CA 인증서가 없는 OS나 시스템은 AWS CA 번들 인증서를 미리 준비해야 합니다.
  • Database IDE가 IAM 인증을 지원하지 않으면, 세션이 종료될 때마다 임시인증토큰을 발급받아 수동으로 입력해야 합니다.
  • 기존 데이터베이스 계정에 RDS IAM 인증을 적용하면 PostgreSQL에서 오류가 발생할 수 있습니다. PostgreSQL은 RDS IAM 인증 방식의 우선순위가 더 높아 비밀번호 방식을 사용하는 로직에 문제가 생길 수 있습니다.

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html

 

 

모니터링

RDS IAM 인증 메트릭을 지원하므로 CloudWatch에서 쉽게 모니터링할 수 있습니다.

 

설정방법

RDS IAM 인증을 사용하려면 총 3가지 설정이 필요합니다.

  • RDS 설정
  • IAM 설정
  • 데이터베이스 설정

RDS 설정

RDS에서 IAM database authentication 설정을 활성화합니다.

 

Terraform에서는 iam_database_authentication_enabled 속성을 true로 변경하면 됩니다.

resource "aws_rds_cluster" "mysql" {
  cluster_identifier = "${var.project_name}"
  iam_database_authentication_enabled = true
  ...
}

IAM 설정

IAM에서는 IAM role을 생성하고 IAM policy를 설정합니다. IAM policy에서는 rds-db:connect 권한을 설정해야 합니다. 권한 대상은 RDS resource ID와 데이터베이스 계정입니다. 즉, IAM role이 인증할 때 어떤 데이터베이스의 계정으로 인증할지 설정해야 합니다.

 

데이터베이스 설정

데이터베이스에서는 데이터베이스 계정이 IAM 인증을 사용할 수 있도록 설정해야 합니다.

PostgreSQL

CREATE USER db_userx; 
GRANT rds_iam TO db_userx;

MySQL

CREATE USER IF NOT EXISTS 'db_user'@'%' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
ALTER USER 'db_user'@'%' REQUIRE SSL;     

 

RDS IAM 인증 마이그레이션

아직 테스트하지 않았지만, 비밀번호 인증을 사용 중인 데이터베이스 계정에 RDS IAM 인증을 적용하면 서비스 장애가 발생할 수 있습니다. PostgreSQL에서는 RDS IAM 인증 방식의 우선순위가 더 높기 때문입니다.

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html

 

따라서 RDS IAM 인증 마이그레이션은 새로운 데이터베이스 계정을 만들어 RDS IAM 인증을 적용하고, 애플리케이션에서 이 계정을 사용하도록 배포하는 방식이 좋습니다. 두 개의 계정을 사용하면 무중단 마이그레이션이 가능하고 롤백도 쉽습니다.

 

실습

실습 코드는 제 GitHub에 공개되어 있으며, 크게 2가지로 구성되어 있습니다.

 

AWS CLI로 RDS IAM 인증

AWS CLI 실습에서는 generate-db-auth-token으로 RDS 임시인증토큰을 발급받고, mysql 또는 psql로 RDS에 접근할 때 이 토큰을 사용합니다.

TOKEN=$(aws rds generate-db-auth-token \
  --hostname $MYSQL_HOST \
  --port 3306 \
  --region ap-northeast-2 \
  --username iam_user)

mysql -h $MYSQL_HOST \
  --port 3306 \
  --ssl-mode=DISABLED \
  --user=iam_user \
  --password="$TOKEN" \
  --enable-cleartext-plugin

 

Spring Boot에서 RDS IAM 인증

Spring Boot에서는 aws-advanced-jdbc-wrapper를 사용하며, datasource.url에 wrapperPlugins=iam을 설정합니다. driver-class-name은 software.amazon.jdbc.Driver로 변경해야 합니다. 자세한 동작 원리와 코드 설명은 아래 블로그를 참고하세요.

jdbc:aws-wrapper:mysql://<hostname>:<port>/<database>?wrapperPlugins=iam&iamRegion=<region>&sslMode=require
spring:
  application:
    name: iam-auth

  datasource:
    url: jdbc:aws-wrapper:mysql://${RDS_HOSTNAME}:${RDS_PORT:3306}/${RDS_DATABASE:demo}?wrapperPlugins=iam&iamRegion=${AWS_REGION:ap-northeast-2}&sslMode=require
    username: ${RDS_USERNAME:iam_user}
    driver-class-name: software.amazon.jdbc.Driver
    hikari:
      maximum-pool-size: 10
      minimum-idle: 5
      max-lifetime: 840000

 

참고자료

반응형