AWS - IAM 인증을 사용하여 RDS 접속하기 - IAM 데이터베이스 인증

Share

Last Updated on 4월 4, 2022 by Jade(정현호)

안녕하세요 
이번 포스팅에서는 AWS 클라우드 환경에서 IAM 인증을 통해서 RDS 접속을 하여 사용하는 내용에 대해서 확인 해보려고 합니다. 

AWS IAM

IAM 은 Identity and Access Management(IAM) 약자로 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스입니다.

IAM을 사용하여 로그인 그리고 로그인 유형을 설정할 수 있으며, 리소스를 사용하도록 인증(로그인) 및 권한 부여(권한 있음)된 대상을 제어합니다.


AWS 계정을 처음 생성할 때는 해당 계정의 모든 AWS 서비스 및 리소스에 대한 완전한 액세스 권한을 지닌 통합 인증(SSO) 자격 증명인 루트 사용자로 시작하게 됩니다.

AWS 계정을 생성시 사용한 이메일 주소와 암호로 루트 사용자로 로그인하여 사용할 수 있습니다. 다만 일반적인, 일상적인 작업, 심지어 관리 경우에도 루트 사용자를 직접 사용하지 말것을 AWS 에서는 강력하게 권장하고 있습니다.

대신 IAM 서비스를 통해서 사용자를 처음 생성할 때만 루트 사용자를 사용하는 것이 모범 사례를 준수 한다고 할 수 있습니다.
그런 다음 루트 사용자의 자격증명 정보는 안전하게 보관하고, 별도로 생성한 계정으로 리소스 관리 및 서비스 작업 수행을 하는 형태로 사용하는 것이 좋다고 합니다.

IAM 에서 루트 사용자가 아닌 별도의 사용자를 생성하여 사용할 경우에 사용자 별로 별도의 access key 와 secret key 를 사용 할 수 있으며, 콘솔에 로그인이 불필요한 프로그래밍 방식 액세스 타입으로 계정을 생성하여 사용할 수 도 있습니다.

이미 생성되어 있는 그룹을 사용함으로써 권한 사용을 편리하게 설정할수 있거나 별도의 그룹 생성 및 그룹의 권한을 연결 하여 그룹에 맴버를 추가함으로써 원하는 세부 기능에 대해서만 그룹으로 쉽게 설정도 가능 합니다.

주요 기능으로는 다음과 같습니다.

 - AWS 계정에 대한 공유 액세스
 - 세분화된 권한
 - Amazon EC2에서 실행되는 애플리케이션을 위한 보안 AWS 리소스 액세스
 - 멀티 팩터 인증(MFA)
 - 자격 증명 연동
 - 보장을 위한 자격 증명 정보

 - PCI DSS 준수
 - 많은 AWS 서비스와의 통합
 - 최종 일관성
 - 무료 사용


• 테스트 환경 정보
- 데이터베이스 : RDS for MySQL 8.0.25
- EC2 OS : Amazon Linux 2 AMI (HVM) - Kernel 5.10
- DEV PC OS : Ubuntu 20.04
- AWS CLI : aws-cli/2.4.27
- aws-vault : 6.6.0

        

IAM 인증을 사용한 RDS 연결

AWS IAM 인증을 사용하여 RDS 에 연결 할때 인증 토큰을 사용하게 됩니다. 인증 토큰이란 암호 대신 사용하는 문자열을 말합니다.

인증 토큰은 생성 후 15분 동안만 유효하며 이시간이 지나면 만료가 되게 되며, 만료된 토큰을 사용하여 연결하려고 하면 연결 요청이 거부 되게 됩니다.

IAM을 통한 데이터베이스 인증에는 SSL(Secure Sockets Layer) 연결이 필요하며,  DB 인스턴스와 주고받는 모든 데이터가 암호화 되게 됩니다.

모든 인증 토큰은 AWS 서명 버전 4를 사용하여 유효한 서명이 있어야 하며, AWS SDK for Java 또는 AWS SDK for Python (Boto3)와 같은 AWS CLI 및 AWS SDK는 사용자가 생성한 각 토큰에 자동으로 서명할 수 있습니다.

AWS Lambda와 같은 AWS 서비스에서 Amazon RDS에 연결할 때 인증 토큰을 사용할 수 있으며, 토큰을 사용하게 되면 코드에 암호를 넣지 않아도 됩니다.
IAM 인증 토큰에 서명까지 마쳤으면 이제 Amazon RDS DB 인스턴스에 연결할 수 있게 됩니다.
           

인증 토큰이 필요한 경우

DB의 계정의 정보 관리에 대해서는 항상 중요한 부분이며 몇가지들의 고민이 있을 것 입니다.
그래서 여러 방법으로 키를 최대한 노출 하지 않으면서 Access  하는 방법을 사용을 하게 됩니다.

배스천 호스트(bastion host) 나 관리용 EC2 에서 crontab 이나 기타 스케줄에 의해서 주기적으로 RDS 인스턴스에 접속하여 데이터를 수집 및 조회 , 변경 등의 작업을 하는 쉘 스크립트를 사용할 경우, 쉘 스크립트내의 계정정보(계정명,패스워드)를 어떻게 하는 것이 보안에 좋을지가 일반적인 고민 되는 부분 중에 하나일 것이라고 생각합니다.

