침입차단 시스템(iptables)
IPS(Intrusion Prevention System)의 대표적 오픈소스 솔루션으로 리눅스 방화벽을 통과하는 모든 패킷에 대한 연결 상태를 추적하여 이 정보를 메모리에 기억하고 있다가 기존의 연결을 가장하여 접근할 경우 메모리에 저장된 상태 목록과 비교하여 적합하면 통과하고 그렇지 않으면 거부하는 솔루션
iptables [Table] -[ A | I | D ] [Chain] [Rule] [Target]
1) -A : append mode, 해당 체인의 제일 마지막에 룰을 추가한다.
2) -I : insert mode, 해당 체인의 첫 행에 룰을 추가한다.
3) -D : delete mode, 해당 룰을 삭제한다.
[Chain]
1) INPUT Chain : 방화벽을 최종 목적지로 하는 체인
2) OUTPUT Chain : 방화벽을 최초 출발지로 하는 체인
3) FORWARD Chain : 방화벽을 통과하는(경유하는) 체인
[Rule]
1) -s [IP 또는 IP 대역] : Source IP를 명시한다. 명시하지 않으면 any IP를 의미
2) -d [IP 또는 IP 대역] : Destination IP를 명시한다. 명시하지 않으면 any IP를 의미
3) --sport [포트 번호] : 출발지 포트를 명시한다.
4) --dport [포트 번호] : 목적지 포트를 명시한다.
5) --icmp--type [메시지 타입] : 메시지타입을 명시한다.
6) --tcp-flags [검사할 플래그 리스트] [설정되어야 할 플래그 리스트]
ex. --tcp-flags SYN,FIN SYN,FIN
SYN, FIN 플래그만을 검사해서 SYN, FIN 플래그가 설정된 패킷을 탐지한다. 즉 SYN, FIN 이외에 다른 플래그가 설정되어 있어도 SYN, FIN만 설정되어 있으면 이를 탐지한다.
ex. --tcp-flags ALL SYN,FIN
모든 플래그(ALL)를 검사해서 SYN, FIN플래그만 설정된 패킷을 탐지한다. 즉, SYN, FIN이외의 다른 플래그가 설정 되어 있지 않은 경우에만 탐지한다.
-m state --state [탐지할 상태(NEW, ESTABLISHED, RELATED, INVALID]: TCP 상태 기능을 사용
* NEW : 최초로 들어온 패킷의 상태를 말한다. (일반적으로 TCP의 경우 SYN 패킷이 해당된다.)
* ESTABLISHED : 상태추적 테이블에 연결정보를 가지고 있는 패킷의 상태
* RELATED : 상태추적 테이블에 연관된 연결정보를 가지고 있는 패킷의 상태를 말한다. 연관이 되었다는 의미는 연결시의 포트 정보가 서비스 수행 중에 새롭게 추가될 수 있는데 이러한 서비스의 패킷은 연관된 상태가 된다.(FTP에 21/tcp로 제어채널 형성후 20/tcp 데이터 채널을 형성하는 경우)
* INVALID : 어떤 상태에도 해당되지 않는 패킷 상태를 의미한다. 연결 상태를 알 수 없거나 잘못된 헤더를 가지고 있는 경우를 의미한다.
[Target]
1) -j ACCEPT : 해당 패킷을 허용한다.
2) -j DROP : 해당 패킷을 차단한 후 아무런 응답 메시지도 전송하지 않는다.
3) -j REJECT : 해당 패킷을 차단한 후 ICMP 에러 메시지로 응답한다.
4) -j LOG : 탐지 로그를 남긴다. (/var/log/messages)
iptables -L [Chain] -n
IP와 Port를 숫자형식으로 출력하여 해당 체인에 등록된 룰 리스트를 확인한다.
iptables -F [Chain]
해당 체인에 등록된 모든 룰 정보를 삭제한다.
iptables -P [Chain] [ ACCEPT | DROP | REJECT ]
해당 체인의 모든 룰에 매치되지 않으면 기본 정책을 지정
침입 차단시스템(iptables) 실습
(가) 위조된 TCP SYN 패킷을 차단하기 위한 룰 설정
1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2) iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "[Forged SYN Packet]"
3) iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
(나) FTP Active Mode 상태추적 기능 테스트
1) iptables -P INPUT DROP
2) iptables -P OUTPUT DROP
3) iptables -A INPUT -m state --state ESTABLISHED -j LOG --log-prefix "[FTP INPUT_ESTABLISHED]"
4) iptables -A INPUT -m state --state RELATED -j LOG --log-prefix "[FTP INPUT_RELATED]"
5) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
6) iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j LOG --log-prefix "[FTP INPUT_NEW]"
7) iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT
8) iptables -A OUTPUT -m state --state ESTABLISHED -j LOG --log-prefix "[FTP OUTPUT_ESTABLISHED]
9) iptables -A OUTPUT -m state --state RELATED -j LOG --log-prfix "[FTP OUTPUT_RELATED]"
10) iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCPET
- connlimit 모듈 : 동일한 IP 또는 IP 대역의 동시 연결 개수에 대한 제한 (디도스 공격에 효과적)
1) --connlimit-above n : n을 초과하는 동시 연결을 제한한다.
2) --connlimit-mask mask : 0~32범위의 mask값을 지정해 IP 대역에 대한 동시 연결을 제한한다.
(다) 웹서버(80/tcp)에 대한 TCP SYN Flooding 공격을 대응하기 위한 룰 설정1
1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2) iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j LOG --log-prefix "[CONNLIMIT]"
3) iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j DROP
4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
(라) 웹서버(80/tcp)에 대한 TCP SYN Flooding 공격에 대응하기 위한 룰 설정2
1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2) iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j LOG --log-prefix "[CONNLIMIT]"
3) iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 --connlimit-mask 24 -j DROP
4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
- limit 모듈 : 룰에 매치되는 비율을 제한할 수 있는 기능으로 불필요한 로그를 남기지 않도록 할 때 유용
limit [n/second(또는 s) | n/minute(또는 m) | n/hour(또는 h) | n/day(또는 d)]
초당/분당/시간당/하루당 매칭되는 제한건수를 지정한다.
(마) 비정상적인 TCP 플래그 조합(SYN_FIN 플래그 조합) 패킷 차단 룰 설정1
1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2) iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN -m limit --limit 6/minute -j LOG --log-prefix "[LIMIT]"
3) iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP
4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
(마) 비정상적인 TCP 플래그 조합(SYN_FIN 플래그 조합) 패킷 차단 룰 설정2
1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2) iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 1/second -j LOG --log-prefix "[LIMIT]"
3) iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
(바) 비정상적인 TCP 플래그 조합(FIN 플래그만 설정) 패킷 차단 룰 설정
1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2) iptables -A INPUT -p tcp --tcp-flags ALL FIN -m limit --limit 1/second -j LOG --log-prefix "[LIMIT3]"
3) iptables -A INPUT -p tcp --tcp-flags ALL FIN -j DROP
4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
(사) 비정상적인 TCP 플래그 조합(NULL 플래그 설정) 패킷 차단 룰 설정
1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2) iptables -A INPUT -p tcp --tcp-flags ALL NONE -m limit --limit 1/second -j LOG --log-prefix "[LIMIT4]"
3) iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
(아) 비정상적인 TCP 플래그 조합(XMAS 플래그 설정) 패킷 차단 룰 설정
1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2) iptables -A INPUT -p tcp --tcp-flags ALL ALL -m limit --limit 1/second -j LOG --log-prefix "[LIMIT5]"
3) iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
- recent 모듈 : 동적으로 Source IP 목록을 생성하여 이를 기반으로 패킷을 제어하는 기능을 제공하는 모듈
(자) SSH Brute Force/Dictionary Attack 차단 룰 설정
1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2) iptables -A INPUT -m state --state NEW -p tcp --dport 22 -m recent --name SSH_DROP --set
3) iptables -A INPUT -m state --state NEW -p tcp --dport 22 -m recent --name SSH_DROP --update --seconds 60 --hitcount 5 -j LOG --log-prefix "[SSH Brute Force Drop]"
4) iptables -A INPUT -m state --state NEW -p tcp --dport 22 -m recent --name SSH_DROP --update --seconds 60 --hitcount 5 -j DROP
5) iptables -A INPUT -m state --state --state NEW -p tcp --dport 22 -j ACCEPT
감사합니다.
'Security > Network' 카테고리의 다른 글
[Infra] Security Onion 설치 (0) | 2021.10.08 |
---|---|
Snort 정의 및 예제 (0) | 2021.09.02 |
Proxy (Forward proxy & Reverse proxy) (0) | 2020.11.27 |
라우팅 (Routing) (0) | 2020.11.24 |
미러링(Mirroring) / 인라인(In-line) 모드 (0) | 2020.11.16 |