목표 설정

근두운 팀 프로젝트에서는 GitHub Organization을 이용해서, AWS 인프라를 IaC로 관리하며 우리는 Terraform 코드를 사용할 것이다.

근두운 팀 AWS 계정에 Wazuh SIEM을 구축하기 위해서는 콘솔에서 실습한 것처럼 Wazuh EC2 생성을 위한 기본적인 네트워크 뼈대가 필요하다.

우리는 IaC로 인프라를 구축하고 있고, 온프레미스 환경과는 달리 클라우드 환경이 가진 특성 덕분에 이후 확장 및 변경에도 유연하게 대응할 수 있다. 그래서, 현재 단계에서는 Wazuh SIEM 구축을 위한 최소한의 네트워크만을 구성하는 Terraform 코드를 설계하고, 팀원들이 Wazuh Dashboard에 접근하여 서비스를 사용해보는 경험을 갖는 것을 목표로 하였다.

Wazuh Dashboard는 HTTPS 포트로 접속하게 되면, UI를 제공해준다. 이를 위해서는 Wazuh EC2의 보안 그룹에서 인바운드 정책 설정 시, 팀원들의 PC 공인 IP를 전부 받아서 TCP/443 포트를 허용해주어야 한다. 하지만, 위와 같은 방식은 네트워크 환경이 바뀌게 되면 다시 공인 IP를 인바운드 정책에 넣어줘야 한다는 단점이 있다.

그렇다고 인바운드 정책에 “0.0.0.0/0”을 할 수는 없으니 다른 방법을 찾아보던 중, AWS Systems Manager(SSM)의 Session Manager 포트 포워딩 기능을 사용하면 인바운드 정책 없이도 Dashboard 접근이 가능하다는 것을 알게되었다.

포트 포워딩을 통해 로컬 포트와 Wazuh EC2 인스턴스의 Dashboard 포트를 연결해주면, 세션이 유지되는 동안 팀원들은 https://localhost:<로컬 포트 주소>로 Wazuh Dashboard 접속이 가능하다.

aws ssm start-session \
--target <wazuh_instance_id> \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["443"],"localPortNumber":["56789"]}' \
--region ap-northeast-2

하지만, 이 동작도 누구나 할 수 있는 것은 아니다.

먼저 SSM 접근 대상인 Wazuh EC2는 SSM 관련 IAM Role을 가져야 한다. 그리고, 팀원의 PC에는 AWS CLI와 SSM Plugin 설치가 되어있어야 하고, ssm:StartSession 권한이 있는 자격증명이어야 SSM 포트 포워딩이 가능하다. 선행 조건이 복잡해보이지만, 오히려 보안적으로는 안전하다고 볼 수 있다.

공개 인바운드 포트를 열지 않아 공격 표면을 줄일 수 있고, 아무나 세션을 얻어서 Dashboard에 접근하는 것이 아닌 IAM Role에 의해 권한이 있는 사람만이 접속할 수 있기 때문이다. 필요에 따라 IAM Role을 Assume할 수 있는 권한을 부여・회수하는 방식으로 관리할 수 있게 되는 것이다.

그렇다고 ssm:StartSession 권한을 대상 Session 문서의 범위 제한 없이 넓게 부여하면, 포트 포워딩뿐만 아니라 서버 Shell 접속도 가능해질 수 있다. 따라서 팀원의 역할에 따라 AWS-StartPortForwardingSession(포트 포워딩)과 SSM-SessionManagerRunShell(서버 Shell 접속) 리소스를 각각 허용하도록 IAM Role의 권한을 분리하는 것이 중요하다.

우리 환경에서는 현재 IAM Role을 Assume하는 방법론을 적용하지 않고 있기 때문에, User가 속한 Group을 통해 권한을 직접 받는 방식으로 설계하였다.

우선 포트 포워딩에 필요한 정책과 서버 Shell 접속에 필요한 정책을 분리해서 생성하였고, 포트 포워딩 정책은 모든 팀원들이 사용할 수 있도록 전 그룹에 부여하였다. Shell 접속 정책은 관리자를 지정해 콘솔에서 직접 부여하는 방식으로 운영한다.

하지만, 근두운 팀 프로젝트에서는 IAM User의 장기 액세스 키 사용을 하지 않고 있어 ssm:StartSession 권한이 있어도 AWS CLI 사용이 제한된다. 권한은 있지만 CLI는 그래서 너가 누구인데? 를 물어보게 되는 것이다.

이 문제는 aws login을 통해 해소할 수 있다. aws login은 Console 로그인을 통해 CLI에서 사용할 수 있는 임시 자격증명을 발급해주기 때문에 IAM User의 장기 액세스 키를 직접 생성・저장하지 않고도 AWS CLI를 사용할 수 있게 된다.


Terraform 코드 작성

그러면 이제 설정한 목표를 달성하기 위한 Terraform 코드 작성을 시작한다. Terraform 코드는 통상적으로 main.tf, variables.tf, outputs.tf로 구분해서 작성한다고 설명하지만, 이후 리팩토링과 관리를 위해 main.tf 없이 IAM, Network, EC2, Security Group으로 구분해서 작성할 것이다.

Terraform 코드로 완성될 네트워크 구조는 다음과 같다.