쉘 스크립트내에서 DB 접속 정보에 관한 부분은 여러가지 방법이 있을 것 입니다.
계정정보가 입력되어있는 형태, mysql --login-path 를 이용하는 방법(참고), 파일이나 환경변수를 통해서 정보를 입력 받는 형태, perl 을 이용한 문자열 복호화 , AWS KMS 를 활용하는 방법, 쉘 스크립트 자체를 바이너리 암호화(참고) 하는 방법 등 여러가지 방법은 있을 것으로 생각 됩니다

EC2 에서 수행되는 애플리케이션의 경우도 구성 따라 properties 파일이나 xml 파일 등에 접속 정보가 담겨 있을 수 있으며 이런 부분도 보안 처리를 하거나 주기적으로 패스워드 변경이 필요 할 수 있습니다.

또 다른 예시로 운영 정책 상으로 GUI 쿼리툴에서 사용하는 개발자 및 사용자 등의 패스워드가 주기적으로 변경이 필요할 경우도 있을 수도 있습니다.

이러한 계정 정보 관리에 대한 부분이 AWS 클라우드를 사용할 경우 AWS IAM 인증을 통한 임시 인증 토큰으로 RDS 를 접속 하는 것이 한가지 방법이 될 수 도 있을것 같습니다.
        

IAM 인증에 방식 사용 조건

AWS IAM 서비스를 통한 인증 방식을 사용할 수 있는 버전 정보와 인증의 제약사항과 권장사항에 대해서 확인 해 보도록 하겠습니다.

• 버전 관련 : AWS Aurora

  • Aurora MySQL

    • Aurora MySQL 버전 3, 모든 마이너 버전

    • Aurora MySQL 버전 2, 모든 마이너 버전

    • Aurora MySQL 버전 1.10 이상의 1.1 마이너 버전

  • Aurora PostgreSQL

    • 모든 Aurora PostgreSQL 13 버전

    • 모든 Aurora PostgreSQL 12 버전

    • Aurora PostgreSQL 11.6 이상 11 버전

    • Aurora PostgreSQL 10.11 이상 10 버전

    • Aurora PostgreSQL 9.6.16 이상 9.6 버전


• 버전 관련 : RDS for MySQL/PostgreSQL

  • MySQL 8.0, 마이너 버전 8.0.16 이상

  • MySQL 5.7, 마이너 버전 5.7.16 이상

  • MySQL 5.6, 마이너 버전 5.6.34 이상

  • PostgreSQL 14, 13, 12 및 11, 모든 마이너 버전

  • PostgreSQL 10, 마이너 버전 10.6 이상

  • PostgreSQL 9.6, 마이너 버전 9.6.11 이상

  • PostgreSQL 9.5, 마이너 버전 9.5.15 이상



데이터베이스 인증 방식의 제한 사항

IAM 데이터베이스 인증을 사용하는 경우, 다음 한도(제한사항)가 적용됩니다.

- DB 인스턴스 의 초당 최대 연결 수는 DB 인스턴스 클러스터 및 워크로드에 따라 제한할 수 있습니다.
- 현재 IAM 데이터베이스 인증은 모든 전역 조건 컨텍스트 키를 지원하지 않습니다.
   전역 조건 컨텍스트 키에 대한 자세한 내용은 IAM 사용 설명서의 AWS 전역 조건 컨텍스트 키를 참조하세요.
- 현재 IAM 데이터베이스 인증은 CNAME 에서 지원되지 않습니다.
- PostgreSQL의 경우, IAM 역할(rds_iam)이 마스터 사용자에게 추가되면, IAM 인증이 암호 인증보다 우선하므로 마스터 사용자가 IAM 사용자로 로그인해야 합니다.


데이터베이스 인증에 대한 MySQL 엔진 권장 사항

Aurora For MySQL 과 RDS for MySQL 엔진을 사용할 경우 다음을 따르십시오.

- IAM 데이터베이스 인증 방식은 개인이 일시적으로 데이터베이스에 액세스하기 위한 메커니즘으로 사용하십시오.

- 재시도가 용이한 워크로드에서만 IAM 데이터베이스 인증 방식을 사용하십시오.
- 애플리케이션이 DB 신규 접속이 초당 200개 미만인 경우에 IAM 데이터베이스 인증 방식을 사용합니다
- Amazon RDS에서 작동하는 데이터베이스 엔진은 초당 인증 횟수에 제한이 없습니다.
  하지만 IAM 데이터베이스 인증 방식을 사용할 때는 애플리케이션이 인증 토큰을 생성해야 합니다.
  이렇게 생성된 토큰은 애플리케이션이 DB 인스턴스에 연결하는 데 사용됩니다.
  초당 허용되는 새 연결의 최대 수를 초과하면 IAM 데이터베이스 인증에 오버헤드가 추가로 발생하여 연결의 병목 현상이 발생할 수 있습니다.
  추가 오버헤드로 인해 기존 연결까지 끊어질 수도 있습니다.
