안녕하세요 서후아빠입니다. ^_^
이번 세션은 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 구성요소 생성하기
1단계 : RDS 생성
RDS 생성에 대한 설명은 생략합니다.
2022.08.08 - [Database] - [실습] RDS 생성하기 (MySQL)
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시에 변경이 이루어졌는지 확인도 하시기 바랍니다. |
'Security' 카테고리의 다른 글
[실습] Amazon GuardDuty 실습하기 (EventBridge, SNS, CloudWatch 구성) (0) | 2022.08.18 |
---|---|
[이론] Amazon GuardDuty 기본 개념 (0) | 2022.08.16 |
[이론] AWS Secrets Manager 기본 개념 (0) | 2022.08.08 |
[실습] AWS WAF 구성하기 (0) | 2022.08.05 |
[이론] AWS WAF 기본 개념 (0) | 2022.08.04 |