어떻게 보면 당연한 관습들을 풀어서 글로 남겼습니다.
Routines
-
- Production 환경에서는 Lambda execution role 과 EC2 IAM role 등의 IAM temporary credential 기능을 활용합니다.
- 리소스에게 부여된 권한들은 해당 리소스의 동작에 대한 명세이기도 하다고 생각하고 있으며, Service role에 Least privilege rule을 최대한 준수했습니다.
- 프로젝트 별로 User group을 만들고 개발자들에게 개발에 필요한 권한을 부여합니다.
- GitHub CLI SSO , AWS CLI SSO 등의 SSO 서비스를 사용해 개발자가 개발에 필요한 권한을 획득할 수 있도록 도입 중입니다.
-
Secrets Management
- 영구적인 Secret보다는 직접 관리할 필요가 없는 Credential을 우선적으로 사용해야한다는 원칙을 지키고 있습니다.
- Secret이 불가피하게 필요하다면 Docker secret , AWS Secrets manager , env file 등을 적절히 조합해 Stage를 안전하게 구분해 Secret을 관리합니다.
- 필요할 경우 gitleaks 등을 도입합니다.
- 프로젝트 별로 SSH key를 다르게 사용하고 EC2 Instance Connect 를 통해 인프라에 안전하게 접근합니다. Password 사용을 자제합니다.
-
Infra Security
- AWS Certificate Manager 의 관리형 인증서를 CloudFront, API Gateway, Load Balancer 등에 연동해 HTTPS 연결을 제공합니다.
- 인증서를 직접 관리할 때는 Certbot Route 53 plugin Docker image 또는 acme.sh script 로 인증서를 발급받아 Nginx에 등록합니다.
-
Application Authentication
- API Gateway endpoint에 IAM authorizer , Cognito user pool authorizer 을 부착해 인증 기능을 추가합니다.
- 3rd party identity provider가 추가된 Cognito user pool을 운영할 수 있고, amazon-cognito-identity-js 라이브러리를 복수의 프로젝트에서 사용했습니다.
- Nginx가 요청을 받았을 때, 지정된 Endpoint로 Subrequest를 보내 상태 코드에 따라서 요청을 Reject하는 ngx_http_auth_request_module 의 기능으로 본 서비스와 인증 서비스를 분리하는 아키텍처를 사용할 수 있습니다.
Experiences
- VPC 외부에 있는 Lambda에서 VPC 내부의 ElasticCache Redis에 접근이 필요한 경우가 있었습니다. VPC 내부에서는 CloudMap에 등록된 주소를 통해 무인증으로 접근하도록 기존 로직을 유지했고, VPC 외부에서는 Nginx를 두어 Nginx가 트래픽을 중계할 때 mTLS authentication을 요하도록 구성했습니다.
- 관련 Directive:
ssl_verify_client
- 관련 Directive:
- RDS에 IAM authentication 을 구성해 사용할 수 있습니다.
TODOs
회사에서 꼭 필요하다고 생각해 익히고자 하는 기술입니다.
- CDK를 이용한 IAM 역할 관리, 테스트 코드 작성
- AWS Secret Manager secret rotation