- Aurora MySQL, RDS for MySQL/MariaDB 의 의 최대 총 연결 수에 대한 자세한 정보는 각 RDS 인스턴스에 사용하는 파라미터 그룹내 max_connections 를 확인 하시면 되며, 추가적인 내용은 설명서를 참고 하세요
         

사전 환경 구성

IAM 데이터베이스 인증 을 사용하기 위해서 사전에 필요한 몇 가지 작업이 있으므로 진행하도록 하겠습니다.
        

EC2 생성 및 기본 설정

EC2 관리 서버에서 스케줄러에 의해 RDS 로 접속하여 작업을 하는 스크립트에 대해서, 또는 EC2 에서 수행되는 애플리케이션에서도 IAM 데이터베이스 인증을 사용하는 과정을 확인 하기 위해서 먼저 EC2 를 생성 하고 진행하도록 하겠습니다.

EC2 의 경우 기존의 생성된 관리 서버나 배스천 호스트(bastion host) 를 사용해도 됩니다.

EC2 생성 과정은 포스팅에서는 생략하며, EC2 생성에 관한 내용은 아래 포스팅을 참고하시면 됩니다.


EC2 가 생성 되었거나 준비가 되었다면 접속을 하여 다음과 같은 내용을 확인 하고 설치를 진행 하도록 하겠습니다.


1) 먼저 접속 후 IP 를 확인 합니다.

2) MySQL 클라이언트 설치를 진행 합니다.

포스팅에서는 EC2 OS는 RPM 계열의 Amazon Linux 2 AMI (HVM) - Kernel 5.10 을 사용하였습니다.

MySQL 클라이언트 설치를 위해서 Yum Repository 구성이 필요하며 RPM 파일은 아래 링크에서 다운로드 받을 수 있습니다.


설치는 아래와 Repository RPM 다운로드 및 MySQL Client 설치를 진행 합니다.

-- RPM 설치
sudo rpm -i https://repo.mysql.com//mysql80-community-release-el7-5.noarch.rpm


-- MySQL Client 설치
sudo yum repolist
sudo yum install mysql-community-client mysql-community-devel


3) AWS CLI 설치

AWS IAM 인증을 사용하기 위해서는 AWS CLI 가 필요 합니다.

아래 절차대로 설치 및 설치 후 버전을 확인 합니다.

## 설치 파일 다운 로드 및 압축 해제
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip


## AWS CLI 설치
sudo ./aws/install


## 버전 확인
aws --version
aws-cli/2.4.27 Python/3.8.8 Linux/5.10.102-99.473.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off

          

RDS 데이터베이스 인증 설정

RDS 를 생성하거나 사용중인 RDS에 대해서 IAM 데이터베이스 인증에 관한 설정이 필요 합니다.

데이터베이스 인증 항목은 RDS 생성시 설정 하거나 사용중인 RDS 의 경우 수정을 통해서 기존 설정을 변경 할 수 있습니다.

사용중인 RDS에 대해서는 아래와 같이 RDS 대시보드에서 수정 메뉴를 선택하시면 됩니다.


기본으로 선택은 "암호 인증" 으로 되어 있을 것이며, IAM 인증을 통해서 접속은 아래 이미지와 같이 "암호 및 IAM 데이터베이스 인증" 으로 선택하시면 됩니다.


기존 사용중인 RDS 의 경우 아래와 같이 즉시 적용을 해주시면 되며, RDS의 재시작은 되지 않고 바로 적용이 됩니다.

          

DB 계정 생성 및 권한 부여

IAM 인증으로 접속할 계정을 생성 하도록 하겠습니다 또는 기본 사용중인 계정이라면 인증방식 변경을 하시면 됩니다(alter user)

생성 구문 예시는 다음과 같습니다.

CREATE USER 유저명 IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';


• DB 계정 생성

-- 데이터베이스 생성
create database test_db;
-- 데이터베이스 생성은 예시이며, 필수는 아닙니다.


-- 계정 생성
CREATE USER user_batch@'%' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';
CREATE USER user_dev@'%' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';


-- 권한 설정
GRANT SELECT,INSERT,UPDATE,DELETE,EXECUTE on test_db.* to user_batch@'%';
GRANT SELECT on test_db.* to user_dev@'%';


FLUSH PRIVILEGES;

포스팅에서는 user_batch 와 user_dev 라는 2개의 계정을 만드는 시나리오로 진행하였으며, 권한은 batch 계정는 SEL+DML 권한을 설정 하였으며, dev 계정은 SEL 권한만 설정 하였습니다.

포스팅에서는 접속 Host IP 대역을 % 으로 하였으나 실제로 접속을 허용할 IP 주소 대역대로 설정하시면 됩니다.
이전 단계에서 확인 하신 EC2 IP 정보를 토대로 C Class 또는 B나 A Class 등으로 생성하거나 또는 사용하는 서브넷의 IPv4 CIDR 값으로 계정을 생성 하셔도 됩니다.
애플리케이션에서 사용하는 계정 이면서 애플리케이션이 EC2 오토스케일 그룹을 사용중이라면 CIDR 값으로 생성하시면 됩니다.



