iptables는 리눅스에 기본적으로 탑재돼있는 IPS 장비
입니다.
IPS 장비이므로 룰에 설정되어있는 패킷이 접근 시 차단해주는 장비입니다.
snort는 기본적으로 설치되어있지 않은 IDS장비
로 룰에 설정된 접근이 감지되면 탐지하여 로그를 남겨주는 기능을 하는 IDS장비입니다.
kali에서 ubuntu로 접근을 시도하는 방식으로 실습을 할 것입니다.
kali ip : 192.168.0.129
ubuntu ip : 192.168.0.128
룰 형식
iptables [규칙] [체인명] [옵션] [타겟]
-A
: 새로운 규칙을 맨 아래에 추가
-I
: 새로운 규칙을 맨 앞에 추가
-D
: 규칙을 삭제
-F
: 체인의 모든 규칙을 삭제
-L
: 해당 체인 룰 출력
ubuntu에서 iptables 룰을 설정합니다.
INPUT
: 외부에서 내부로 들어오는 패킷에 대한 체인
OUTPUT
: 내부에서 외부로 나가는 패킷에 대한 체인
FORWARD
: 현재 서버가 목적지가 아닌 패킷이 통과하는 체인 (NAT 기능을 위해 사용)
ACCEPT
: 패킷을 허용
DROP
: 패킷을 거부 (아무런 반응 없이)
REJECT
: 패킷을 거부 (거부 메세지 전송)
LOG
: 패킷을 syslog에 기록
RETURN
: 해당 체인에서 패킷을 계속 처리
iptables -A INPUT -p tcp -s 192.168.6.129 --sport 31523 -j DROP
발신지 ip 가 192.168.6.129 이고 발신지 포트가 31523인 패킷 거부 (거부 메세지 전송 안함)
iptables -A INPUT -p tcp --dport 23 -j DROP (텔넷 서비스 차단)
칼리에서 접속이 되지 않음
iptables -D INPUT 1 (해당 룰 삭제)바로 연결 됨
-m 옵션으로 여러 모듈을 사용할 수 있습니다.
recent
모듈을 사용해 Flooding 공격 차단 (보통 공격이 들어올 때 로그를 제한하기 위하여 사용)
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 80 -m recent --update --second 60 --hitcount 5 -j DROP
kali에서 hping3로 syn flooding 공격 시 차단되는 모습
snort는 사실 스니핑 도구입니다.
하지만 공격을 탐지위한 스니핑 도구로 특정한 룰을 설정하여 룰에 해당하는 패킷 탐지시 특정 액션을 취하도록 설정합니다.
apt-get update
apt-get install -y snort
설치할 때 ip대역 입력란이 나오는데 자신의 ip 대역 입력
ip가 192.168.54.100이고 서브넷 마스크가 255.255.255.0이면
192.168.54.0/24 입력
설치 후 snort 버전 확인
snort --version
스노트 구동을 위한 의존성 패키지 설치
apt-get install -y gcc libpcre3-dev zlib1g-dev libluajit-5.1-dev libpcap-dev openssl libssl-dev libnghttp2-dev libdumbnet-dev bison flex libdnet autoconf libtool
스노트 daq 설치
wget https://www.snort.org/downloads/snort/daq-2.0.7.tar.gz
tar -xzvf daq-2.0.7.tar.gz
cd daq-2.0.7
./configure && make && make install
snort 소스 코드 다운로드
wget https://www.snort.org/downloads/snort/snort-2.9.20.tar.gz
tar -xzvf snort-2.9.20.tar.gz
cd snort-2.9.20
./configure -enable-sourcefire && make && make sintall
snort.conf 수정
vim /etc/snort/snort.conf 입력 후
ipvar HOME_NET [ip대역] -> 아까 snort 패키지 설치할 때 입력한 ip 대역 입력
include $RULE_PATH 찾아서 모두 주석 처리하고 local_rules만 입력
snort 룰 형식
action 프로토콜 [발신지 ip] [발신지 port] -> [수신지 ip] [수신지 port] (탐지 옵션)
액션 종류
alert
: 해당 룰 일치 시 alert 발생 시키고 로그에 남김
log
: 패킷을 로그에 남김
pass
: 패킷을 무시
drop
: 패킷을 차단하고 로그에 남김
reject
: 패킷을 차단하고 로그에 남기고 거부 메세지 전송
sdrop
: 패킷을 차단하지만 로그에 남기지 않음
alert tcp $EXTERNAL_NET any -> $HOME_NET 80 (content:"GET"; offset:0; depth:3; msg:"GET request"; sid=1000001;)
외부에서 내부로 GET 요청 시 "GET request"라는 메세지 알림
/etc/snort/rules/local.rules에 다음 룰 설정
기본 실행 시
snort –v –c /etc/snort/snort.conf
로깅 실행 시
snort -vde -l /var/log/snort -c /etc/snort/snort.conf
로깅 모드로 실행 했습니다.
칼리에서 ping 전송 icmp패킷 실시간 탐지
cat /var/log/snort/snort.alert.fast
로그 확인 시 "icmp detected" 라는 메세지의 탐지 기록
이상 iptables과 snort 실습을 마치겠습니다.