본문 바로가기

Security

[실습] AWS Secrets Manager 실습하기 (Lambda를 이용한 RDS 비밀번호 자동 변경)

반응형

안녕하세요 서후아빠입니다. ^_^

이번 세션은 AWS Secrets Manager를 이용하여 RDS(MySQL) Password를 변경하는 실습을 해보겠습니다. 

그리고, Application에서 Secrets Manager 호출하는 실습도 해봐야하는데요. 인프라 엔지니어의 지식의 한계가 있어서 이번 세션에서는 진행하지 못할 것 같습니다. 아시는 분 댓글에 링크 주시면 너무 고마울 것 같습니다. 


구성도

Lambda(SecretsManagerlambdaA)의 위치는 Public subnet에 위치하지 않아도 됩니다. 편의상 저 위치에 배치한 것입니다.

사전 작업

인프라 생성 : vpc, subnet, igw, routing table, ec2 등은 설명 생략합니다. 

2022.07.02 - [Networking] - [실습] Amazon VPC 구성요소 생성하기

 

[실습] Amazon VPC 구성요소 생성하기

안녕하세요 서후아빠입니다. ^_^ 이번 세션은 VPC 관련 구성요소에 대해서 실습을 해보겠습니다. 구성도 1단계 : VPC 생성 VPC > Your VPCs > Create VPC 구분 VPC settings (VPC Only 방식) VPC settings (VPC a..

sh-t.tistory.com

1단계 : RDS 생성

RDS 생성에 대한 설명은 생략합니다.

2022.08.08 - [Database] - [실습] RDS 생성하기 (MySQL)

 

[실습] RDS 생성하기 (MySQL)

안녕하세요 서후아빠입니다. ^_^ 이번 세션은 Amazon RDS를 생성하는 실습을 해보겠습니다. 애플리케이션에서 RDS로 연결하는 과정은 생략하였습니다. 구성도 사전 작업 인프라 생성 : vpc, subnet, igw,

sh-t.tistory.com

2단계 : Secrets 생성

AWS Secrets Manager > Secrets > Store a new secret

Choose secret type Configure secret Configure rotation(옵션)
Secret type : Credentials for Amazon RDS database
Credentials User name : admin
Credentials Password : Passwd123$%^
Encryption key : aws/secretsmanager
Database : mysqlA
Secret name : mysqlA-secret
Resource permissions(옵션) : -
Replicate secret(옵션) : -
Automatic rotation : Enable
Rotation schedule : Schedule expression (or Schedule expression builder)
Schedule e3xpresiion : cron(0 13 ? * * *)
Window duration : 1h
Rotate immediately … : check
Rotation function : Create a rotation function (or Use a rotation function from your account)
SecretsManager : lambdaA
Use separate credentials to rotate this secret : No
Secret type
  - Credentials for Amazon RDS database
  - Credentials for Amazon  DocumentDB database
  - Credentials for Amazon Redshift cluster
  - Credentials for other database
  - Other type of secret (API key, OAuth token, other)
Secret name은 일반적으로 환경/애플리케이션(ex : prod/app/web) 형식으로 사용합니다.
Replicate secret : 비밀값을 다른 리전에 복제(Replicate secret to other Regions)하는 기능입니다.
cron표현식 : cron(0 13 ? * * *)은 매일 13시마다 실행한다는 의미입니다.
Rotation function : CloudFormation 이용하여 필요한 Resources(ex : IAM role, lambda 등)를 자동 생성하게 됩니다.

3단계 : 보안그룹(SG) 생성

EC2 > Security Groups > Create security group  

Security group name Description VPC Rules Type Protocol Port range Source
RDSInstanceSG - vpcA Inbound MySQL - - Custom, 10.0.0.0/16
LambdaFunctionSG - vpcA - - - -  
SMVPCEndpointSG - vpcA Inbound HTTPS - - Custom, 10.0.0.0/16
기본 outbound 모두 허용은 그대로 유지합니다.
RDS는 기본 보안그룹을 사용하지 말고 신규로 생성한 보안그룹으로 변경해야 한다고 가이드에 나와 있습니다.

4단계 : RDS의 보안 그룹 변경 : 기본 보안 그룹 사용하지 않도록 변경

Amazon RDS > Databases > mysqlA > Modify > Security group (RDSInstanceSG) > Continue > Scheduling of modifications (Apply immediately) > Modify DB instance

서비스 중일 경우 즉시 적용(Apply immediately)은 주의가 필요합니다. 서비스 영향도 확인 후 진행하시기 바랍니다.

5단계 : Lambda의 보안 그룹 변경

AWS Lambda > Functions > SecretsManagerlambdaA > Configuration (tab) VPC에 Edit > Subnets (10.0.2.0/24), Security groups (LambdaFunctionSG) > Save

Lambda의 위치는 크게 관계없습니다. 원하는 위치에 생성하시기 바랍니다. Lambda는 Function뿐만 아니라 Application도 함께 생성이 됩니다.

6단계 : Secrets Manager 서비스에 대한 VPC endpoint 생성

VPC > Endpoints > Create endpoint 

Name tag Service category Services VPC Subnets Security groups
sm-ep AWS services com.amazonaws.ap-northeast-2.secretsmanager vpcA priA-sn-1, priA-sn-2 SMVPCEndpointSG
Secrets Manager는 Private subnet(ex : priA-sn-1, priA-sn-2)에서 실행되는 AWS 서비스(ex : priA-rds-1)에 대한 액세스 권한이 없기 때문에 Password 변경 불가능합니다. 때문에 필수적으로 Endpoint를 생성해야 합니다. 이 부분 때문에 한참을 헤매었습니다. 
Services는 Region에 주의하여 선택하시기 바랍니다.
Subnets는 1개를 선택해도 되지만, 2개를 선택한 이유는 1개의 AZ가 장애가 생기더라도 가용성을 보장하기 위함입니다.

7단계 : Password 변경 테스트

AWS Secrets Manager > Secrets > mysqlA-secret > Rotation configuration에서 Rotate secret immediately > Rotate > 상단에 “Secret scheduled for rotation.” 출력
AWS Secrets Manager > Secrets > mysqlA-secret > Secret value에서 Retrieve secret value > 변경된 password 확인

cron설정을 하였기 때문에 다음날 13시에 변경이 이루어졌는지 확인도 하시기 바랍니다.
반응형