기존 사용하던 유저의 인증 방식을 AWS IAM 으로 변경 하려면 아래와 같이 진행하시면 됩니다.

alter user '유저명'@'%'  IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';

        

RDS 정보 확인

AWS -> RDS -> 인스턴스 -> 구성 탭으로 이동 합니다.

구성 탭에서 확인 해야 할 정보는 위의 이미지 처럼 3가지정도 확인을 하시면 됩니다.

1 번 - ARN 정보 와 2번 리소스ID 정보는 메모장이나 기타 편집기 등에 잠시 복사를 해둡니다.

3번은 이전 단계에서 인스턴스 수정 등으로 설정한 데이터베이스 인증에서 "암호 및 IAM 데이터베이스 인증" 으로 설정되어 있는지를 확인 하는 정보로 이미지와 같이 "IAM DB 인증 - 활성화됨" 으로 확인되어야 합니다.
        

IAM 정책 설정 및 계정 생성

이전 단계에서 생성한 DB 계정에 대해서 IAM 데이터베이스 인증을 사용하기 위한 정책 생성 등의 작업이 필요 합니다.
              

정책 생성

정책(Policy) 생성을 진행하기 위해서 IAM 서비스로 이동 합니다.


정책 -> 정책 생성 을 선택 합니다.


JSON 탭으로 이동하여 정책을 추가하도록 하겠습니다. 

정책은 위의 이미지와 같은 형태로 작성을 하면 되며, 작성 완료 후에는 하단의 "정책 검토" 를 클릭 하시면 됩니다

아래 샘플을 사용하여 수정하여 사용하시면 됩니다.

{
   "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"
         ]
      }
   ]
}

수정해야할 부분은 Resource 항목이며, 이전 단계에서 별도로 기록 해둔 RDS 인스턴스 정보를 참고해서 수정하면 됩니다.
RDS의 ARN 정보 에서 리전명 과 account-id 정보를 통해서 아래 파랑색 부분을 수정하시면 됩니다.

arn:aws:rds-db:us-east-2:1234567890:dbuser:db-ABCDEFGHIJKL01234/db_user

그리고 RDS에서 같이 확인 할 수 있는 Resource-ID(리소스 ID) 는 위에서 주황색 부분을 대체 해서 수정하시면 됩니다.

그리고 마지막으로 갈색 으로 되어있는 곳은 이전 단계에서 생성한 "AWSAuthenticationPlugin" 을 사용하도록한 DB 계정명을 입력 하시면 됩니다.


아래 이미지를 다시 확인하면, 포스팅에서는 계정을 2개 생성 하였으며 그래서 콤마(,) 를 통해서 구분 하였으며, 맨 마지막에 항목에는 생성한 DB 계정명이 입력되어 있습니다.
정책 입력이 완료 되었다면 하단의 정책 검토 를 클릭 합니다


그 다음은 태그 추가 단계 입니다. 추가할 태그가 있다면 추가를 합니다.
모두 완료 되었다면 하단의 "다음:검토" 를 클릭 합니다.


정책 이름 과 설명 등을 입력 후에 모두 완료 되었다면, 하단의 "정책 생성" 을 클릭 합니다.

         

IAM 계정 생성

다음으로 IAM 계정을 생성을 진행하려고 합니다. 만약 EC2 에서 접속을 하는 케이스만 있을 경우나 사용하는 IAM 계정이 별도로 이미 존재 한다면 아래에서 진행하는 계정 생성은 Skip 하셔도 됩니다.

계정 생성을 위해서는 IAM -> 사용자 -> 사용자 추가 로 이동 합니다.


사용자 이름(계정명) 을 입력하고, AWS 액세스 유형을 선택을 하면 됩니다. AWS 관리 콘솔에 로그인을 해야하는 일반적인 계정 형태로 생성하려면 "암호 - AWS 관리 콘솔 액세스" 를 선택 하면 됩니다.

AWS CLI 이나 API, SDK 등을 통해 AWS 서비스를 사용하는 용도라면 "액세스 키 - 프로그래밍 방식 액세스" 를 선택해서 사용해도 됩니다.

포스팅에서는 프로그래밍 방식 액세스 를 선택하고 진행하였습니다.


권한 설정에 관한 내용으로 기존 그룹에 사용자를 추가하거나, 새로운 그룹을 만든 다음 계정을 추가(추가로 권한 설정) 할 수 있는 그룹 유형이 있으며, 기존의 사용자에서 권한을 복사하는 방식과 기존의 생성한 정책을 연결하여 사용하는 방식을 선택 할 수 있습니다.

계정에 대한 정책은 운영 방침에 따라 관리하려는 방식에 따라서 달라짐으로 사용하는 방식으로 선택 하시면 됩니다.

그룹을 생성하고 해당 그룹에 정책을 연결하고 동일한 목적의 계정 생성시 해당 그룹에 추가하는 형태로 사용할수도 있습니다.


포스팅에서는 일단 계정 생성시에는 기존에 생성한 정책을 연결하는 방식을 선택하여 진행하였습니다.


