💁 서론
팀 근두운 인프라의 리소스 구축은 완료되었고, 이번 과정에서는 CERT의 침해사고 탐지・대응 업무를 지원하는 핵심 보안 도구인 Wazuh SIEM이 어떠한 보안 이벤트들을 수집해서 관리자에게 알려주는지에 대한 얘기를 해보려고 한다.
현재 우리가 보안 데이터 수집・분석에 활용하는 도구와 데이터 소스로는 Wazuh Agent, Velociraptor, CloudTrail, VPC Flow Logs, WAF Logs, GuardDuty Findings, ALB Access Logs가 있다.
각 도구와 데이터 소스에서 얻을 수 있는 데이터는 다음 표와 같다.
구분 | 관찰 대상 | 수집 데이터 |
Wazuh Agent | 설치된 엔드포인트 | 운영체제・애플리케이션 로그, 로그인 성공・실패 기록, 파일 생성・수정・삭제 기록, 보안 설정 기준 점검 결과 |
Velociraptor | 설치된 엔드포인트 | 헌팅 시 적용한 아티팩트에 따라 파일 원본, 이벤트 로그, 프로그램 실행 흔적 등의 정보 |
CloudTrail | AWS 계정 | 수집하도록 설정한 AWS 활동의 실행 주체, 시간, 서비스명, 출발지 IP, 요청 내용 |
VPC Flow Logs | VPC 통신 흐름 | 출발지・목적지 IP/Port, 통신 프로토콜, 전송량, 패킷 수, 트래픽 허용 여부 |
WAF Logs | ALB로 들어오는
웹 요청 | 웹 요청의 IP・국가, 요청 경로・방식, 헤더・쿼리 문자열, 매칭된 보안 규칙과
처리 결과 |
GuardDuty Findings | AWS 내 이상 행위 | 위협 유형, 심각도, 관련 AWS 자원, 시간, 발생 횟수, 관련 IP, 의심 작업과 탐지 근거 |
ALB Access Logs | ALB로 들어오는
웹 요청 | 시간, 요청 IP/Port, 전달 대상 서버, 요청 주소・방식, ALB 및 대상 서버 응답 코드, 처리 시간, 송수신 크기, 암호화 연결 정보 |
Wazuh Manager는 이러한 많은 데이터 소스에서 수집한 정보를 분석하고, 탐지 규칙과 경보 생성 기준을 충족한 이벤트에 대해 Alert를 생성한다. 생성된 경보는 Wazuh Indexer에 의해 저장되며, Wazuh Dashboard에서 시각화하여 확인할 수 있다.
그러면, Wazuh Manager는 수집 데이터를 어떻게 받아올까?
🕵️♂️ 보안 이벤트 수집 과정
Wazuh Agent - 엔드포인트 데이터 수집
먼저 Wazuh는 엔드포인트와 클라우드 등 여러 영역의 보안 데이터를 통합 분석하는 XDR 기능을 제공한다. 여기서 Agent가 엔드포인트의 데이터를 수집하며, Active Response(자동 대응)를 설정하면 탐지 조건에 따라 IP 차단 등의 작업을 수행할 수도 있다.
Wazuh Agent는 엔드포인트(여기서는 아마존 리눅스 2023)에 설치되어,
/var/ossec/etc/ 경로의 ossec.conf 파일(Agent의 주요 동작을 설정하는 파일)에 <localfile> 블록으로 정의되어 있는 로그들을 수집해 Wazuh Manager로 보내준다.
journald는 systemd에 내장된 중앙 집중식 로깅 서비스로 syslog, 커널 메시지(/dev/kmsg), systemd 서비스가 실행될 때의 표준 출력(stdout), 표준 오류(stderr) 등의 로그를 수집해준다.
journald가 수집한 로그 예시/var/log/audit/audit.log는 커널 등에서 발생한 감사 이벤트를 auditd가 기록하는 감사 로그 파일이다. 감사할 행위는 /etc/audit/rules.d/audit.rules 파일에 규칙을 작성하여 직접 정의할 수 있다.예시로 내부 EC2에서 IMDS 조회에 사용될 수 있는
curl 명령 실행을 기록하고 싶을 경우, 다음과 같이 정의할 수 있다.# audit.rules # curl 명령어 실행 감시 -w /usr/bin/curl -p x -k imds_access # 모든 curl 명령 실행을 기록 # ==== 옵션 설명 ==== # # -w <파일/디렉터리 경로> 감시할 파일이나 폴더의 위치 # -p <권한 옵션> x: 실행될 때(Execute), w: 수정/쓰기, r: 읽기/조회, a: 파일 속성 변경 # -k <키 이름> 이 규칙으로 생성된 감사 이벤트를 검색・식별하기 위한 이름 지정
이렇게 규칙을 설정하고 나면,
augenrules --load로 감사 규칙을 적용해준다.# rules.d의 규칙 파일들을 병합하고 커널에 적용 sudo augenrules --load
이후 설정이 제대로 되어 있는지 확인해 보고, 작성한 명령이 그대로 출력된다면 EC2 내부에서
curl 명령 실행 시 audit.log에 기록이 될 것이다.# 현재 적용된 audit.rules 규칙 출력 sudo auditctl -l

