인터넷 ------------- 방화벽 ------------- WAN(라우터)LAN ------------- IPS ------------- 스위치 ------------- 호스트
ASA pfsense SecurityOnion Selinux / iptables
N-IDS firewalld / ufw
---------------------- H-IDS
tcpwrapper
apache(httpd) + security
● snort
snort : 패킷을 스니핑하여 탐지하는 패킷 탐지 툴
H-IDS ~> 솔루션 : Snort
환경 : CentOS 7
● 설치
필수 : epel-release 설치 확인
: sudo yum install -y gcc flex bison zlib libpcap pcre libdnet tcpdump
: yum -y install libnghttp2
에러 발생 시 : yum makecache
---------------------------------------------------------------------------------------------------- : snort를 설치하기 위한 기본 준비
rpm 패키지 다운로드 사이트
: http://rpmfind.net/linux/rpm2html/search.php?query=rpm
오늘 설치할 패키지는 daq-2.0.6-1.el7.x86 64.html이다.
설치 명령어
1) rpm -Uvh daq-2.0.6-1.el7.x86_64.rpm
2) yum -y install http://rpmfind.net/linux/epel/7/x86_64/Packages/d/daq-2.0.6-1.el7.x86_64.rpm
3) yum -y install daq
1. wget https://www.snort.org/downloads/archive/snort/snort-2.9.9.0-1.centos7.x86_64.rpm
2. yum -y install snort-2.9.20-1.centos.x86_64.rpm
snort 설치 과정에서 새로운 라이브러리 (공유 라이브러리)들을 적용해야 한다.
적용 명령어 : ldconfig
: 설치 후 실행을 시켜보니 오류가 발생하였다.
~> libdnet 공유 라이브러리를 못찾아서 생긴 오류
해결 방법
: ln -s /usr/lib64/libdnet.so.1.0.1 /usr/lib64/libdnet.1
: 정상적으로 동작 확인. (꿀꿀)
● snort 파일 위치
: /usr/sbin/snort
snort는 snort:snort인 계정을 생성한다.
만약 계정이 없을 시
: useradd snort -s /bin/false -c Snort -g snort -d /var/log/snort
확인사항
1) /etc/snort 디렉터리 생성 여부.
2) /var/log/snort
3) /usr/local/lib/snort_dynamicrules
없을 시
mkdir /usr/local/lib/snort_dynamicrules
sudo chmod -R 5775 /usr/local/lib/snort_dynamicrules
sudo chown -R snort:snort /etc/snort
sudo chown -R snort:snort /var/log/snort
sudo chown -R snort:snort /usr/local/lib/snort_dynamicrules
sudo touch /etc/snort/rules/white_list.rules
sudo touch /etc/snort/rules/black_list.rules
sudo touch /etc/snort/rules/local.rules
● snort 설정파일
설정 파일 위치
: /etc/snort/snort.conf
ipvar HOME_NET any
------ : 변수 선언
---------------- : 변수의 이름
----- : 리터럴
선언된 변수 호출하는 방법 : $HOME_NET
참고
ipvar EXTERNAL_NET any <~>
: 패스 룰 파일들이 상대경로로 되어있는데, 인식을 못하는 경우가 있으니 절대경로로 변경해준다.
: 550번 ~ 653번까지 주석처리
~> /etc/snort/rules 안에 저런 파일들이 없다.
include하게 되면 오류 발생
설정 후 변경사항 저장
snort -T -c /etc/snort/snort.conf
--- : TFT
--------------------------- : snort 설정 파일
실제 snort 실행시키는 명령어
: snort -A console -i ens33 -u snort -g snort -c /etc/snort/snort.conf
Snort 실행 쉘 생성
매번 명령어를 입력하기 귀찮으니 snort를 실행시키는 쉘을 생성하였다.
: 기본 설정 완
● snort rules 설정
설정 파일 위치
: /etc/snort/rules/local.rules
: ens33포트로 들어오는 모든 네트워크 대역의 icmp패킷을 감시.
: 확인
: 종료 후 로그 저장 파일로 가보니 로그가 생성되어 있다.
로그파일 보는 방법
: snort -r 파일 이름
명령어 : snort -r snort.log.1689129160snort -r snort
● snort, tcpdump
snort 실행 명령 : snort -A console -i ens33 -c /etc/snort/snort.conf -b
--- : 필터링 된 Data를 bin형태로 전달 ~> tcpdump로 확인
tcpdump실행 명령 : tcpdump -xX -i ens33 icmp -w icmp.pcap
핑을 보낸 후 확인
snort tcpdump
Snort Rules
snort rules ~> 룰셋 : 시그니처 구조
------------ : SIGN : sign
Rule 헤더
alert icmp any any -> 192.168.0.146/32 any
- Action : alert
- Protocol : icmp
- 첫번째 any : Src.IP or Src.NI
- 두번째 any : Src.Port
- 192.168.0.146/32 : Dst.IP or Dst.NI
- 세번째 any : Dst.Port
Action
Action : pass-> 패킷 무시
drop : 패킷 차단 및 로그 기능(IPS 기능) : 조건 : in-line
sdrop : 패킷 차단 로그 기능 X
reject : 패킷 차단 및 로그 기록(TCP - RST응답)
(UDP - ICMP Unreachable 응답)
*alert : 경고 발생 ~> 화면 출력 및 로그 기능
log : 로그 기록
IP
192.168.0.146/32 ~> 특정 호스트
192.168.0.0/24 ~> 특정 네트워크
[1.1.1.0/24, 2.2.2.0/24] ~> 2개의 네트워크 지정
!1.1.1.0/24 ~> 1.1.1.0/24를 제외한 나머지 서브넷
$HOME_NET ~> 내부 ip
$EXTERNAL_NET ~> 외부 ip
$RISUT_SERVER ~> snort.conf에 사전 정의된 변수값
Port
- 80 ~> 단일 port
- 1:100 ~> 1~100 port
- !80 ~> 80을 제외한 나머지 포트
- any
방향 지정
-> : 요청 패킷에 대한 탐지
<- : 응답 패킷에 대한 탐지
<> : 요청, 응답 모두 탐지
옵션
(msg : "icmp"; sid : 10000001; rev : 001;)
- msg : 경고 이벤트 메세지
- sid : Rule 식별자 (추천 : 3000000이상을 권장, 회사 내규에 맞게 사용)
- rev : Rule 버전 ~> 수정 될 때 마다 1씩 증가시킨다. (수동)
- sameip : Src.ip와 Dst.ip가 같은 경우
Flag ( URG, ACK, PSH, RST, SYN, FIN )
TCP 플래그, 가장 사용이 많은 6가지 종류의 플래그가 있으며 상태를 나타낸다.
TCP Flag 혹은 Control bits이라고 부른다.
플래그 종류
: NS, CWR, ECE, URG, ACK, PSH, RST, SYN, FIN
각 플래그는 자신의 역할이 있으며 각 1비트를 사용하여 통신
- priority (값이 작을수록 먼저 매칭) 범위: 1~10 priority:1;
- classtype snort룰셋 분류 classtype:xss
- reference 취약점 참고 배포 URL정보 referance: 참고 홈페이지 http://kong.com
예시)
# ICMP
alert icmp any any -> $HOME_NET any (msg:"## ICMP Echo ##"; itype:8; sid:1000001; rev:1;)
alert icmp $HOME_NET any -> any any (msg:"## ICMP Echo-Reply ##"; itype:0; sid:1000002; rev:1;)
# FTP
alert tcp any any -> $HOME_NET 21 (msg:"## FTP Request ##"; content:"USER"; sid:1000003; rev:1;)
alert tcp $HOME_NET 21 -> any any (msg:"## FTP Response ##"; content:"vsFTPd"; sid:1000004; rev:1;)
# TELNET
alert tcp any any -> $HOME_NET 23 (msg:"## Telnet Request ##"; sid:1000005; rev:1;)
alert tcp $HOME_NET 23 -> any any (msg:"## Telnet Response ##"; content:"login"; sid:1000006; rev:1;)
# Web
alert tcp any any -> $HOME_NET 80 (msg:"## HTTP Request ##"; sid:1000007; rev:1;)
alert tcp $HOME_NET 80 -> any any (msg:"## HTTP Response ##"; sid:1000008; rev:1;)
# SSH
alert tcp any any -> $HOME_NET 22 (msg:"## SSH Request ##"; sid:1000009; rev:1;)
alert tcp $HOME_NET 22 -> any any (msg:"## SSH Response ##"; content:"login"; sid:1000010; rev:1;)