다음은 태그 추가 단계로 추가할 태그가 있다면 태그 추가 후 하단의 "다음: 검토" 를 선택 합니다.


사용자 생성 전에 검토 단계 입니다. 특이 사항이 없다면 하단의 "사용자 만들기" 를 선택 합니다.


사용자가 추가 되었으며, 액세스 키ID 와 비밀 액세스 키를 정보를 별도로 기록해 두거나 또는 ".csv 파일 다운" 을 선택해서 액세스 키 ID 와 비밀 액세스 키 정보가 담긴 파일을 다운로드 받아도 됩니다.

           

역할(Role) 생성

이전 단계에서 생성한 정책(Policy) 와 연결되는 역할을 생성하도록 하겠습니다.

IAM 대시보드 -> 역할 -> 역할 만들기 를 선택 합니다.


신뢰할 수 있는 엔터티 선택 에서 "AWS 서비스" 선택하고 그 다음 "EC2" 를 선택 후 하단의 "다음" 버튼을 클릭 합니다.


권한 추가에서는 이전 단계에서 생성한 정책(Policy) 를 선택후 하단의 "다음" 버튼을 클릭 합니다.


역할의 이름과 설명 을 입력하고 하단의 "역할 생성" 을 클릭 합니다.

         

EC2의 IAM 역할 설정

이번에는 EC2의 IAM 역할 설정을 진행하도록 하겠습니다

EC2 메뉴에서 인스턴스로 이동 합니다.
IAM 역할 설정할 인스턴스를 선택 -> 인스턴스 상태 -> 보안 -> IAM 역할 수정 을 선택 합니다.


IAM 역할 에서 이전 단계 에서 생성한 IAM 데이터베이스 역할을 선택 후에 하단의 "저장" 버튼을 클릭 합니다.

[참고] EC2의 역할 수정에 따른 인스턴스 재기동이 필요치 않으며 바로 적용 됩니다.
       

AWS IAM 데이터베이스 인증 사용

이제 IAM 인증을 통해서 RDS 를 접속하기 위해 사전의 준비가 모두 완료 되었습니다.

먼저 EC2에서 사용하는 부분에 대해서 확인 해보도록 하겠습니다
             

EC2

먼저 EC2 에서 접속하는 내용에 대해서 확인 해보도록 하겠습니다.

접속을 위한 인증 토큰을 얻는 것은 EC2 나 EC2가 아닌 리눅스 서버나 사용자 PC OS(맥, 리눅스 등) 에서 AWS CLI 를 사용하는 것과 사용 방법은 동일(유사) 합니다.

명령어 예시

aws rds generate-db-auth-token \
--hostname {접속주소} \
--region {리전명} \
--port {포트번호} \
--username {접속할 DB명}

위와 같이 명령어를 통해서 인증 토큰의 문자열은 매우 길어서 직접 수행 후 복사/붙여넣기 또는 직접 타이핑(입력) 보다는 변수에 입력을 받고, 패스워드의 입력도 변수로 입력하는 것이 사용 편리성에서 좋게 됩니다.

또한 계속 공통적으로 사용 되는 항목에 대해서는 변수로 선언해서 사용하는 것도 편리성에 좋을 것 같습니다.



인증 토큰 생성

export RDS_ENDPOINT=test-rds-1.cweacjg5pv9n.ap-northeast-2.rds.amazonaws.com
export RDS_DB_USER=user_batch
export RDS_PORT=3306
export DB_NAME=test_db

RDS_TOKEN="$(aws rds generate-db-auth-token \
--hostname $RDS_ENDPOINT \
--region ap-northeast-2 \
--port $RDS_PORT \
--username $RDS_DB_USER)"

[참고] ap-northeast-2 은 서울 리전 입니다.

환경변수를 선언하였고, 그 다음 aws rds generate-db-auth-token 명령어를 통해서 토큰을 생성하였습니다.

EC2 같은 경우 이전 단계에서 생성한 역할 과 EC2 간의 연결을 하였기 때문에 AWS CLI 를 사용하는데 있어서 별도의 사용자 Access Key ID 와 Secret access key 가 없이 AWS 서비스에 접속하여 인증 토큰을 생성할 수 있었습니다.

인증 토큰을 통해 RDS(MySQL) 접속은 아래와 같이 접속할  수 있습니다.


AWS IAM 인증을 통한 RDS 접속

export RDS_ENDPOINT=test-rds-1.cweacjg5pv9n.ap-northeast-2.rds.amazonaws.com
export RDS_DB_USER=user_batch
export RDS_PORT=3306
export DB_NAME=test_db


1)
mysql --no-defaults --host=$RDS_ENDPOINT \
--port=$RDS_PORT \
--enable-cleartext-plugin \
--user=$RDS_DB_USER \
--database=$DB_NAME \
--password=$RDS_TOKEN


2)
MYSQL_PWD=$RDS_TOKEN \
mysql --no-defaults --host=$RDS_ENDPOINT \
--port=$RDS_PORT \
--enable-cleartext-plugin \
--user=$RDS_DB_USER \
--database=$DB_NAME