이처럼 감사하고 싶은 행위를 직접 지정해도 되지만, 사용자가 실행한 명령 전체를 감시하도록 정의할 수도 있다.(셸 내부 명령은 제외)
# audit.rules # 로그인 사용자 식별 정보가 설정된 프로세스의 프로그램 실행을 감시 -a always,exit -F arch=b64 -S execve -F auid!=unset -k process.exec -a always,exit -F arch=b32 -S execve -F auid!=unset -k process.exec
다만 셸 내부 명령을 제외한 전체 명령을 감시해서 로그를 기록하기 때문에 사용자 활동이 많은 서버의 경우, Wazuh Manager로 그대로 전송하게 되면 용량 폭탄이 될 수도 있으니 주의하자.
Wazuh Agent 등록 절차는Wazuh Agent 등록 방법 - Kintoun Infra 기술 문서
를 참고Wazuh Agent 등록 방법 - Kintoun Infra 기술 문서
근두운 AWS 인프라의 설계, Terraform 운영 절차와 CI
Velociraptor - DFIR
Velociraptor는 Velociraptor Client가 설치되어 있는 엔드포인트의 행위를 헌트와 컬렉션이라는 액션을 통해서 증적을 포렌식하고, 사고 조사를 도와준다. 헌트와 컬렉션 시 수집・분석 작업을 정의한 아티팩트를 사용하며, VQL을 직접 작성해 커스텀 아티팩트를 생성할 수도 있다.
Velociraptor의 헌트 결과를 Wazuh로 전달해 Dashboard에서 한눈에 이벤트를 확인하고 분석할 수도 있지만, 수집 대상에 따라 Wazuh Agent가 수집한 엔드포인트의 이벤트와 일부 중복될 수 있다. 그리고 대부분의 결과가 대용량이라 Wazuh로 넣게 되면 저장 공간이 빠르게 고갈될 가능성도 있다.
따라서, Velociraptor가 생성하는 보안 이벤트(헌팅 결과)는 Wazuh에 전송하지 않고, Velociraptor 웹 GUI 자체의 Notebook 기능을 활용해 여러 아티팩트를 헌팅한 결과를 타임라인 분석하며, 침해사고의 흐름을 재구성하는 역할로 사용하는 것이 적절하다고 판단했다.
만약 Wazuh SIEM과의 연계가 필요하다고 하면, 오히려 Wazuh SIEM에서 특정 수준 이상의 Alert가 발생하였을 경우 Velociraptor API를 호출해 대상 자산에 대한 헌팅을 자동으로 수행하는 구조로 설계하는 것이 CERT 인프라에 알맞은 방식이라고 생각한다.
sequenceDiagram
participant A as 보안 이벤트<br/>(Agent, aws-s3)
participant B as Wazuh SIEM
participant C as Velociraptor Server
participant D as Target EC2<br/>(Velociraptor Client)
A->>B: 1️⃣ 보안 이벤트(로그) 전송
B->>B: 2️⃣ 탐지 규칙 매칭 후 특정 수준 이상의 Alert 생성
B-->>B: 3️⃣ Active Response 트리거 동작
B->>C: 4️⃣ API 호출(gRPC)<br/>(Alert json파일)
C->>D: 5️⃣ 헌팅
C-->C: 6️⃣ 보안 담당자가 헌팅 결과를<br/>Notebook으로 타임라인 분석CloudTrail - Control/Data Plane
먼저 하나 짚고 넘어가자면, 팀 근두운 인프라에서 AWS 서비스가 기록하는 보안 이벤트는 모두 S3 버킷에 원본을 보관하고 Wazuh Manager의
wodle(Wazuh Module) 중 aws-s3 모듈을 통해 S3 버킷의 로그를 수집하는 방식을 적용한다. 이러한 방식은 서비스별 로그 전달 지연과 Wazuh의 수집 주기로 인해 이벤트 발생 즉시 대시보드에 표시하는 실시간성을 보장해주지는 않는다.CloudTrail은 AWS 계정 내에서 발생한 API 활동을 감사하는 역할을 하며, 4가지의 이벤트 유형으로 구분하여 기록한다. (참고:
근두운 기술 블로그SecOps 개념
)
SecOps 개념
Security 와 Operations 가 합쳐진 개념으로, 조직의 인프라 운영에 보안을 통합하는 것을 기반으로 함 보안팀과 운영팀이 협력과 소통 문화를 조성하여 시스템을 지속 감시하고, 위협을 탐지하며, 침해사고에 대응하는 체계
팀 근두운에서는 Management Event와 Data Event에 대한 추적을 활성화하였고, 해당 기록들은 S3 버킷에 저장된다.

