
2024년, 한국인터넷진흥원(KISA)에 따르면 국내 사이버 공격 시도는 일평균 150만 건을 넘어섰습니다.
랜섬웨어, DDoS, APT 공격 등 점점 정교해지는 위협 속에서 기업들은 24시간 보안 관제(SOC)의 필요성을 절감하고 있습니다.
하지만 현실은 녹록지 않습니다.
중소기업이나 스타트업, 개인 학습자에게는 그림의 떡이죠.
그래서 저는 직접 만들기로 했습니다.
이 글은 제가 보안 관제 및 보안 서비스 개발 직무를 준비하면서 만든 Mini-SIEM (Security Information and Event Management) 프로젝트의 여정을 공유합니다.
오픈소스 기술 스택만으로 실무 수준의 SIEM을 구축하고, 실제 위협을 탐지하는 방법을 단계별로 알아봅니다.
SIEM (시엠)은 Security Information and Event Management의 약자로,
조직 내 모든 보안 이벤트를 수집, 저장, 분석, 대응하는 통합 보안 관제 시스템입니다.
쉽게 말해, 수백 개 시스템에서 발생하는 로그를 한 곳에 모아 분석하는 "보안 관제 센터"라고 생각하면 됩니다.
┌─────────────────────────────────────────────────────────┐
│ SIEM 핵심 기능 │
├─────────────────────────────────────────────────────────┤
│ 1. 수집 (Collection) │
│ → 방화벽, 웹서버, DB, AD 등 다양한 로그 수집 │
│ │
│ 2. 정규화 (Normalization) │
│ → 서로 다른 로그 형식을 표준 포맷으로 변환 │
│ │
│ 3. 상관 분석 (Correlation) │
│ → 여러 이벤트를 연결하여 공격 패턴 탐지 │
│ │
│ 4. 탐지 (Detection) │
│ → 미리 정의된 룰로 위협 식별 │
│ │
│ 5. 알림 (Alerting) │
│ → Slack, 이메일, SMS로 즉시 통보 │
│ │
│ 6. 대응 (Response) │
│ → 자동 차단, 격리, 티켓 생성 │
└─────────────────────────────────────────────────────────┘
| 제품 | 특징 | 연간 비용 (추정) |
|---|---|---|
| Splunk | 시장 점유율 1위, 강력한 검색 | 5천만 원 ~ 3억 원 |
| IBM QRadar | 금융권 많이 사용, AI 분석 | 3천만 원 ~ 2억 원 |
| ArcSight (Micro Focus) | 레거시 강함, 복잡함 | 1억 원 ~ 5억 원 |
| LogRhythm | 중소기업 친화적 | 2천만 원 ~ 1억 원 |
| Elastic SIEM | 오픈소스 기반, 상대적 저렴 | 무료 ~ 5천만 원 |
참고: 비용은 로그 처리량(GB/일), 사용자 수, 유지보수 포함 여부에 따라 천차만별입니다.
저는 보안 관제 및 보안 서비스 개발 직무를 준비하고 있습니다.
채용 공고를 보면 항상 나오는 요구사항:
하지만 개인이 Splunk를 써볼 방법은 거의 없습니다. (Free Trial은 60일 제한)
직접 만들면서 배운 것들:
개인 학습이나 소규모 프로젝트에 수천만 원은 부담스럽죠.
오픈소스 대안:
Splunk (1억 원)
↓
FastAPI + Elasticsearch + Kibana (무료!)
물론 상용 제품의 고급 기능(머신러닝, 자동 플레이북 등)은 없지만,
핵심 기능은 충분히 구현 가능합니다.
상용 제품은 정해진 틀 안에서만 작동합니다.
직접 만들면:
✅ 로그 수집
✅ 위협 탐지
✅ 실시간 알림
✅ 인시던트 관리
✅ 대시보드
┌─────────────────┐
│ 외부 시스템 │ (로그 소스)
│ - 웹 서버 │
│ - 방화벽 │
│ - 데이터베이스 │
└────────┬────────┘
│ HTTP POST (JSON)
▼
┌─────────────────────────────────────┐
│ FastAPI Application │
│ ┌──────────────────────────────┐ │
│ │ /log - 로그 수신 │ │
│ │ /dashboard - 실시간 통계 │ │
│ │ /incidents - 인시던트 관리 │ │
│ └──────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────┐ │
│ │ 위협 탐지 엔진 │ │
│ │ - Brute Force │ │
│ │ - SQL Injection │ │
│ │ - Privilege Escalation │ │
│ └──┬───────────────────────────┘ │
│ │ │
│ ├─────────────┬─────────────┐ │
│ ▼ ▼ ▼ │
│ [로그저장] [Slack알림] [통계] │
└─────┬───────────────────────────────┘
│
▼
┌─────────────┐ ┌──────────────┐
│ Filebeat │─────▶│Elasticsearch │
│ (로그 수집기)│ │ (로그 저장소) │
└─────────────┘ └──────┬───────┘
│
▼
┌──────────────┐
│ Kibana │
│ (시각화) │
└──────────────┘
선택 이유:
✅ 성능
✅ 개발 생산성
✅ 보안
대안 비교:
| 프레임워크 | 성능 | 학습 곡선 | 문서화 | 선택 |
|---|---|---|---|---|
| FastAPI | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ |
| Flask | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | ❌ |
| Django | ⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | ❌ |
선택 이유:
✅ 대용량 처리
✅ 전문 검색
✅ 실시간 분석
실무 사례:
대안 비교:
| 솔루션 | 검색 속도 | 확장성 | 비용 |
|---|---|---|---|
| Elasticsearch | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 무료 ✅ |
| Splunk | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 매우 비쌈 |
| PostgreSQL | ⭐⭐ | ⭐⭐⭐ | 무료 |
선택 이유:
✅ 경량
✅ 안정성
✅ Elastic Stack 통합
대안:
선택 이유:
✅ 강력한 시각화
✅ 무료
대안:
선택 이유:
✅ 간편함
✅ 실시간
# 필수
✅ Docker 20.10 이상
✅ Docker Compose 1.29 이상
# 선택 (로컬 개발 시)
⭕ Python 3.10 이상
⭕ Git
git clone https://github.com/YOUR_USERNAME/mini-siem-log-monitoring.git
cd mini-siem-log-monitoring
# .env 파일 생성
cp .env.example .env
# .env 파일 편집
nano .env
.env 파일 내용:
# Elasticsearch 비밀번호
ELASTIC_PASSWORD=changeme123!
# Slack Webhook URL (https://api.slack.com/messaging/webhooks)
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URL
# API 키 (원하는 문자열)
API_KEY=my-secret-api-key-2024
참고: Slack Webhook URL 생성 방법은 공식 문서 참조
# 모든 서비스 시작 (최초 실행 시 5-10분 소요)
docker-compose up -d
# 로그 확인
docker-compose logs -f fastapi_app
성공 메시지:
fastapi_app | INFO: Started server process [1]
fastapi_app | INFO: Waiting for application startup.
fastapi_app | 🚀 Mini-SIEM Application Started
fastapi_app | 🔐 API authentication enabled
fastapi_app | INFO: Application startup complete.
fastapi_app | INFO: Uvicorn running on http://0.0.0.0:8000
1) API 서버 확인
curl http://localhost:8000/
# 응답:
{
"message": "Mini-SIEM FastAPI Server is running.",
"version": "2.0.0",
"status": "healthy",
"timestamp": "2025-11-11T10:30:00.123Z"
}
2) Swagger API 문서 접속
브라우저에서 http://localhost:8000/docs 접속
3) Kibana 대시보드 접속
브라우저에서 http://localhost:5601 접속
정상 로그인 이벤트:
curl -X POST http://localhost:8000/log \
-H "Content-Type: application/json" \
-H "X-API-Key: my-secret-api-key-2024" \
-d '{
"event_type": "login_success",
"source_ip": "192.168.1.10",
"username": "john.doe",
"count": 1,
"description": "Successful login from office"
}'
응답:
{
"status": "ok",
"log": {
"timestamp": "2025-11-11T10:30:00.123Z",
"event_type": "login_success",
"severity": "info",
"source_ip": "192.168.1.10",
"username": "john.doe",
"is_threat": false
},
"alert_sent": false
}
Brute Force 공격 시뮬레이션:
curl -X POST http://localhost:8000/log \
-H "Content-Type: application/json" \
-H "X-API-Key: my-secret-api-key-2024" \
-d '{
"event_type": "login_failed",
"source_ip": "192.168.1.100",
"username": "admin",
"count": 8,
"description": "Multiple failed login attempts"
}'
응답:
{
"status": "threat_detected",
"log": {
"timestamp": "2025-11-11T10:31:00.456Z",
"event_type": "login_failed",
"severity": "medium",
"source_ip": "192.168.1.100",
"is_threat": true,
"threat_details": "Brute force attack detected: 8 failed login attempts from 192.168.1.100"
},
"incident_id": "INC-20251111-0001",
"alert_sent": true
}
동시에 Slack으로 알림 전송됩니다!
🚨 [MEDIUM] Security Threat Detected
• Type: login_failed
• Source IP: 192.168.1.100
• Details: Brute force attack detected: 8 failed login attempts
• Incident ID: INC-20251111-0001
<curl http://localhost:8000/dashboard
응답:
{
"total_events": 2,
"total_threats": 1,
"critical_incidents": 0,
"high_incidents": 0,
"medium_incidents": 1,
"low_incidents": 0,
"active_incidents": 1,
"resolved_incidents": 0,
"top_attack_ips": ["192.168.1.100"],
"top_event_types": {
"login_success": 1,
"login_failed": 1
},
"timestamp": "2025-11-11T10:32:00.789Z"
}
| 탐지 룰 | MITRE ATT&CK | 심각도 |
|---|---|---|
| Brute Force Attack | T1110 | Medium/High |
| SQL Injection | T1190 | Critical |
| Privilege Escalation | T1548 | High |
| Suspicious Time Access | T1078 | Medium |
| Botnet Activity | T1571 | Medium |
| Known Malicious IP | T1071 | Critical |
| File Access Anomaly | T1005 | Medium/High |
탐지됨 (detected)
↓
분석 중 (analyzing)
↓
처리 중 (in_progress)
↓
해결됨 (resolved) / 오탐 (false_positive)
이 프로젝트는 5편의 시리즈로 연재됩니다:
"상용 SIEM이 없어서 보안을 못 하겠다"는 더 이상 변명이 아닙니다.
오픈소스와 약간의 코딩 실력만 있으면 누구나 실무 수준의 SIEM을 구축할 수 있습니다.
이 프로젝트를 통해:
다음 편에서는 MITRE ATT&CK 프레임워크 기반 위협 탐지 룰을 상세히 다룹니다.
궁금하신 점이나 피드백은 댓글로 남겨주세요!
💡 도움이 되셨다면 GitHub Star와 좋아요 부탁드립니다!
💬 질문이나 개선 아이디어가 있다면 댓글 또는 이슈로 남겨주세요!