📚 네트워크 · 패킷 분석 › 06. 방화벽 · IDS 기초 — 291편
이전 글: 290. Suricata Rule 기초 · 다음 글: 292. Brute Force 탐지
Port Scan 탐지는 한 출발지가 짧은 시간에 여러 포트나 여러 호스트에 연결을 시도하는 정찰 행위를 찾아내는 것입니다. 스캔 유형별 패킷 특징과 흔적은 05 영역에서 자세히 다뤘습니다(216. TCP Port Scan 특징, 235. IDS에서 Scan Alert 확인). 이 글은 보안장비의 탐지 로직이 무엇을 세고, 어떤 기준으로 Alert를 내는가를 다룹니다.
스캔은 패킷 하나로는 판단할 수 없습니다. SYN 패킷 하나는 정상 연결의 시작과 같기 때문입니다. 그래서 스캔 탐지는 거의 항상 "일정 시간 안의 개수" 를 기준으로 합니다.
| 탐지 방식 | 세는 대상 | 예 |
|---|---|---|
| 임계치 규칙 | 규칙 일치 횟수(패킷·연결 수) | Suricata·Snort 규칙의 threshold·detection_filter |
| 스캔 전용 모듈 | 서로 다른 포트·호스트 수, 실패 응답 비율 | Snort sfPortscan(2) / port_scan inspector(3) |
| 흐름 집계(SIEM·NDR) | 출발지별 고유 목적지 포트·IP 수 | flow 이벤트·방화벽 로그 집계 |
스캔 탐지 로직이 보는 신호와 판단 흐름입니다.
출발지 X의 트래픽 관찰 (시간 창: 예 60초)
↓
[개수] 새 연결 시도 수, 고유 목적지 포트 수, 고유 목적지 IP 수
↓
[결과] 연결 성립 비율 ↓, RST·ICMP Unreachable 응답 비율 ↑
↓
[패턴 분류]
├─ 한 호스트 × 많은 포트 → 수직(Vertical) 스캔
├─ 많은 호스트 × 한 포트 → 수평(Horizontal) 스캔 / 스윕
└─ 많은 호스트 × 많은 포트 → 블록 스캔
↓ 임계치 초과
Alert (출발지, 대상 범위, 개수, 시간 창)
임계치 규칙의 한계를 알아야 합니다. Suricata·Snort 규칙의 threshold·detection_filter는 규칙 일치 횟수를 셀 뿐, "서로 다른 포트가 몇 개인가"를 세지는 않습니다. 따라서 한 서버에 연결을 많이 여는 정상 클라이언트도 같은 규칙에 걸릴 수 있습니다. 고유 포트 수 같은 기준은 스캔 전용 모듈이나 SIEM 집계가 더 적합합니다.
임계치 설정은 오탐과 미탐 사이의 균형입니다.
| 설정 | 효과 | 부작용 |
|---|---|---|
| 짧은 시간 창·낮은 개수 | 빠른 스캔을 빨리 탐지 | 바쁜 서버·클라이언트 오탐 증가 |
| 긴 시간 창·높은 개수 | 오탐 감소 | 느린 스캔(Slow Scan) 미탐 |
| 외부 출발지만 대상 | Alert 양 감소 | 내부 정찰(감염 호스트) 미탐 |
| 실패 응답 비율 조건 추가 | 정상 대량 연결과 구분 | 방화벽이 응답 없이 폐기하면 판단 어려움 |
임계치 규칙으로 스캔 의심을 탐지하는 형식 예시입니다(Suricata 문법, 값은 환경마다 다름, 임계치는 환경에 맞게 조정 필요).
# 형식 예시 — 같은 출발지에서 10초 안에 SYN 패킷 30개 이상이면 기간당 1회 Alert
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"LOCAL possible TCP SYN scan from external"; flow:stateless; flags:S; threshold:type both, track by_src, count 30, seconds 10; classtype:attempted-recon; sid:1001501; rev:1;)
# 형식 예시 — 내부 → 내부 방향은 더 낮은 임계치로 별도 규칙
alert tcp $HOME_NET any -> $HOME_NET any (msg:"LOCAL possible internal TCP SYN scan"; flow:stateless; flags:S; threshold:type both, track by_src, count 20, seconds 10; classtype:attempted-recon; priority:1; sid:1001502; rev:1;)
분석 방법 — type both는 조건(10초에 30개)을 넘으면 그 기간에 한 번만 Alert를 남깁니다. 따라서 Alert 건수는 스캔 규모가 아닙니다. 실제 규모는 같은 출발지의 flow 이벤트나 방화벽 로그로 고유 포트·호스트 수를 세어 확인합니다.
# 실습 예시 — Alert 출발지의 고유 목적지 포트 수 (Suricata flow 이벤트, 본인 소유 실습망 기준)
sudo jq -r 'select(.event_type=="flow" and .src_ip=="203.0.113.60") | .dest_port' /var/log/suricata/eve.json | sort -u | wc -l
관제자가 스캔 Alert를 볼 때 확인할 질문
스캔 Alert
↓ 방향·출발지 자산 확인 (점검 서버 목록 대조)
↓ 흐름·방화벽 로그로 대상 범위·성립 연결 확인
↓ 후속 활동 검색 (같은 출발지, 이후 시간대)
후속 없음 → 기록·감시
후속 있음 → 공격 단계 연계 분석 (Scan–공격 연관성)
오탐 주의: 취약점 점검 도구, 네트워크 모니터링(포트 헬스체크), P2P·게임 클라이언트, 부하 분산 장비의 상태 확인은 스캔과 비슷한 패턴을 만듭니다. 이런 출발지는 억제 대상 목록으로 관리합니다. 스캔과 공격의 연결은 05 영역 245. Scan과 공격의 연관성 분석, 엔진별 설정은 237. Snort Scan 탐지, 238. Suricata Scan 탐지를 참고합니다.