그리고 Wazuh Manager가 S3 버킷에 있는 로그를 읽고 가져오기 위해서는 권한이 필요한데, 이는 Wazuh가 설치되어 있는 EC2 인스턴스가 사용하는 IAM Role에 권한 정책을 정의해 주어야 한다.
CloudTrail 로그가 저장되는 S3 버킷을 타겟 리소스로 하고, 이를 조회하는
s3:ListBucket 권한과 객체를 가져오는 s3:GetObject 권한을 만들어 Wazuh의 IAM Role에 Attachment하면 로그를 수집할 준비를 마친다.CloudTrail 로그를 저장하는 S3 버킷은 SSE-S3 암호화를 사용하고 있어,s3:GetObject권한만으로 Wazuh Manager가 복호화된 데이터를 가져오는 것이 가능하다.
이후, Wazuh Manager의
ossec.conf 파일에서 <wodle> 블록으로 aws-s3모듈을 정의해, Manager가 수집할 AWS 서비스 종류와 대상 버킷을 지정하면, Wazuh Manager가 interval 주기에 맞춰 S3 버킷에서 로그를 수집해 온다. <!-- aws-s3 모듈 활성화 --> <ossec_config> <!-- 기존 설정... --> <wodle name="aws-s3"> <disabled>no</disabled> <interval>5m</interval> <run_on_start>yes</run_on_start> <bucket type="cloudtrail"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> </wodle> </ossec_config>
ossec.conf 파일 수정 후에는 반드시 서비스 재시작이 필요하다.
# Wazuh Manager 서비스 재시작 sudo systemctl restart wazuh-manager
설정을 정상적으로 완료했으면,
/var/ossec/logs/ossec.log에서 다음과 같은 결과를 확인할 수 있다.
VPC Flow Logs - L4 레벨
VPC Flow Logs는 VPC 내의 트래픽 흐름에 대한 메타데이터를 기록하는 것으로 VPC, 서브넷, ENI 단위로 수집을 활성화할 수 있다. 팀 근두운 인프라에서는 서비스를 제공하는 WEB, WAS, DB의 서브넷에 대해서만 Flow Logs를 기록하고 있으며, 트래픽 허용 여부(ACCEPT/REJECT) 상관없이 모든 트래픽을 수집하도록 설정했다.
CloudTrail과 마찬가지로 VPC Flow Logs 저장용 버킷을 생성해 로그를 보관하고 있으며, Wazuh Manager의
ossec.conf 파일에 동일하게 aws-s3 모듈을 통해 수집하도록 정의해주면 된다.단,
<wodle> 태그를 한 번 더 사용하게 되면 제일 아래에 있는 wodle 블록의 설정만 적용되기 때문에 기존에 정의했던 <wodle> 블록에 <bucket> 태그만 추가해서 설정해 주어야 한다.<ossec_config> <wodle name="aws-s3"> <disabled>no</disabled> <interval>5m</interval> <run_on_start>yes</run_on_start> <bucket type="cloudtrail"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> <bucket type="vpcflow"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> </wodle> </ossec_config>
CloudTrail과 동일하게 S3 버킷의 데이터를 수집해오는 것이기 때문에 Wazuh IAM Role의
s3:ListBucket, s3:GetObject 권한만으로 가능할 것이라고 생각했는데 VPC Flow Logs는 달랐다.
로그에서 출력되는 것처럼 VPC Flow Logs의 경우에는 S3 접근 권한 외에도
WazuhAmazon Virtual Private Cloud (VPC) - Supported services
ec2:DescribeFlowLogs라는 권한을 필요로 한다. 해당 권한은 VPC Flow Logs의 설정 목록과 상태를 조회하는 권한으로 Wazuh 공식 문서에서도 해당 권한을 필수 요건으로 명시하고 있었다.

