VMware Fusion 13으로 보안 실습 환경 구축 — Suricata IDS + ELK SIEM + DVWA + Kali Linux
- 작업 기간: 2026년 6월 28일 ~ 2026년 7월 2일
- 환경: macOS M2 · VMware Fusion 13 · Ubuntu 20.04.5 LTS ARM64
- 구성 VM 수: 9대
프로젝트 개요
홈랩을 구축하면서 공격 → 탐지 → 분석의 전체 흐름을 몸으로 익혀보기로 했다. 항상 다른 사람들에게 기대는 느낌이 있었던지라, 일단 혼자 할 수 있는데까지 해보자! 라는 생각으로 시작하게 되었다. 또한 폴리텍 대학에서 한 학기 동안 다니면서 교수님들이 혼자 작업해봐야 한다는 말이 생각났기 때문에 무작정 부딪혀보고자 했고, 학기 중에는 리눅스 명령어로 기초 정도만 공부한 것 같아 서버를 구축해보면서 더 다양한 기술이나 명령어에 대해 알아보기로 했다.
구성 목표
- Bastion Host를 통한 SSH 서버 구성
- OpenVPN 서버 구축 (PKI 인증서 기반)
- DVWA 취약 웹앱 배포 → Kali Linux로 공격
- Suricata IDS로 공격 실시간 탐지
- ELK Stack으로 로그 수집 · 시각화
- Kibana 대시보드로 탐지 현황 확인
VM 구성
VM역할IP
| bastion | SSH 서버 | 192.168.0.30 (Bridged) |
| openvpn | VPN 서버 | 172.16.60.131 |
| web | Nginx + HTTPS | 172.16.60.132 |
| was | Apache + DVWA | 172.16.60.134 |
| db | MariaDB | 172.16.60.133 |
| suricata | IDS | 172.16.60.135 |
| siem | ELK Stack | 172.16.60.136 |
| kali | 모의해킹 | 172.16.60.138 |
| portfolio | 포트폴리오 서버 | 172.16.60.140 |
주요 구축 내용
1. Bastion Host — SSH 서버
가장 먼저 구축한 건 Bastion Host다. 내부 가상머신에 접근하려면 Bastion을 거쳐야 하는 구조를 만들었다.
bash
`# SSH 키 생성 (맥 터미널)
ssh-keygen -t ed25519 -C "homelab-bastion" -f ~/.ssh/homelab
공개키 복사
ssh-copy-id -i ~/.ssh/homelab.pub -p 22 bastion@192.168.0.30

`# ~/.ssh/config 설정
Host bastion
HostName 192.168.0.30
User bastion
IdentityFile ~/.ssh/homelab
Host web-server
HostName 172.16.60.132
User ubuntu
ProxyJump bastion`
이렇게 설정하면 ssh web-server 한 줄로 Bastion을 지나 내부 서버에 접속할 수 있다.

2. Suricata IDS — ARM64 소스 컴파일 이슈
이게 제일 힘들었는데, Ubuntu 20.04 ARM64에서는 PPA 저장소가 ARM64를 지원하지 않기 때문에 apt install suricata 명령어가 실행되지 않아 소스 컴파일을 통해 문제를 해결했다.
bash
# apt로 설치하면 이런 오류가 뜬다 E: Package 'suricata' has no installation candidate
bash
`# 의존성 설치
sudo apt install -y libpcap-dev libnet1-dev libyaml-dev \
libpcre3 libpcre3-dev libpcre2-dev ...
소스 다운로드 및 컴파일
wget https://www.openinfosecfoundation.org/download/suricata-6.0.13.tar.gz
tar xzvf suricata-6.0.13.tar.gz
cd suricata-6.0.13
./configure && make && sudo make install`
컴파일하는 데 20분 넘게 걸렸다. 그것도 한 번에 성공한 게 아니라 의존성 패키지 하나하나 에러 메시지 보면서 추가했지만, 설치 후 또 다른 문제가 있었다. 66,733개 룰을 전부 로드하려니 로딩이 너무 오래 걸려 룰을 축소했다.
bash
`# SCAN 관련 룰만 추출해서 로드
sudo grep -E "SCAN|scan|nmap|NMAP" \
/usr/local/var/lib/suricata/rules/suricata.rules \
/tmp/scan-rules.rules
결과: 66,733개 → 654개`
이렇게 줄이고 나서야 빠르게 룰이 로드됐고, 테스트를 위한 룰을 생성했다.
bash
echo 'alert tcp any any -> any any (msg:"TEST TCP Alert"; sid:9000001; rev:1;)' \ | sudo tee -a /usr/local/var/lib/suricata/rules/suricata.rules
그리고 nmap으로 스캔을 날렸더니 드디어 alert가 생성됐다.
bash
`# suricata VM에서 nmap 스캔
sudo nmap -sS 172.16.60.133
alert 확인
sudo grep "alert" /var/log/suricata/eve.json | wc -l
결과: 2031`
3. ELK Stack SIEM 구축
SIEM VM(172.16.60.136)에 Elasticsearch + Logstash + Kibana를 설치했다.
bash
# ELK 7.x 저장소 추가 및 설치 sudo apt update && sudo apt install -y elasticsearch logstash kibana

4. 데이터 파이프라인 — Filebeat → Logstash → MariaDB + Elasticsearch
Suricata → eve.json → Filebeat → Logstash → MariaDB (alerts 테이블) → Elasticsearch (suricata-* 인덱스) → Kibana 시각화
파이프라인 구성이 생각보다 까다로웠는데, Logstash에서 MariaDB로 데이터를 넣으려면 JDBC 드라이버가 필요하다. 그리고 logstash 계정의 호스트 설정이 맞지 않으면 접속이 되지 않았다.
sql
- - logstash 계정 호스트를 SIEM VM IP로 맞춰줘야 함.
- CREATE USER 'logstash'@'172.16.60.136' IDENTIFIED BY 'LogstashPass!';GRANT INSERT ON homelab_db.alerts TO 'logstash'@'172.16.60.136';
처음에 172.16.60.135(Suricata IP)로 만들었다가 접속이 안 됐다. SIEM VM에서 DB에 접속하는 거니까 SIEM IP로 만들어야 한다는 걸 헷갈렸다.
sql
SELECT COUNT(*) FROM alerts; -- 결과: 2031
alert 2031건이 DB에 정상적으로 쌓였다.

5. DVWA + Kali 모의해킹 시나리오
WAS 서버에 DVWA(Damn Vulnerable Web Application)를 배포했다. 일부러 취약하게 만들어진 웹앱으로, 보안 실습용 표준 도구다.
bash
# DVWA 설치 sudo apt install -y php php-mysqli php-gd libapache2-mod-php apache2 cd /var/www/html sudo git clone <https://github.com/digininja/DVWA.git>
Kali에서 이런 공격들을 날렸다.
- nmap 포트스캔: sudo nmap -sS 172.16.60.134
- nikto 웹 취약점 스캔: nikto -h <http://172.16.60.134/dvwa>
- SQL Injection: DVWA 로그인 후 입력창에 1' OR '1'='1 입력
- XSS: <script>alert('XSS')</script> 입력
공격을 날리면 Suricata가 탐지하고 Kibana에서 확인 가능한 구조다.
6. Kibana 대시보드
http://172.16.60.136:5601 에 접속해서 인덱스 패턴을 만들었다.
Stack Management → Index Patterns → Create index pattern Name: suricata-* Time field: @timestamp
Discover 탭에서 결과 값으로 2031을 확인했고, 시간대별 탐지 건수 막대그래프 대시보드 생성

7. 포트폴리오 서버
포트폴리오 사이트(172.16.60.140)도 홈랩 안에 별도 VM으로 운영하고 있다. Nginx 정적 사이트로 구성했고, 실제 운영하고 있는 서버라고 생각해서 포트폴리오 서버도 nmap으로 스캔을 시도했다.
http://172.16.60.140

트러블슈팅
문제원인해결
| Suricata apt 설치 불가 | ARM64 PPA 미지원 | 소스 컴파일 (6.0.13) |
| 룰 로드 너무 느림 | 66,733개 룰 전부 로드 | SCAN 관련 654개로 축소 |
| Logstash DB 접속 실패 | logstash 계정 호스트 불일치 | SIEM IP로 계정 재생성 |
| Kibana EADDRNOTAVAIL | 특정 IP 바인딩 실패 | server.host: "0.0.0.0" |
| Elasticsearch 실패 | network.host IP 오타 | 올바른 SIEM IP로 수정 |
| Kali ISO 인식 불가 | macOS 격리 속성 | xattr -d com.apple.quarantine |
결과 및 회고
이 홈랩 구축을 시도할 때, 명령어 입력도 아니고 맥북으로 작업을 진행하느라 제대로 된 프로젝트 실행도 전에 설치 부분에서 계속 시간을 보내게 될 줄 몰랐다. 또한 초기 설정에는 학기 중에 배운 IP 고정을 시도해 보고 싶었으나 이 또한 제대로 되지 않아 서버 구현 중에 빼게 되었다. 그리고 설정 하나 잘못된 것 때문에 에러를 여러번 보기도 해서, 사실상 제일 많이 입력한 명령어는 cat과 ss인 것 같다.
"공격 → 탐지 → 분석" 의 전체 흐름을 직접 구현하고 확인해야 했는데, 계속 결과가 0으로 나올 때는 어차피 서버 구축은 끝났으니 대충 끝났다고 볼까.. 라는 마음도 들었으나, 이 부분이 사실상 가장 중요하다고 생각해 계속 매진한 결과, Kibana Discover에서 2031라는 결과값이 나오고 DB에 SELECT COUNT(*) FROM alerts가 2031 반환했을 때는 가장 뿌듯했다. 그리고 DB 서버에서도 같은 값을 반환하는 걸 보고는 이제서야 모든 서버가 다 연결됐구나! 라고 생각했다.
'클라우드 엔지니어 양성 > 프로젝트' 카테고리의 다른 글
| [개인 프로젝트] 트래픽 폭증 대응 티켓 예매 서비스 (1) | 2026.08.01 |
|---|---|
| [클라우드 인프라 엔지니어 양성] 세 번째 미니 프로젝트 회고록 (0) | 2024.05.11 |
| [클라우드 인프라 엔지니어 양성] 두 번째 미니 프로젝트 회고록 (1) | 2024.02.12 |
| [클라우드 인프라 엔지니어 양성] 첫 번째 미니 프로젝트 보완 (0) | 2024.01.19 |
| [클라우드 인프라 엔지니어 양성] 첫 번째 미니 프로젝트 회고록 (2) | 2024.01.10 |