2017년 1월 21일 토요일

Snort threshold 옵션 설명 정정

Snort는 로그 발생량을 조절할 수 있는, 즉 개별 패킷 단위로 로그를 발생시키지 않고, 특정 기준별로 묶어서 로그를 발생시키는 threshold 옵션을 제공하는데, 예전에 잘못 설명한 부분이 있어서 정정하고자 한다.

기존 설명의 경우 limit 옵션의 로그 발생 기준은 임계 시간, both 옵션의 로그 발생 기준은 IP라고 했었는데, 최근 강의 준비를 하다가 이상한 점 발견. (이상하게 테스트해보고 싶더라.)

alert icmp any any -> any any \
(msg:"icmp-threshold"; itype:8; \
threshold:type threshold, track by_dst, count 2, seconds 3; \
classtype:TEST; sid:5000017;)

위 룰을 실행한 후 10개의 ICMP request 패킷을 발생시켰다.


결과는 다음처럼 패킷 임계치인 2개 단위로 5개의 로그 발생. threshold 옵션은 이상 없다.


이번에는 limit 옵션.

alert icmp any any -> any any \
(msg:"icmp-limit"; itype:8; \
threshold:type limit, track by_dst, count 2, seconds 3; \
classtype:TEST; sid:5000018;)

임계 시간 단위로만 로그를 발생시킨다고 했는데 3개가 아닌, 7개의 로그가 발생했다.


몇 번을 테스트해봐도 같은 결과. 정신이 번쩍 들었다. 예전에도 분명 테스트했었는데 왜 이러지? 시간 단위로 1개씩만 발생해야 하는데?

정신 바짝 차리자

로그 발생 시간대를 자세히 보니 2개 단위로 연이어 발생한 후, 2~3초 간의 딜레이가 발생한다. 룰 설정이 '3초 간 패킷 2개'이니 3초 단위로 로그를 2개만 발생시킨 것이다. 즉 임계 시간 동안 발생한 패킷 임계치 만큼의 로그를 발생시킨 것.

이번에는 both 옵션.

alert icmp any any -> any any \
(msg:"icmp-both"; itype:8; \
threshold:type both, track by_dst, count 2, seconds 3; \
classtype:TEST; sid:5000019;

IP 단위가 아닌, 임계 시간 단위로 1개씩, 총 3개의 로그를 발생시켰다. 도대체 전에 테스트를 어떻게 한 거냐? ㅡㅡ;


결과는 다음과 같으며, threshold 옵션이 패킷 발생량을 가장 정확히 반영한다는 사실은 변함 없다.


그런데 아무리 생각해도 이상하다. 이렇게 간단히 확인 가능한 결과를 왜 예전 테스트할 땐 몰랐을까? 여태 엉뚱한 얘기를 떠들고 다닌 걸 생각하니 얼굴이 화끈거린다. 강의 때도 패턴매칭 위주의 실습만 이루어지다 보니 이부분은 대충 설명하고 넘어갔었구나.

그런데 나중에라도 설명이 이상하다는 클레임은 없었다. 하긴 Snort를 실무에 사용하는 경우는 거의 없을테니(..) 참고로 'detection_filter'란 옵션도 있는데, 얘는 더 이상하다.

alert icmp any any -> any any \
(msg:"icmp-detection-filter"; itype:8; \
detection_filter:track by_dst, count 2, seconds 3; \
classtype:TEST; sid:5000020;)

테스트 결과 8개의 로그 발생. 테스트를 반복해본 결과 최초 임계치만큼의 패킷 개수를 제외한, 이후에 발생한 모든 패킷에 대해 로그를 남긴다. '3초 간 패킷 2개' 설정 상태에서 10개의 패킷이 발생하면 최초 2개의 패킷은 무시한 후, 나머지 8개의 패킷을 로그로 남기는 것. 결과적으로 어마어마한 로그 발생.


Snort 매뉴얼 보면 threshold 옵션은 앞으로 지원 안 할꺼니까, detection_filter를 사용하라는데 계속 threshold 지원하는 거 보면, 자기들이 봐도 이상한 모양(..)

제대로 테스트한 건지 모르겠다. (의견 환영합니다.^^;)

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스