🧑🏻‍🔧 구축과정

팀 근두운 인프라 구축 중, CERT 인프라 구성 과정에서 Velociraptor 서버를 EC2에 올리고, 다른 수집 대상의 다른 EC2에 Agent를 배포하는 방식으로 운영을 하려고 계획을 하였다.

먼저 Velociraptor 공식 매뉴얼(https://docs.velociraptor.app/docs/deployment/quickstart/)을 확인하였는데, 설치 방법은 매우 단순했다. 서버의 플랫폼과 아키텍처를 선택한 뒤, 이에 맞는 Velociraptor 바이너리를 다운로드하고, 바이너리의 config generate -i 명령으로 서버 구성 파일인 server.config.yaml을 생성한다.

그리고, 생성된 서버 구성 파일(.yaml)을 패키지 포맷에 맞게 server --config 명령으로 서버 설치 패키지로 생성해 주고, 이 패키지를 설치만 해주면 자동으로 Velociraptor 서버가 구축이 되는 거였다.

# Debian 기반 Linux 서버
velociraptor debian server --config server.config.yaml
# RPM 기반 Linux 서버
velociraptor rpm server --config server.config.yaml

이후 Agent 배포는 Client 측에도 동일하게 Velociraptor 바이너리를 다운로드하고, 이번에는 client.config.yaml(클라이언트 구성 파일)을 준비해주면 된다.

여기서 client.config.yaml 파일은 서버 설정 파일을 통해 클라이언트 구성 파일을 추출하면 된다.

# 서버 설정 파일을 통해 클라이언트 설정 파일을 추출
velociraptor --config server.config.yaml config client > client.config.yaml

⚠️ 서버 설정파일(server.config.yaml)에는 CA 개인키와 서버 개인키 등 중요한 비밀정보가 포함되므로, 클라이언트에 유출되지 않도록 주의해야 한다.

Velociraptor 바이너리와 client.config.yaml 파일 준비가 끝났으면, 패키징 또는 서비스 등록 단계를 거쳐 Agent 설치를 마무리하자.

여기서는 Agent를 설치할 클라이언트의 OS에 따라 방식이 달라지는데, 근두운에서는 클라이언트도 리눅스를 사용하고 있기 때문에 리눅스를 기준으로 설명한다.

리눅스에서는 Server 구축과 같은 방법으로 클라이언트 구성 파일(.yaml)을 패키지 포맷에 맞게 client --config 명령으로 설치 패키지를 생성하고, 이 패키지를 설치하면 Velociraptor Agent 설치가 끝난다.

# Debian 기반 Linux
# 패키지 생성
velociraptor debian client --config client.config.yaml
# 패키지 설치
dpkg -i <deb 패키지 파일명>

# RPM 기반 Linux
# 패키지 생성
velociraptor rpm client --config client.config.yaml
# 패키지 설치
rpm -Uvh <rpm 패키지 파일명>

패키지 설치 후에 서비스 상태를 확인 해보고,

systemctl status velociraptor_client

서비스 데몬이 정상적으로 active(running) 상태라면, Velociraptor GUI에서 Client가 등록된 것을 확인할 수 있을 것이다.

image.png

🫪 문제 발생

팀 근두운 인프라에 적용하기 전, 내 AWS 계정에서 Velociraptor EC2와 Agent를 설치할 Client EC2를 생성해서 직접 연결해보고, 특이사항이 없다고 판단해 팀 근두운 인프라에 동일하게 구축을 하려고 했었다. 근두운에서는 Terraform으로 인프라를 구축하고 있기에, Velociraptor 서버용 EC2를 생성하면서 user_data 인자를 통해 Velociraptor 바이너리 설치, server.config.yaml 생성 및 패키지 설치, Agent 설치용 client.config.yaml 파일 추출까지 쉘 스크립트로 자동화할 수 있게끔 설계하였다.

특별히 문제가 없을 것이라고 생각하고, 팀 레포에 PR을 올렸다. 해당 PR에 대해 PM님께서 PR에 코멘트를 달아 주셨는데, 여기서 첫 번째 실수?가 나온다.