3)
mysql --no-defaults --host=$RDS_ENDPOINT \
--port=$RDS_PORT \
--enable-cleartext-plugin \
--user=$RDS_DB_USER \
--database=$DB_NAME \
--password="$(aws rds generate-db-auth-token \
--hostname $RDS_ENDPOINT \
--region ap-northeast-2 \
--port $RDS_PORT \
--username $RDS_DB_USER)"

[중요] 인증 토큰 으로 접속 할 경우 "--enable-cleartext-plugin" 옵션을 반드시 사용해야 합니다.

위와 같은 3개의 유형으로 접속하여 사용할 수 있으며
1번과 3번은 유사한 형태로 3번에서는 위에서 진행한 인증 토큰을 생성하는 명령어를 접속 구문에서 직접 사용한 형태 입니다.

2번의 경우 MYSQL_PWD 라는 고유의 변수를 통해서 사용하는 형태 입니다.

1번의 유형이 가장 보통의 경우이며, 중요한점은 인증 토큰의 특수문자 등의 이유로 패스워드를 입력받는 구문 맨 마지막에 넣는 것이 에러를 발생하지 않고 실행하는 방법이 되게 됩니다.

위의 같은 내용을 기존의 스크립트에서 DB ID/PW 정보를 IAM 인증으로 대체하여 사용하시면 됩니다.
        

EC2 에서 실행되는 애플리케이션

AWS SDK for Java를 사용하여 RDS for MariaDB, MySQL 또는 PostgreSQL DB 인스턴스에 연결할 수 있습니다.

자세한 사항은 아래 내용을 참조하시면 됩니다.

         

사용자가 RDS에 접속

사용자 또는 개발자도 RDS 접속시 위와 같이 IAM 데이터베이스 인증으로 로그인 할 수 있습니다.
AWS CLI 를 통해서 진행되는 것은 동일합니다 
       

AWS CLI

EC2에서 AWS CLI 를 사용해서 인증 토큰을 생성 과는 다르게 먼저 AWS 서비스 로그인(인증)이 필요 합니다.

AWS CLI Profile 을 사용하기 위해서 디렉토리와 파일을 먼저 생성 하도록 하겠습니다.
테스트 PC 환경은 우분투 20.04 이며, 사용법은 OS 마다 유사합니다 


디렉토리 와 파일생성

## 디렉토리 생성
mkdir -p ~/.aws/


## 파일 생성 후 아래 내용으로 입력
vi ~/.aws/config

[profile iam_rds]
region = ap-northeast-2

Profile 명은 iam_rds 가 되며, 위의 예제에서는 한국 리전(ap-northeast-2) 를 선택하는 내용 입니다.


aws configure 실행

aws configure --profile iam_rds

AWS Access Key ID [None]: {Access ID Key 입력}
AWS Secret Access Key [None]: {Secret Access Key 입력}
Default region name [ap-northeast-2]: {엔터입력}
Default output format [None]: {엔터입력}

aws configure 실행시 이전에 생성한 IAM 계정의 Access ID Key 와 Secret Access Key 를 입력 합니다.


인증 토큰 생성

## 환경 변수
export RDS_ENDPOINT=test-rds-1.cweacjg5pv9n.ap-northeast-2.rds.amazonaws.com
export RDS_DB_USER=user_dev
export RDS_PORT=3306
export DB_NAME=test_db


## 인증 토큰 생성
RDS_TOKEN="$(aws --profile iam_rds rds generate-db-auth-token \
--hostname $RDS_ENDPOINT \
--region ap-northeast-2 \
--port $RDS_PORT \
--username $RDS_DB_USER)"


## 토큰 생성 여부 및 값 확인
echo $RDS_TOKEN
...DBUser=user_dev&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKI....

[참고] 생성된 토큰의 정상 유무는 문자열에서 "X-Amz-Algorithm=AWS4-HMAC-SHA256" 을 확인 하시면 됩니다.
해당 내용은 AWS Signature Version 4 을 의미하게 되며, 자세한 내용은 아래 링크를 참조해 보시면 됩니다.



이와 같이 EC2 가 아닌 환경에서도 IAM 인증을 통한 RDS 접속을 사용할 수 있습니다.
하지만 이렇게 AWS CLI 를 통해서 사용하는 부분에 대해서는 한가지 고려해야 할 부분이 있습니다.
고려해야할 내용은 위에서 입력한 인증정보가 credentials 파일에 그대로 남아 있기 때문 입니다.

## 파일 확인
cd ~/.aws

ls -al
-rw-rw-r--  1 jade jade   42  3월 22 09:53 config
-rw-------  1 jade jade  116  3월 22 09:53 credentials <--!!


## 파일 내용 확인
cat credentials

[iam_rds]
aws_access_key_id = AKIA.....  <--!!
aws_secret_access_key = TDJN.... <--!!

그래서 다음에 소개하는 aws-vault 도구에 대해서 내용을 이어서 확인을 하시면 될것 같습니다.
         

aws-vault

aws-vault99designs 에서 개발한 AWS 인증 정보를 안전하게 보관하도록 도와주는 도구입니다.

