Fedora 17에서 IPS(침입 방지 시스템) 설정하는 방법

개요
Vuurmuur는 사람이 읽을 수 있는 규칙 문법을 iptables 명령으로 변환해주는 리눅스 방화벽 관리자입니다. 로그 보기, 트래픽 셰이핑, 연결 종료 등 기능을 제공합니다. Suricata는 멀티스레드 기반의 네트워크 IDS/IPS로, IDS와 IPS 모드를 지원하며 HTTP 스트림에서 파일을 추출하는 등 다양한 기능을 제공합니다.
이 문서는 Fedora 17 저장소에 포함된 패키지만 사용해 기능하는 IPS를 구성하는 방법을 제공합니다.
사전 준비
- Fedora 17이 설치된 시스템과 관리자(root) 권한
- 트래픽을 캡처할 물리적 또는 가상 인터페이스 이름(예: eth0)
- 인터넷 연결(규칙 파일 다운로드에 필요)
중요: IPS는 잘못 구성하면 합법적 트래픽을 차단할 수 있습니다. 먼저 IDS(수동) 모드로 충분히 테스트하세요.
Vuurmuur와 Suricata 설치
다음 명령으로 Vuurmuur와 Suricata를 설치합니다:
yum install suricata Vuurmuur-daemon Vuurmuur-tui
설치가 끝나면 다음 섹션으로 넘어갑니다.
Suricata를 IDS(수동) 모드로 실행해 검증하기
IPS로 전환하기 전에 Suricata가 패킷을 올바르게 분석하는지 IDS 모드에서 확인합니다.
- Emerging Threats 무료 규칙을 Suricata 규칙 디렉터리로 가져옵니다:
cd /etc/suricata/
curl -O https://rules.emergingthreatspro.com/open/suricata/emerging.rules.tar.gz
tar xzvf emerging.rules.tar.gz
ln -s /etc/suricata/rules/reference.config /etc/suricata/reference.config
ln -s /etc/suricata/rules/classification.config /etc/suricata/classification.config
cp /etc/suricata/rules/suricata-1.2-prior-open.yaml /etc/suricata/suricata.yaml
- Suricata를 수동 모드로 실행합니다(예: 인터페이스 eth0):
suricata -c /etc/suricata/suricata.yaml -i eth0
몇 분간 실행한 뒤 /var/log/suricata/stats.log와 /var/log/suricata/http.log를 확인해 패킷이 정상적으로 분석되는지 확인합니다. 브라우저로 웹사이트를 열어 트래픽을 생성하는 것이 도움이 됩니다.
중요: 테스트 중에는 Suricata가 로그만 기록하고 트래픽을 차단하지 않습니다.
Vuurmuur를 사용해 Suricata로 트래픽 전달 준비하기
Suricata가 트래픽을 검사하려면 iptables 규칙으로 패킷을 Suricata로 전달해야 합니다. Vuurmuur로 방화벽을 관리합니다.
- vuurmuur_conf를 열고 “Rules”에서 새 규칙을 추가합니다:
accept service any from any to any log
이미지(화면 예시):
- 인터페이스를 Vuurmuur 설정에 추가합니다(예: eth0):
- rsyslog 구성을 조정해 Vuurmuur 로그가 제대로 기록되도록 합니다. /etc/rsyslog.conf에 다음 줄을 추가합니다:
*.debug /var/log/debug
그런 다음 rsyslog를 재시작합니다:
service rsyslog restart
- Vuurmuur 서비스를 시작하고 부팅 시 자동 시작되도록 설정합니다:
service vuurmuur start
systemctl enable vuurmuur.service
vuurmuur_conf의 로그 뷰어에서 트래픽이 흐르는지 확인합니다:
Suricata로 트래픽 전달(IDS → IPS 전환)
모든 트래픽을 Suricata로 전달하려면 Vuurmuur 규칙을 nfqueue로 바꿉니다:
nfqueue service any from any to any
규칙을 변경한 뒤 vuurmuur_conf에서 변경 사항 적용(Apply changes)을 클릭하면 방화벽이 자동으로 업데이트됩니다. 로그뷰어는 nfqueue로 패킷을 전달하는 것을 보여줍니다:
그다음 Suricata를 nfqueue 인라인 모드로 실행합니다(예: q 번호 0):
suricata -c /etc/suricata/suricata.yaml -q0
브라우저를 열어 트래픽이 흐르는지 확인하고 /var/log/suricata/stats.log, /var/log/suricata/http.log를 확인합니다. 예시 로그는 다음과 같습니다.
stats.log 예시(부분):
-------------------------------------------------------------------
Date: 10/8/2012 -- 17:20:08 (uptime: 0d, 01h 39m 02s)
-------------------------------------------------------------------
Counter | TM Name | Value
-------------------------------------------------------------------
decoder.pkts | Decode1 | 3147
... (생략)
detect.alert | Detect | 0
http.log 예시(부분):
10/08/2012-17:24:02.447292 www.howtoforge.com [] / [] Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1 [] 192.168.122.48:48396 -> 188.40.16.205:80
실행 중인 Suricata를 중단한 뒤 /etc/sysconfig/suricata 파일을 열어 서비스 옵션을 설정합니다:
OPTIONS="-q 0 -D --pidfile /var/run/suricata.pid"
그다음 서비스로 시작하고 부팅 시 자동 시작하도록 설정합니다:
service suricata start
systemctl enable suricata.service
특정 트래픽 차단하기
기본적으로 많은 규칙이 alert(경고)로 설정되어 있어 트래픽을 차단하지 않습니다. IPS로서 차단을 테스트하려면 설정을 변경해야 합니다.
- /etc/suricata/suricata.yaml 파일에서 stream 섹션을 찾아 inline을 yes로 설정합니다(스트림 재조립이 IPS에 맞게 동작하도록):
stream:
memcap: 32mb
checksum_validation: yes # reject wrong csums
inline: yes
- Suricata가 로드할 규칙 파일 목록에 local.rules를 추가합니다:
default-rule-path: /etc/suricata/rules/
rule-files:
- local.rules
- emerging-ftp.rules
- emerging-policy.rules
- /etc/suricata/rules/ 디렉터리에 local.rules 파일을 만들고 다음 한 줄을 추가합니다(예시는 facebook.com 차단):
drop tcp any any -> any any (msg:"facebook is blocked"; content:"facebook.com"; http_header; nocase; classtype:policy-violation; sid:1;)
- Suricata를 재시작합니다:
service suricata restart
이제 브라우저에서 http://www.facebook.com/에 접속하면 요청이 타임아웃되거나 차단됩니다. /var/log/suricata/fast.log에 차단 로그가 기록됩니다:
10/06/2012-11:40:49.018377 [Drop] [
] [1:1:0] facebook is blocked [**] [Classification: Potential Corporate Privacy Violation] [Priority: 1] {TCP} 192.168.122.48:57113 -> 173.252.100.16:80
중요: 실제 환경에서는 도메인 기반 차단 규칙은 우회 가능하며 HTTPS 트래픽에서는 SNI나 TLS 암호화로 인해 본 방식으로는 차단이 어렵습니다.
역할별 체크리스트
네트워크 엔지니어
- Suricata가 기대하는 인터페이스를 캡처할 수 있는지 확인
- nfqueue와 Vuurmuur 규칙 검토
- 성능(멀티스레딩, 메모리 상한) 모니터링
보안 운영팀
- 규칙(sid) 변경 로그와 변경 이력 관리
- false-positive 알림 정책 수립
- 차단 시의 사용자 알림/예외 처리 계획
시스템 관리자
- rsyslog와 로그 로테이션 설정
- 서비스 자동 시작 설정(systemctl enable)
- 규칙 파일 권한 및 업데이트 자동화 방법 검토
테스트 케이스와 수용 기준
IDS 모드
- Suricata가 로그를 생성하고 http.log에 정상 접근 로그가 기록되어야 함
- stats.log에 decoder.pkts 등 카운터가 증가해야 함
IPS 모드(차단 테스트)
- local.rules로 지정한 패턴이 포함된 HTTP 요청은 Suricata에 의해 DROP되어야 함
- /var/log/suricata/fast.log에 Drop 이벤트가 기록되어야 함
수용 기준: IDS 모드에서 오탐이 심하지 않으며, IPS 모드에서 의도한 패턴이 안정적으로 차단되는 경우 성공으로 판단합니다.
운영과 보안 하드닝 권장사항
- 규칙 관리: 주기적으로 규칙 업데이트를 검사하되, 배포 전 테스트 환경에서 검증
- 백업 및 롤백: suricata.yaml과 local.rules의 버전 관리(Git 혹은 구성 관리 도구) 유지
- 로깅: 로그는 중앙 로깅 서버로 전송해 장기 보존 및 상관관계 분석에 사용
- 성능: 트래픽이 많은 환경에서는 Suricata의 스레드 수, memcap, nfqueue 큐 길이를 조정
- HTTPS: 암호화된 트래픽은 TLS 종료 지점에서 검사하거나 SNI/JA3 등 메타데이터 기반 탐지 고려
문제 발생 시 점검 목록
- Suricata가 패킷을 받지 못함: Vuurmuur 규칙이 nfqueue로 설정되어 있는지 확인
- 로그가 없음: rsyslog 설정과 /var/log/suricata/* 파일 권한 확인
- 예상보다 많은 오탐: 규칙(특히 content/regex)을 세분화하고 테스트 범위를 좁힘
- 성능 이슈: Suricata를 데몬(-D)으로 실행하고 멀티스레드 설정을 검토
대체 접근법 및 한계
- 대체: iptables 직접 구성 + NFQUEUE를 사용하는 대신 여전히 Vuurmuur 같은 GUI/관리자 도구를 사용하면 규칙 관리가 편리합니다.
- 한계: HTTPS 트래픽, 암호화된 애플리케이션 트래픽, 패킷 재조합 한계로 인해 일부 공격은 탐지/차단이 어렵습니다.
간단 용어집
- IDS: 침입 탐지 시스템(수동으로 탐지, 차단하지 않음)
- IPS: 침입 방지 시스템(능동적으로 트래픽을 차단)
- nfqueue: 커널의 패킷을 사용자 공간으로 전달하기 위한 큐 메커니즘
- inline: Suricata가 스트림을 재조립하여 IPS 동작을 수행하는 설정
추가 자료
- Suricata User Guide
- rule management with oinkmaster
- Vuurmuur user guide
요약
이 가이드는 Fedora 17에서 Vuurmuur와 Suricata를 이용해 IDS에서 시작해 IPS로 전환하는 실제 절차를 제공합니다. 먼저 Suricata를 IDS 모드로 검증한 뒤 Vuurmuur 규칙을 nfqueue로 바꿔 Suricata가 트래픽을 검사하도록 하고, 마지막으로 local.rules에서 drop 규칙을 추가해 차단을 확인합니다. 운영 환경에서는 규칙 관리, 로깅, 성능 튜닝, HTTPS 한계에 대한 보완이 필요합니다.