[DEV] 기록

[SpringBoot] RDS 자격 증명 AWS Secrets Manager 적용

꾸준함. 2024. 7. 30. 10:57

서론

고객의 보안 정책에 따라 주기적으로 데이터베이스(DB) 계정 비밀번호를 변경해야 합니다.

그러나 현재 시스템에서는 비밀번호를 변경할 때마다 서버를 재기동해야 하며, MSA 서비스 특성상 관리해야 하는 DB가 여러 개입니다.

이러한 불편함을 해결하기 위해 모든 DB의 자격 증명을 AWS Secrets Manager로 관리하고, 서버 재기동 없이 적용하고자 하는 요구사항이 생겼습니다.

 

프로젝트 환경

  • SpringBoot 2.6.3 + Maven
  • RDS (MariaDB 10.11.0 버전)
  • Secrets Manager
  • IAM
  • AWS CLI

 

1. RDS 생성 및 설정

연동 테스트를 위해 프리티어 RDS를 생성하고 자격 증명 관리를 AWS Secrets Manager로 관리하도록 설정하겠습니다.

단순 테스트 용도이기 때문에 외부에서도 접속할 수 있도록 퍼블릭 액세스를 허용해 줍니다.

나머지 설정은 일단 default 값으로 설정했습니다.

 

 

AWS의 기본 정책은 모든 인바운드(Inbound) 트래픽을 차단하고 모든 아웃바운드(Outbound) 트래픽을 허용하는 것입니다.

이에 따라 '네트워크 및 보안' > '보안 그룹' 메뉴에서 다음과 같이 인바운드 규칙을 생성한 뒤 RDS 보안 그룹 규칙에 추가해 줍니다.

지금은 테스트 용도이기 때문에 모든 IPv4와 IPv6를 허용하지만 개발망, 상용망에서는 사내 보안 정책에 의거하여 설정하셔야 합니다!

 

 

RDS를 처음 생성하면 default character_set_* 인코딩 설정들이 모두 latin일 것입니다.

통상적으로 우리나라에서 서빙되는 서비스들은 한글 데이터를 저장할 수 있어야 하므로 character_set_* 인코딩을 utf8mb4로 변경해줘야 합니다.

Amazon RDS 사용자 지정 파라미터 그룹을 생성하고 '파라미터 필터링'에 character_set 검색 후 모든 값을 utf8mb4로 변경해 줍니다.

그리고 해당 파라미터 그룹을 DB 인스턴스 파라미터 그룹으로 지정해 줍니다.

 

 

2. AWS Secrets Manager 확인 및 추가 생성

RDS 자격 증명 관리를 AWS Secrets Manager로 관리하도록 설정했으므로 RDS 구성 > 마스터 보안 인증 ARN > Secrets Manager에서 관리 링크를 누르면 설정된 AWS Secrets Manager를 확인할 수 있습니다.

 

 

Secrets Manager 보안 암호 값에 명시된 username, password를 기반으로 DB 연결이 정상적으로 맺어지는 것을 확인할 수 있습니다.

 

 

여태까지 확인한 보안 암호는 root 계정에 대한 보안 암호이고 새로운 user를 추가할 경우 새 보안 암호를 설정해야 합니다.

계정 비밀번호를 주기적으로 변경해야 하고 이를 자동화하고 싶다면 자동 교체 구성 옵션을 활성화하면 됩니다.

 

 

3. IAM 설정 및 AWS CLI를 이용해 IAM 등록

IAM 사용자를 생성한 뒤 해당 사용자에게 Secrets manager의 자격 증명 정보를 가져올 수 있도록 설정해야 RDS 연동을 정상적으로 수행할 수 있습니다.

 

 

IAM 생성을 완료한 뒤 로컬 터미널 환경에서 AWS CLI를 이용해 앞서 생성한 IAM 사용자의 액세스 키와 시크릿 키를 등록합니다.

 

 

4. SpringBoot와 RDS 연동

여기까지 오셨다면 인프라 관련 작업은 끝났습니다.

이제 SpringBoot application.yml 파일만 수정하면 연동이 완료됩니다.

우선, AWS Secrets Manager JDBC Driver 사용을 위해 다음 라이브러리를 pom.xml에 추가해 줍니다.

 

<dependency>
    <groupId>com.amazonaws.secretsmanager</groupId>
    <artifactId>aws-secretsmanager-jdbc</artifactId>
    <version>1.0.5</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-secretsmanager -->
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-secretsmanager</artifactId>
    <version>1.12.715</version>
</dependency>

 

이후 application.properties 혹은 application.yml에 다음 내용을 추가해 줍니다.


 

4.1 spring.datasource.password를 명시하지 않아도 되는 이유

이는 AWS Secrets Manager JDBC Driver가 제공하는 기능 덕분에 가능합니다.

spring.datasource.url이 jdbc-secretsmanager 스키마를 사용하고 있기 때문에 AWS Secrets Manager에서 자격 증명을 검색하여 사용합니다.

AWS Secrets Manager JDBC 드라이버는 설정된 username을 통해 AWS Secrets Manager에서 자격 증명을 자동으로 검색하기 때문에 애플리케이션 코드나 설정 파일에 비밀번호를 명시할 필요가 없습니다.

따라서 보안 정책에 따라 비밀번호를 주기적으로 변경하더라도 애플리케이션을 재기동할 필요가 없습니다.

 

4.2 enabledTLSProtocols=TLSv1.2 옵션을 추가한 이유

저 같은 경우 해당 옵션을 추가하지 않았을 경우 다음과 같은 에러가 발생했습니다.

 

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. 
The driver has not received any packets from the server.

 

4.3 unicode와 characterSet 옵션을 추가한 이유

한글 데이터를 저장할 수 있어야 하기 때문에 추가했습니다.

 

참고

https://southouse.tistory.com/m/8

 

AWS Secrets Manager로 애플리케이션에서 RDS 자격증명 정보 보안하기

보통 AWS를 처음 시작하게 되면 EC2와 관련된 컴퓨팅 리소스를 많이 사용하게 되고, 그 다음으로는 RDS인 것 같다. 그리고 개발자들은 소스 코드의 설정 파일에 RDS 접속 정보를 넣어서 연결하게 된

southouse.tistory.com

https://www.megazone.com/awstechblog_230224/

 

[경영진과의 대화] Campfire Interactive의 Pradeep Seneviratne 대표를 만나다

[AWS TECH BLOG] AWS Secrets Manager를 사용하여 Amazon RDS 마스터 데이터베이스 자격 증명 보안 향상하기 작성일: 2023-02-24

www.megazone.com

반응형