Amazon Virtual Private Cloud (VPC) - Supported services
The following sections cover how to configure the Amazon VPC service to integrate with Wazuh.
다시 돌아가,
ec2:DescribeFlowLogs 권한을 Wazuh의 IAM Role에 Attachment하게 되면 정상적으로 aws-s3 모듈이 VPC Flow Logs를 수집하는 것을 확인할 수 있다.
WAF Logs - L7 보안 레벨
WAF는 웹 요청이 들어오면 Web ACL에 정의된 규칙을 검사해 트래픽을 통과/차단하는 웹 방화벽이다. 팀 근두운 인프라에서는 WAF의 룰에 매칭되어 차단된 트래픽만을 기록하도록 설정했다. WAF를 거치는 모든 트래픽을 로깅할 수도 있지만 VPC Flow Logs와 이후 설정할 ALB Access Logs로 넓은 범위에서 트래픽을 감사하기에, 비용과 노이즈 문제를 고려하여 필터링을 걸어둔 상태를 유지한다.
WAF Logs는 Wazuh가 WAF Logs를 보관하는 S3 버킷에 대한
s3:ListBucket, s3:GetObject권한만 있으면 aws-s3 모듈로 수집이 가능하다.<ossec_config> <wodle name="aws-s3"> <disabled>no</disabled> <interval>5m</interval> <run_on_start>yes</run_on_start> <bucket type="cloudtrail"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> <bucket type="vpcflow"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> <bucket type="waf"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> </wodle> </ossec_config>
GuardDuty Findings - AWS 계정 내 이상 탐지
GuardDuty는 CloudTrail, VPC Flow Logs, DNS Query Logs를 기반으로 악성 활동과 이상 행위를 자동으로 탐지해 결과를 Finding으로 보여준다.
GuardDuty는 다른 서비스와 다르게 Finding을 S3 버킷에 저장하기 위해 KMS 키를 활용한 암호화를 요구한다.
WazuhAmazon GuardDuty - Supported services · Wazuh documentation

