[AWS] IAM 자격증명을 사용하는 RDS 인증 구성하기

안녕하세요, 누리클라우드입니다. 간혹, 디비의 패스워드가 포함된 소스가 노출되어 정보유출사고가 발생하곤 합니다.
이번 글에서는 패스워드가 아닌 임시 토큰을 사용하여 디비에 접속하는 방법에 대해서 알아보겠습니다. 이 글이 다루는 범위는 IAM(Identity and Access Management)과 RDS 인증에 대한 개념과 기본 구성 그리고 간단한 디비 접속테스트 방법을 소개하도록 하겠습니다.

들어가기 전에

본 기능을 구성할 때 몇 가지 조건과 제약사항이 있습니다.

RDS는 MySQL 8.0.6, 5.7.16, 5.6.34 이상, PostgreSQL 10.6, 9.6.11, 9.5.15 이상에서 지원됩니다 (실제 지원 여부는 RDS 생성시 최종 확인해 보아야 함).

Aurora RDS는 MySQL 버전2, 버전 1.10이상, PostgreSQL은 10.4이상, 9.6.9 이상이면서 db.t[23].small이 아니어야 합니다 (실제 지원 여부는 RDS 생성시 최종 확인해 보아야 함).

디비 신규 접속이 초당 200개 미만의 워크로드에서 사용할 것을 권고합니다.

기본 개념

기본 개념 및 구성은 아래 그림과 같습니다.

RDS에서 AWSAuthenticationPlugin을 인증으로 사용하는 dbuser를 생성하고, 이 접근을 허용하는 정책을 가진 IAM Role을 EC2나 Lambda에 부여하면, 디비 클라이언트는 15분간 유지되는 임시 인증 토큰을 발급받아 별도의 패스워드 없이 RDS의 허용된 database에 디비 접속이 가능하게 됩니다.

구성하기

  1. EC2 인스턴스 생성

디비 관리 및 접속 테스트를 위한 인스턴스를 생성하고 테스트에 필요한 어플을 설치합니다.

sudo yum install -y mysql-community-client

IAM을 통한 인증은 SSL 통신이 필수이므로 테스트 EC2에 인증서를 설치합니다.

sudo mkdir -p /var/mysql-certs
cd /var/mysql-certs
wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

  1. RDS 생성

RDS를 생성할 때 아래와 같은 선택항목이 보인다면 IAM Authentication을 지원하는 RDS입니다. 만약 아래 항목이 보이지 않는다면, 디비 엔진의 종류나 버전 혹은 인스턴스 사양을 변경하여 보시기 바랍니다.

RDS가 생성되었다면 테스트용 EC2에서 RDS로 정상적으로 디비 접속이 이루어지도록 네트워크 및 보안그룹을 조정합니다.

  1. 디비 계정 생성

테스트용 EC2에서 RDS에 디비 관리자로 접속하여 아래와 같이 디비 사용자를 생성합니다.

mysql> CREATE DATABASE testdb;
mysql> CREATE USER dbuser1_iam@`%` IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
mysql> GRANT ALL PRIVILEGES ON testdb.* TO dbuser1_iam@'%';
mysql> FLUSH PRIVILEGES;

  1. IAM 정책 및 역할 생성

아래와 같은 인-라인 정책을 가진 iam-access-to-rds 란 이름의 정책과 iam-access-to-rds-role 란 이름의 역할을 만들어 정책을 역할에 연결하고, 역할을 테스트용 EC2 인스턴스에 부여합니다.

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"arn:aws:rds-db:ap-northeast-2:123456789123:dbuser:db-FGRFXSIXQ5ABCOPJRQQM7BSPZXJI/dbuser1_iam"
]
}
]
}

위의 리소스 항목에서 db-FGRFXSIXQ5ABCOPJRQQM7BSPZXJI는 RDS의 리소스 ID이고 dbuser1_iam는 IAM 인증방식으로 접속을 허용할 디비 사용자입니다.

접속 테스트

테스트용 EC2에서, 먼저 임시 인증 토근을 발급받습니다.

RDS_HOST="database-2.c3tmz7ki9hed.us-west-2.rds.amazonaws.com"
DB_NAME="testdb"
DB_USER="dbuser1_iam"

TOKEN="$(aws rds generate-db-auth-token –hostname $RDS_HOST –port 3306 –region us-west-2 –username $DB_USER )"

이제 발급받은 토큰을 패스워드로 하여 디비 접속을 합니다.

mysql –host=$RDS_HOST –port=3306 –ssl-ca=/var/mysql-certs/rds-combined-ca-bundle.pem –enable-cleartext-plugin –user=$DB_USER –password=$TOKEN $DB_USER

맺음말

이상으로 RDS에 IAM 인증 방법을 사용하기 위해 리소스를 구성하고 설정하여 테스트하는 방법까지 간략히 소개해 드렸는데요, 이 인증 방법을 실제 운영서비스에 적용하고자 한다면 IAM에 대한 충분한 이해와 검토가 있어야 하겠습니다. 패스워드 없이 디비에 접속하는 개념을 이해하고 도입을 검토하기 위해 이 글이 다소나마 도움이 되기를 바랍니다.

외부참조링크

유튜브 실습 영상:
How to I authenticate to an Amazon RDS DB instance using IAM credentials? IAM Access To RDS

AWS Document:
MySQL 및 PostgreSQL을 위한 IAM 데이터베이스 인증