이전에도 보안 또는 민감한 데이터를 Amazon ECS 태스크의 컨테이너에 안전하게 전달하려면 어떻게 해야 합니까?
에 대하여 포스팅 했었는데, 프로젝트 기간에는 삽질만 열심히 했었는데 집으로 복귀해서 천천히 해보니 되었던 경험이 있어서 이번에는 기간내에 성공하고 싶었다.
이번에는 AutoScalingGroup으로 생성되는 EC2에 환경변수를 안전하게 전달하는것이 목표이다.
Note
"환경변수"에는 서버와 연결되는 Database Endpoint, Elastic DNS, 등 많은 정보가 포함되어있다.
많은 환경변수 중에도 민감한 정보가 포함되어 있으므로 꼭 암호화하여 전달할 필요가 있다고 생각했다.
Terraform tfvars file -> 시작템플릿에 user-data -> EC2 npm start
잘 전달되었겠지? 라고 기대하며 체크를 해보았는데...
타겟그룹에서 서버가 계속 Unhealthy가 뜨고 있었다.
원인을 파악해보니 환경변수가 전달되지 않아서 서버실행시 에러를 만난 상태였다.
먼저, 환경변수가 잘 전달되는지 확인하기 위한 아래과정을 진행하였다.
테라폼으로 User-data에 환경변수를 넣어서 httpd으로 변수리스트를 포함한 html을 띄워보았다.
Note
과정은 아래 블로그에 자세하게 설명되어 있다.
앞서 설명한 Elastic의 DNS 주소 환경변수를 user-data로 넣어두고 파이프라인 배포단계에서 파일로 불러온다.
# local - terraform/user-data.tf (파일중 일부분)
echo 'ELASTIC_HOST="${aws_alb.elk_server.dns_name}"' >> /opt/env_elastic_host
# aws pipeline deploy - scripts/start.sh (파일중 일부분)
source /opt/env_elastic_host
그런데 변수리스트를 테스트용도로 띄운 httpd 타겟(port 8080)은 건강하다고 뜨지만, 실제 api 서버 타겟(port 3000)이 건강하지 않다고 뜬다.
export
를 살펴보고 env
도 출력해보았는데 텅텅비어있는 변수리스트를 보고나서야 아차! 싶었다.
user-data로 환경변수 파일을 생성하고 서버실행 script에서 source /opt/env_elastic_host
로 불러오는 방식인데 아래와 같이 export로 내보내주어야 nodejs 서버에서 불러올수 있었다.
# local - terraform/user-data.tf (파일중 일부분)
echo 'export ELASTIC_HOST="${aws_alb.elk_server.dns_name}"' >> /opt/env_elastic_host
# aws pipeline deploy - scripts/start.sh (파일중 일부분)
source /opt/env_elastic_host
(중략)
pm2 start npm -- start
Note
안전하게 전달하는 것의 중요성.첫 번째로 중요한 보안이다, 몇 번을 강조해도 부족하다.
그만큼 정보가 누군가에게 공개된다는것은 악용될 여지가 충분하기에 중요성이 너무나도 크다.얼마전 AWS 사용자가 해킹을 당하여 3억넘게 리소스를 도둑맞은 사건이 있었다.
이처럼, 금액적으로도 직접적인 연관이 있고 액수도 무시하지 못할 수준이었다.나는 보안을 허술하게 해두는것을 용납하지 못한다.
꼭! MFA 인증으로 계정을 걸어잠그자.
구글 OTP는 폰 바꾸면서 잃어버리는 경우가 있다고 한다.
마이크로소프트사 OTP(Microsoft Authenticator)로 바꿀까? 생각중이다.