Dev&Ops/DevOps

[Infra] Springboot에 AWS Secrets Manager 적용해보기(1)

zeroneCoder 2022. 9. 18. 17:15

안녕하세요! zerone-code입니다.

 

이번 글에서는 AWS의 Secrets Manager를 이용해서 Springboot의 db와 관련된 값이나 토큰 값과 같은 노출되서는 안될 값들에 적용해 어플리케이션의 보안 측면을 조금 더 높일 수 있는 방법을 소개해보려고 합니다.

 

이미 많은 개발자 분들이 도입하고 사용하고 있지만, 왜 사용하지라는 의문을 가진 개발자 분들이나 아직 도입하지 않은 개발자 분들이 이 글을 보시고 꼭 도입해보셨으면 좋겠습니다.

 

1부에서는 왜 도입하는지, 어떻게 사용되는지에 대한 내용이고 2부에서는 Terraform과 springboot의 application.yml에 적용해보도록 하겠습니다.

 

궁금한 부분은 댓글로 남겨주시면 아는 만큼 성심성의껏 답변해드리도록 하겠습니다.

잘 읽으셨다면 많은 공감과 구독 부탁드립니다!


1. AWS Secrets Manager란?

먼저 Secret Values란 token 값이나 password와 같이 노출되서는 안되는 보안적인 요소가 들어가 있는 값입니다. 이 값들이 노출된다면 해킹의 위험이 있을 수 있습니다.

 

Secret Values을 관리하기 위해서는 다음과 같은 3가지 원칙이 있습니다.

  1. Secret Values는 VCS에 업로드되면 안 된다.
  2. Secret Values는 최소한의 인원만 알고 있어야 한다. 
  3. Secret Values와 Secret Values가 아닌 값은 분리해서 관리해야 한다. 

위 3가지 원칙을 AWS에서 동작하는 서비스에 적용하면 KMS 혹은 SecretsManager를 통해 Secret Values를 관리할 수 있습니다.

 

AWS Secrets Manager는 AWS에서 제공하는 Secret Values를 관리하기 위한 서비스입니다. Secret Values를 저장해두고 어플리케이션에서 AWS의 API를 호출해서 받아가 사용하는 방식됩니다. 

 

아래 그림과 같이 Key Management Service(이하 KMS)를 통해 Secret Values는 암호화됩니다. 그리고 KMS Decrypt 권한이 있는 IAM을 가지고 있는 어플리케이션 혹은 Lambda 같은 서비스에서 이를 접근해서 사용할 수 있게 됩니다.

 

Secrets Values의 형태는 key = value의 형태로 구성됩니다.

 

출처 : https://aws.amazon.com/ko/secrets-manager/

2. AWS Secrets Manager를 왜 적용해야할까?

AWS Secrets Manager를 과연 왜 적용해야할까요? 로컬에서 작성한 application.yml을 그대로 사용해선 안될까요?

두가지의 가정을 해보도록 하겠습니다.

  1. Spring Boot에서 어딘가에 구축된 DB에 접근한다.
  2. 그리고 Spring Boot 소스코드를 git과 같은 VCS(Version Control System)를 사용한다.

요즘 대부분의 경우 위와 같은 가정이 적용될 것이라고 생각됩니다. 만약 저 가정대로라면 application.yml이나 properites에 접근할 DB주소나 username, password가 들어가게 될 것이고 이를 별도로 처리해주지 않는다면 VCS에 해당하는 레포지토리에 그대로 올라가게 될 것입니다. 

 

만약 repository가 노출되거나 어플리케이션에 관한 설정을 어디선가 볼 수 있게 되면 어떻게 될까요? 그리고 최악의 경우, 운영 환경에 배포되는 서비스의 정보가 들어가있다면 어떻게 될까요?

이는 정말 심각한 보안정보가 유출된 경우가 됩니다. 따라서 이런 보안 정보의 유출을 막기 위해 AWS Secrets Manager를 통해 민감한 정보를 암호화하여 보관하고 어플리케이션이 동작할 때는 이 정보를 복호화하여 사용합니다.

 

3. AWS Secrets Manager를 어떻게 적용할까?

어플리케이션에 AWS Secrets Manager를 적용하기 위해서는 Infra Layer에서 해줘야 하는 부분코드에서 해줘야하는 부분으로 나눠볼 수 있습니다.

 

먼저 Infra Layer에서 해줘야할 것들을 정리해보겠습니다.

  1. 암호화에 사용할 KMS key 생성하기
  2. application에서 사용할 IAM에 사용할 KMS key에 대한 kms:decrypt 권한 추가
  3. KMS key에 사용할 IAM 에 대해 allow 
  4. Secrets Manager에 생성한 KMS로 키로 데이터 암호화하기

위 4가지를 해주면 Infra Layer에서는 준비가 완료되었습니다.

 

그 다음은 코드에서 적용해줘야할 부분을 정리해보겠습니다.

  1. build.gradle 혹은 pom.xml에 AWS secrets Manager 디펜던시 추가
  2. application.yml 혹은 properties에 AWS region과 Secrets Manager의 이름 지정하기
  3. application.yml에 암호화된 정보를 사용할 부분에 ${key_name}으로 변경해주기

코드에서는 다음과 같은 3가지를 적용하게 된다면 Github과 같은 VCS에 민감한 정보는 노출되지 않고, AWS에서 암호화된 민감한 정보를 복호화하여 사용할 수 있게 됩니다.

 

이로써 AWS Secrets Manager가 무엇이고, 왜 적용해야하는지, 그리고 어떻게 적용하는지에 대해 알아봤습니다. 

이만 1부는 이만 마무리하도록 하겠습니다.

 

2부에서는 Terraform과 springboot의 application.yml에 적용해보도록 하겠습니다.

 

궁금한 부분은 댓글로 남겨주시면 아는 만큼 성심성의껏 답변해드리도록 하겠습니다.

잘 읽으셨다면 많은 공감과 구독 부탁드립니다!

Reference

1. AWS Secrets Manager 공식 문서

https://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/intro.html

 

AWS Secrets Manager란 무엇입니까? - AWS Secrets Manager

AWS Secrets Manager란 무엇입니까? 과거에는 데이터베이스에서 정보를 검색하는 사용자 지정 애플리케이션을 생성하면 일반적으로 데이터베이스에 액세스하기 위한 자격 증명(보안 암호)을 애플리

docs.aws.amazon.com

2. AWS Secrets Manager의 AWS KMS 활용 방식

https://docs.aws.amazon.com/ko_kr/kms/latest/developerguide/services-secrets-manager.html

 

AWS Secrets Manager의 AWS KMS 활용 방식 - AWS Key Management Service

AWS Secrets Manager의 AWS KMS 활용 방식 AWS Secrets Manager는 암호를 암호화 및 저장하고 투명하게 해독한 다음 일반 텍스트로 반환하는 AWS 서비스입니다. 이 서비스는 애플리케이션에서 일반 텍스트로

docs.aws.amazon.com