Amazon GuardDuty - Supported services · Wazuh documentation
The following sections cover how to configure the different services required to integrate GuardDuty into Wazuh.
이때 생성한 KMS 키를 활용해, AWS 서비스 이벤트를 보관하는 S3 버킷 암호화 방식을 SSE-S3에서 SSE-KMS 암호화 방식으로 변경 적용했다.
따라서, Wazuh Manager가
aws-s3 모듈로 GuardDuty Findings를 보관하는 S3 버킷의 데이터를 수집하려면 kms:Decrypt 권한 정책을 Wazuh IAM Role에 추가로 Attachment 해주어야 한다. ossec.conf 파일의 모듈 설정 방법은 동일하다.<ossec_config> <wodle name="aws-s3"> <disabled>no</disabled> <interval>5m</interval> <run_on_start>yes</run_on_start> <bucket type="cloudtrail"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> <bucket type="vpcflow"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> <bucket type="waf"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> <bucket type="guardduty"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> </wodle> </ossec_config>
ALB Access Logs - L7 성능 레벨
ALB Access Logs는 ALB가 처리하는 HTTP/HTTPS 요청에 대한 상세 내용을 기록하는 로그로 7계층 이벤트를 감사한다. 일반적인 웹 트래픽뿐만 아니라
elb_status_code(ALB가 사용자에게 내려준 응답 코드), target_status_code(백엔드 서버가 리턴한 응답 코드)를 통해 애플리케이션의 상태 점검과 에러 원인 진단에도 활용할 수 있다.ALB Access Logs를 S3 버킷에 저장하는 방식은 KMS 암호화를 지원하지 않아, SSE-S3 버킷 암호화 방식을 채택하였다. 그렇기에 해당 버킷에 대한
s3:ListBucket, s3:GetObject 권한만으로 Wazuh aws-s3 모듈이 데이터를 정상적으로 수집할 수 있다.<ossec_config> <wodle name="aws-s3"> <disabled>no</disabled> <interval>5m</interval> <run_on_start>yes</run_on_start> <bucket type="cloudtrail"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> <bucket type="vpcflow"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> <bucket type="waf"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> <bucket type="guardduty"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> <bucket type="alb"> <name>Bucket Name</name> <remove_from_bucket>no</remove_from_bucket> </bucket> </wodle> </ossec_config>
이렇게 모든 AWS 서비스 로그에 대한
aws-s3 모듈 연동 설정을 마쳤으면, Wazuh Manager 서비스 재시작을 통해 적용해주자.적용 후
ossec.log를 확인해보면, 다음과 같이 로그를 수집하는 것을 볼 수 있다.
이제 Dashboard에서 탐지 규칙에 매칭된 Alert를 통해 여러 보안 이벤트를 쉽게 확인할 수 있다.
Wazuh Manager가 보안 이벤트를 수집하는 흐름
sequenceDiagram
participant A as Wazuh Agent
participant B as Wazuh SIEM<br/>(Indexer, Manager, Dashboard)
participant C as 로그 보관 S3 버킷
participant D as AWS 서비스 로그
A->>B: 엔드포인트 수집 로그 전달<br/>(TCP 1514)
D->>C: 서비스별 이벤트 로그 전달
C->>C: 로그 원본 저장
B->>C: Manager의 aws-s3 모듈로 로그 수집<br/>(Wazuh IAM Role 권한)
B-->B: 탐지 규칙 매칭
B->>B: Dashboard에서 Alert 시각화
Wazuh Dashboard에서 확인한 모습

Wazuh가 보는 이벤트 아키텍처

🧙♀️ 결론
팀 근두운에서 구축한 AWS 인프라에서 발생하는 여러 보안 이벤트들을 Wazuh SIEM에서 한 번에 확인할 수 있도록 연결하였다.
나아가 보안 이벤트들을 활용해 이상 행위에 대한 탐지 규칙을 설계한다면, 효율적인 보안 모니터링 인프라를 완성할 수 있을 것이다.

