소개
Snort IDS 입문 실습에 오신 것을 환영합니다.
Snort 는 IP 네트워크에서 실시간 트래픽 분석 및 패킷 로깅을 수행할 수 있는 오픈 소스 네트워크 침입 방지 시스템 (NIPS) 이자 네트워크 침입 탐지 시스템 (NIDS) 입니다. 프로토콜 분석, 콘텐츠 검색 및 매칭을 수행할 수 있으며, 버퍼 오버플로우, 스텔스 포트 스캔, 웹 애플리케이션 공격 등 다양한 공격과 프로브를 능동적으로 차단하거나 수동적으로 탐지하는 데 널리 사용됩니다.
상위 수준에서 IDS 는 패킷 스니퍼와는 다른 질문에 답합니다. 스니퍼는 트래픽을 관찰하도록 돕지만, IDS 는 해당 트래픽 중 주의가 필요한 것이 있는지 판단하려고 합니다. Snort 는 패킷 검사와 규칙 언어를 결합하여 이를 수행합니다. 즉, 원시 트래픽을 보안 관련 이벤트로 변환합니다.
이 실습에서는 Snort 의 기초를 배웁니다. 구성 파일을 살펴보고, 구성 구문을 검증하는 방법을 배우며, Snort 의 두 가지 주요 운영 모드인 스니퍼 모드와 패킷 로거 모드에서 Snort 를 실행해 봅니다.
Snort 구성 파일 검사
이 단계에서는 Snort 가 사용하는 기본 구성 파일을 살펴봅니다. 이 파일을 이해하는 것은 Snort 의 동작 방식, 보호할 네트워크, 적용할 규칙을 결정하기 때문에 매우 중요합니다.
탐지 품질은 컨텍스트에 크게 의존하므로 구성이 중요합니다. 어떤 주소가 자신의 환경에 속하는지 모르는 IDS 는 인바운드 트래픽과 내부 트래픽을 제대로 구분할 수 없습니다. 따라서 HOME_NET과 같은 변수는 단순한 설정이 아닙니다. 이는 Snort 가 방어하는 네트워크를 모델링하는 방식의 일부입니다.
Snort 의 메인 구성 파일은 /etc/snort/snort.conf에 위치합니다. 이 파일에는 네트워크 변수, 규칙 파일 경로, 전처리기 구성 등 다양한 설정이 포함되어 있습니다.
먼저 기본 작업 공간인 프로젝트 디렉토리로 이동합니다.
cd ~/project
Snort 구성 파일에서 가장 중요한 변수 중 하나는 HOME_NET입니다. 이 변수는 Snort 가 보호해야 할 내부 네트워크를 정의합니다. 기본적으로는 any로 설정되어 있어 Snort 가 모든 네트워크 트래픽을 모니터링하게 됩니다.
grep 명령어를 사용하여 구성 파일 내에서 HOME_NET 변수를 검색할 수 있습니다. grep은 파일 내에서 특정 텍스트 패턴을 검색하는 강력한 Linux 도구입니다. 구성 파일은 보호되어 있으므로 관리자 권한으로 명령을 실행하기 위해 sudo를 사용해야 합니다.
sudo grep "ipvar HOME_NET" /etc/snort/snort.conf
다음과 유사한 출력이 표시될 것입니다.
ipvar HOME_NET any
이 출력은 HOME_NET 변수가 현재 any로 설정되어 있음을 확인해 줍니다. 실제 운영 환경에서는 오탐을 줄이고 성능을 향상시키기 위해 이를 특정 내부 IP 서브넷 (예: 192.168.1.0/24) 으로 변경하는 것이 일반적입니다.
더 자세히 살펴보고 싶다면 less 명령어를 사용하여 전체 구성 파일을 볼 수 있지만, 파일이 상당히 깁니다. 지금은 파일의 위치와 주요 변수를 찾는 방법을 아는 것만으로도 충분합니다.
구성 구문 테스트
이 단계에서는 Snort 구성 파일의 구문 오류를 테스트하는 방법을 배웁니다.
배포 전 검증은 중요한 운영 관행입니다. 탐지 규칙이나 구성 파일은 엔진이 실제로 로드할 수 있을 때만 유용합니다. 구문 테스트는 릴리스 전 코드를 컴파일하는 것과 같은 IDS 의 작업으로, 잘못된 변경 사항을 조기에 발견하여 운영 환경의 사각지대를 방지합니다.
snort.conf 파일을 변경할 때마다 Snort 서비스를 시작하거나 재시작하기 전에 구성을 테스트하는 것을 강력히 권장합니다. 오타나 잘못된 구성이 있으면 Snort 가 시작되지 않아 네트워크가 모니터링되지 않을 수 있습니다.
Snort 는 내장된 테스트 모드를 제공합니다. -T 플래그를 사용하여 Snort 에 구성을 테스트하도록 지시하고, -c 플래그를 사용하여 테스트할 구성 파일의 경로를 지정할 수 있습니다.
다음 명령을 실행하여 기본 구성을 테스트합니다.
sudo snort -T -c /etc/snort/snort.conf
Snort 는 네트워크 인터페이스와 시스템 수준 파일에 액세스해야 하므로 관리자 권한을 부여하기 위해 sudo와 함께 실행해야 합니다.
명령이 실행되면 Snort 는 터미널에 많은 정보를 출력합니다. 전처리기를 초기화하고, 규칙을 로드하며, 구문을 검증하는 과정입니다.
출력의 맨 아래로 스크롤합니다. 다음과 같은 성공 메시지를 찾아야 합니다.
--== Initialization Complete ==--
,,_ -*> Snort! <*-
o" )~ Version 2.9.15.1 GRE (Build 68)
'''' By Martin Roesch & The Snort Team: http://www.snort.org/contact#team
Copyright (C) 2014-2019 Cisco and/or its affiliates. All rights reserved.
Copyright (C) 1998-2013 Sourcefire, Inc., et al.
Using libpcap version 1.10.1 (with TPACKET_V3)
Using PCRE version: 8.39 2016-06-14
Using ZLIB version: 1.2.11
Rules Engine: SF_SNORT_DETECTION_ENGINE Version 3.0 <Build 1>
Preprocessor Object: SF_GTP Version 1.1 <Build 4>
Preprocessor Object: SF_CORVUS Version 1.1 <Build 4>
...
Snort successfully validated the configuration!
Snort exiting
여기서 핵심 문구는 Snort successfully validated the configuration!입니다. 이는 snort.conf 파일의 구문이 올바르며 사용할 준비가 되었음을 의미합니다.
스니퍼 모드에서 Snort 실행
이 단계에서는 Snort 를 스니퍼 모드에서 실행합니다.
스니퍼 모드는 Snort 를 사용하는 가장 기본적인 방법입니다. 이 모드에서 Snort 는 네트워크를 흐르는 패킷을 읽고 콘솔에 연속적인 스트림으로 표시합니다. 이는 인기 있는 tcpdump 유틸리티와 매우 유사하게 작동합니다.
IDS 기술도 패킷에서 시작된다는 것을 보여주기 때문에 교육적으로 유용합니다. Snort 가 트래픽에 대해 경고를 보내려면 먼저 해당 트래픽을 올바르게 캡처하고 디코딩해야 합니다. 스니퍼 모드를 먼저 배우면 경고를 마법 같은 것으로 취급하는 대신 패킷 수준의 기초를 계속 볼 수 있습니다.
Snort 를 스니퍼 모드로 실행하려면 -v (verbose) 플래그를 사용합니다. 이는 Snort 에 TCP/IP 패킷 헤더를 화면에 출력하도록 지시합니다.
네트워크 트래픽은 압도적일 수 있고 터미널을 가득 채울 수 있으므로, 숫자와 함께 -n 플래그를 사용합니다. 이는 Snort 에 특정 개수의 패킷만 캡처하고 자동으로 종료하도록 지시합니다.
다음 명령을 실행하여 5 개의 패킷을 캡처하고 표시합니다.
sudo snort -v -n 5
패킷 헤더를 보여주는 다음과 유사한 출력이 표시됩니다.
Running in packet dump mode
--== Initializing Snort ==--
Initializing Output Plugins!
pcap DAQ configured to passive.
Acquiring network traffic from "eth0".
...
05/18-14:32:10.123456 192.168.1.10:54321 -> 8.8.8.8:53
UDP TTL:64 TOS:0x0 ID:12345 IpLen:20 DgmLen:63
Len: 35
...
===============================================================================
Snort exiting
더 자세한 내용을 보고 싶다면 플래그를 결합할 수 있습니다. 예를 들어, -d를 추가하면 패킷의 애플리케이션 데이터 (페이로드) 가 표시되고, -e를 추가하면 링크 계층 (MAC 주소) 헤더가 표시됩니다.
전체 세부 정보 (헤더, 데이터 및 링크 계층 정보) 와 함께 2 개의 패킷을 캡처해 보겠습니다.
sudo snort -vde -n 2
이 모드는 네트워크 연결 문제를 해결하거나 현재 네트워크 인터페이스를 통과하는 트래픽 유형을 빠르게 검사하는 데 매우 유용합니다.
패킷 로거 모드에서 Snort 실행
이 단계에서는 Snort 를 패킷 로거 모드에서 실행하는 방법을 배웁니다.
스니퍼 모드는 실시간 보기에 적합하지만 장기적인 모니터링이나 상세 분석에는 실용적이지 않습니다. 패킷 로거 모드는 캡처된 패킷을 나중에 Wireshark 나 Snort 자체와 같은 도구를 사용하여 분석할 수 있는 형식으로 디스크에 저장함으로써 이 문제를 해결합니다.
경고와 패킷은 서로를 보완하므로 저장된 패킷 증거는 중요합니다. 경고는 규칙이 실행되었음을 알려줍니다. 패킷 기록을 통해 실제로 무슨 일이 일어났는지 확인하고 경고 요약에 포함되지 않을 수 있는 세부 정보를 조사할 수 있습니다. 성숙한 모니터링 스택은 종종 둘 다 보존합니다.
먼저 로그 파일을 저장할 디렉토리를 만들어야 합니다. 프로젝트 폴더 안에 snort_logs라는 디렉토리를 만듭니다.
mkdir -p ~/project/snort_logs
Snort 를 패킷 로거 모드로 실행하려면 -l 플래그 뒤에 로그 디렉토리 경로를 지정합니다. 또한 전체 패킷 세부 정보를 캡처하기 위해 -dev를 사용하고, 종료하기 전에 정확히 10 개의 패킷을 캡처하기 위해 -n 10을 사용합니다.
다음 명령을 실행합니다.
sudo snort -dev -l ~/project/snort_logs -n 10
Snort 는 10 개의 패킷을 캡처하여 지정한 디렉토리에 기록합니다. 이번에는 패킷이 화면에 출력되지 않지만 초기화 및 종료 요약은 볼 수 있습니다.
Snort 실행이 완료되면 snort_logs 디렉토리의 내용을 나열하여 로그 파일이 생성되었는지 확인할 수 있습니다.
ls -l ~/project/snort_logs
다음과 같이 타임스탬프가 붙은 snort.log. 파일이 보여야 합니다.
total 4
-rw------- 1 root root 1234 May 18 14:45 snort.log.1684421100
이 파일은 이진 형식 (pcap) 으로 저장됩니다. nano나 cat 같은 텍스트 편집기로 직접 읽을 수 없습니다. 대신 일반적으로 tcpdump 같은 도구를 사용하거나, 추가 분석을 위해 -r (read) 플래그를 사용하여 Snort 로 다시 읽어 들입니다.
요약
축하합니다! Snort IDS 입문 실습을 성공적으로 완료했습니다.
이 실습에서 Snort 의 기본 개념을 배웠습니다. 메인 구성 파일 (snort.conf) 을 살펴보고, 시작 오류를 방지하기 위해 -T 플래그를 사용하여 구문을 검증하는 방법을 배웠습니다. 또한 터미널에서 실시간 네트워크 트래픽을 보기 위해 스니퍼 모드에서 Snort 를 실행하고, 향후 분석을 위해 캡처된 패킷을 디렉토리에 저장하기 위해 패킷 로거 모드에서 실행하는 연습을 했습니다. 이러한 기초 기술은 네트워크 보안 모니터링 및 침입 탐지를 위해 Snort 를 활용하려는 모든 사람에게 필수적입니다.



