[권고] RDS 접속 시 IAM 인증 활용

ZER0·2022년 9월 24일
1

AWS 보안 설정 가이드

목록 보기
33/47
post-custom-banner

1. 개요

  • RDS 접속 시 ID•Password로 인증을 수행하는 경우 인증 정보를 PC 또는 소스코드에 저장하여 외부 유출 및 탈취의 위험이 존재
  • 따라서 임시 토큰을 활용한 IAM 인증을 통해 RDS 접속 필요

2. 취약점 판단 기준

  • RDS 접속 시 ID•Password 인증을 수행하는 경우 취약
  • RDS 접속 시 IAM 인증을 수행하는 경우 취약하지 않음

3. 취약점 확인 방법

  • 관리 콘솔에서 [RDS] 검색 → RDS 선택 → [수정] 클릭
  • [데이터베이스 인증] 메뉴에서 [암호 및 IAM 데이터베이스 인증] 체크 여부 확인

4. 취약점 조치 방법

  • [데이터베이스 인증] 메뉴에서 [암호 및 IAM 데이터베이스 인증] 체크
  • RDS 접속 후 Command(1)를 활용해 IAM 인증을 통해 접속할 DB 계정 생성
    • Command(1)
      CREATE USER [계정명] IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';
      GRANT [권한] TABLES ON [db명].* TO [계정명];
      
      # 예시
      CREATE USER tmp_iam_conn_test IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';
      GRANT SELECT TABLES ON test.* TO tmp_iam_conn_test;
      
      # 모든 권한을 부여하고자 하는 경우 아래 명령어 사용 
      GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER TABLES ON [db명].* TO [계정명];
  • JSON(1)을 활용해 IAM 인증을 통해 RDS에 접속 가능한 정책 생성
    • JSON(1)
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "rds-db:connect"
                  ],
                  "Resource": [
                      "arn:aws:rds-db:[리전]:[계정ID]:dbuser:[RDS 리소스ID]/[계정명]"
                  ]
              }
          ]
      }
      
      # 예시
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "rds-db:connect"
                  ],
                  "Resource": [
                      "arn:aws:rds-db:ap-northeast-2:123456789012:dbuser:db-QPUA7ZC5DG93NQLBU5NCX6XXZZ/tmp_iam_conn_test"
                  ]
              }
          ]
      }
  • 생성한 정책을 할당하기 위한 역할 생성
  • 생성한 역할에 정책 할당
  • 생성한 역할을 EC2 인스턴스에 부여
  • EC2 인스턴스에서 Command(2)를 활용해 인증 토큰을 전달할 때 사용할 인증서 다운
    • Command(2)
      sudo mkdir -p /var/mysql-certs/
      cd /var/mysql-certs/
      sudo curl -O https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
  • EC2 인스턴스에서 Command(3)을 활용해 토큰 발급
    • Command(3)
      TOKEN="$(aws rds generate-db-auth-token --hostname [RDS 엔드포인트] --port 3306 --username [계정명])"
      
      # 예시
      TOKEN="$(aws rds generate-db-auth-token --hostname tmp-iam-conn-test-db.cgxnhqxrcq8b.ap-northeast-2.rds.amazonaws.com --port 3306 --username tmp_iam_conn_test)"
  • EC2 인스턴스에서 Command(4)를 활용해 RDS 접속
    • Command(4)
      mysql --host=[RDS 엔드포인트] \
            --port=3306 \
            --user=[계정명] \
            --ssl-ca=/var/mysql-certs/rds-combined-ca-bundle.pem \
            --enable-cleartext-plugin \
            --password="$TOKEN"
      
      # 예시
      mysql --host=tmp-iam-conn-test-db.cgxnhqxrcq8b.ap-northeast-2.rds.amazonaws.com \
            --port=3306 \
            --user=tmp_iam_conn_test \
            --ssl-ca=/var/mysql-certs/rds-combined-ca-bundle.pem \
            --enable-cleartext-plugin \
            --password="$TOKEN"
  • IAM 토큰을 활용해 RDS 접속 후 정상 접속 여부 및 허용된 권한 이외의 명령어 차단 확인

5. 참고

profile
Security Compliance Engineer
post-custom-banner

0개의 댓글