AWS CLI 나 관련 도구를 사용하는 경우 IAM 사용자의 AWS Access Key ID와 AWS Secret Access Key 가 필요하게 되며, AWS CLI의 경우 ~/.aws/credentials 에 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 환경변수에서 저장된 값들을 읽어와 사용하게 됩니다.

즉, 이 정보를 사용하면 IAM 사용자에게 부여된 모든 권한에 접근 가능하다는 의미가 되게 됩니다.


aws-vault 를 사용하면 각 OS 별로 사용 가능한 키 관리 라이브러리를 통해서 인증 정보를 안전하게 저장하게 됩니다.


지원하는 키 관리 라이브러리(백엔드)

- macOS Keychain
- Windows Credential Manager
- Secret Service (Gnome Keyring, KWallet)
- KWallet
- Pass
- Encrypted file

키를 사용할 때도 사용자 키를 직접 사용하지 않고 STS를 경유해 임시 세션 키를 발급 받아 사용하게 됩니다. 그래서 AWS CLI 를 그대로 사용하기 보다는 aws-vault 와 같이 사용하는 것이 보안상 더 안전하기 때문에 사용하는 것을 권장 드립니다


aws-vault 지원 OS

MacOS , Windows, Linux , FreeBSD, Nix, asdf-vm 를 지원하며 자세한 내용은 아래 링크를 참고하시면 됩니다.

• 최신 릴리즈 버전 다운로드 페이지 : 링크

aws cli 와 aws-vault 에 대한 더 자세한 내용은 아래 내용을 참고해보시면 좋습니다.



aws-vault 설치

설치는 아래와 같이 github 에서 다운로드 받아서 사용을 하시면 됩니다.
테스트 PC 환경은 우분투 20.04 이며, 사용법은 OS 마다 유사합니다

## 파일 다운로드
sudo curl -L https://github.com/99designs/aws-vault/releases/download/v6.6.0/aws-vault-linux-amd64 -o /usr/local/bin/aws-vault


## 퍼미션 번경
sudo chmod 755 /usr/local/bin/aws-vault


## 버전 확인
aws-vault --version
v6.6.0

aws-vault 를 사용해도 aws cli 도 필요하며 설치 방법은 위에서 기술하였기 때문에 여기서는 생략 하겠습니다.
aws cli 설치는 여기 를 참조 하시면 됩니다


aws-vault 를 사용할 때 백엔드(키 관리 라이브러리) 를 선택 해야 합니다.
각 OS 마다 키 관리 라이브러리가 기본적으로 사용을 하게 됩니다.

보통의 Gnome-Desktop 환경의 리눅스에서는 기본적으로 Gnome Keyring 이 사용됩니다.

예를 들어 EC2가 아니지만 GUI 모드가 아니거나 GUI 환경이 아닌 SSH 접속의 서버 리눅스에서는 Pass(the standard unix password manager) 를 이용하거나 암호 파일을 사용 하시면 됩니다.


위에서 aws cli 에서도 profile 을 사용하기 위해서 ~/.aws/config 파일에 간략하게 profile 내용을 입력 하였고, 해당 profile 명으로 aws-vault 를 사용하도록 하겠습니다.


aws-vault 등록

aws-vault 에 인증 정보를 입력은 아래와 같이 진행할 수 있습니다.

명령어 예시)

aws-vault add Profile명

또는 

aws-vault --backend={keyring_system} add Profile명


실행하게 되면 아래 이미지 와 같이 Secret Access key 정보 입력 후 Gnome-Keyring 이 호출 되면서 인증 정보를 보호하는 암호 생성을 입력을 기다리게 됩니다.
패스워드를 입력하고(2번) 계속을 누르면 인증정보가 Keyring 에 저장되게 됩니다.


aws-vault 을 활용한 aws cli 사용법은 aws cli 명령어 앞에 "aws-vault exec Profile명 --" 을 붙여서 실행 하면 됩니다.

export RDS_ENDPOINT=test-rds-1.cweacjg5pv9n.ap-northeast-2.rds.amazonaws.com
export RDS_DB_USER=user_dev
export RDS_PORT=3306
export DB_NAME=test_db

RDS_TOKEN="$(aws-vault exec iam_rds -- \
aws rds generate-db-auth-token \
--hostname $RDS_ENDPOINT \
--region ap-northeast-2 \
--port $RDS_PORT \
--username $RDS_DB_USER)"


특별히 문제가 없다면  아래와 같이 MySQL 에 접속하면 됩니다.

mysql --no-defaults --host=$RDS_ENDPOINT \
--port=$RDS_PORT \
--enable-cleartext-plugin \
--user=$RDS_DB_USER \
--database=$DB_NAME \
--password=$RDS_TOKEN

[중요] 인증 토큰 으로 접속 할 경우 "--enable-cleartext-plugin" 옵션을 반드시 사용해야 합니다.


MySQL Workbench 에서 사용

GUI 툴인 MySQL Workbench 에서도 IAM 인증 토큰을 사용하여 RDS에 접속 할 수 있습니다.

먼저 사용의 편리성을 위해서 MacOS 에서 많이 사용하는 클립보드 유틸리티인 pbcopy 와 유사한 기능을 가진 리눅스의 xclip 패키지를 설치 하도록 하겠습니다.

패키지 설치 및 alias 등록

## 패키지 설치
sudo apt install xclip


## alias 등록
alias pbcopy='xclip -selection clipboard -r'


xclip 을 사용해서 다시 한번 인증 토큰을 생성하겠습니다

aws-vault exec iam_rds -- \
aws rds generate-db-auth-token \
--hostname $RDS_ENDPOINT \
--region ap-northeast-2 \
--port $RDS_PORT \
--username $RDS_DB_USER | pbcopy

## | pbcopy 을 통해서 클립보드로 복사합니다.

[참고] xclip 은 GUI 데스크탑 환경에서 사용가능 합니다. CUI 모드(이전의 runlevel 3) 나 ssh 로 접속 할 경우 사용이 불가 합니다.

ssh 등으로 접속한 상태에서 사용하려면 x-manager 나 오픈소스 Xserver 프로그램인 VcXsrv, Xming 등으로 Xserver Forwarding 환경이라면 사용이 가능할수도 있습니다.


Connection 생성

Workbench 를 실행 후 + 버튼을 눌러서 신규 접속 세션을 생성 해보도록 하겠습니다.

Connection Name 를 입력 하고, Hostname 에는 RDS 엔드포인트 주소(접속주소) , Username 에는 RDS 인증으로 생성한 DB 계정을 입력 합니다.
입력이 완료 되었다면 Advanced 탭으로 이동 합니다.


Advanced 탭에서 "Enable Cleartext Authentication plugin" 옵션에 체크를 합니다.
그리고 하단의 "Test Connection" 을 선택 합니다


패스워드을 입력하고 "Save password in keychain" 을 선택 하고 OK 버튼을 클릭 합니다.


정상적으로 접속이 가능하다면 아래와 같은 메세지를 볼수 있게 됩니다.



정상적으로 사용이 가능한 것을 확인 하였다면 aws cli 에 의해 생성된 "credentials" 파일은 삭제를 진행 하도록 하겠습니다.

rm ~/.aws/credentials



GUI 가 안되는 환경에서 Encrypted file 방식으로 하고자 할때는 아래와 같이 실행하시면 됩니다.

export AWS_VAULT_BACKEND=file


## aws-vault 로 등록
aws-vault add iam_rds

Enter Access Key ID: {액세스 키 입력}
Enter Secret Access Key: {Secret Key 입력}
Enter passphrase to unlock "/root/.awsvault/keys/": <-!! 인증 정보의 Unlock 수행시 필요한 패스워드
Added credentials to profile "iam_rds" in vault

Encrypted file 방식은 등록할 때 다른 키링과 동일(유사) 하게 키링 관리의 패스워드를 입력을 받게 됩니다.
("/root/.awsvault/keys/": )

그리고 인증 토큰 생성시 마다 Unlock 패스워드의 입력을 요구 받습니다.

Unlock 패스워드를 입력을 하지 않고 엔터를 눌러도 진행은 됩니다 다만 인증 토큰 생성시 마다 엔터는 입력 하긴 해야 합니다.

Unlock 패스워드를 사용하지 않으려면 Unlock 패스워드 입력 대기시에 패스워드를 입력하지 않고 엔터를 입력하여 생성 후에 아래와 같은 환경 변수를 먼저 선언 하고 사용하면 인증 토큰 생성시 엔터도 입력하지 않아도 되게 됩니다.

export AWS_VAULT_FILE_PASSPHRASE=


EC2 는 아니지만 온프레미스의 일반 리눅스 서버에서 aws-vault 에서 backend 방식을 Encrypted file 으로 사용하여 crontab 이나 스케줄러 등으로 AWS RDS 로 접속해서 작업을 해야 할 경우 위에서 언급한 환경변수를 선언하고 진행하면 백그라운드로 스크립트 사용 할 수 있게 됩니다.

export AWS_VAULT_BACKEND=file
export AWS_VAULT_FILE_PASSPHRASE=


이번 포스팅에서는 AWS IAM 인증을 통해 RDS 접속에 대한 내용을 확인 해 보았으며, 포스팅은 여기에서 마무리 하겠습니다.
     

Reference

Reference Link
amazon.com/users-connect-rds-iam
amazon.com/Connecting.AWSCLI
amazon.com/UsingWithRDS.SSL
amazon.com/IAMDBAuth.IAMPolicy
amazon.com/UsingWithRDS.IAMDBAuth
amazon.com/UsingWithRDS.IAM
amazon.com/rds-iam-least-privileges
amazon.com/IAMDBAuth.Connecting
amazon.com/role-to-an-existing-ec2-instance
amazon.com/IAMDBAuth.Connecting.Java
amazon.com/aws-arns-and-namespaces
amazon.com/id_roles_use_switch-role-ec2
amazon.com/UsingWithRDS.IAMDBAuth
amazon.com/sigv4-query-string-auth

github.com/99designs/aws-vault
44bits.io/credentials-with-aws-vault


연관된 다른 글

 

 

 

         

2
0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x