IP Filter
SUN 제품 및 BSD계열 등에서 지원하는 IpFilter는 Sun Server에 사용할 수 있는 좋은 Freeware의 Packet Filter로 시스템 및 네트워크 보안에 아주 강력한 기능을 보유한 소프트웨어 이다. Stateful 패킷 필터이며 커널 모듈과 사용자 유틸리티로 구현되어있다.
IpFilter에서 하는일
- 불필요한 패킷은 버린다.
- 필요에 따라 패킷을 자른다
- 정상적인 처리는 커널을 통과시켜 사용자 프로그램에게 보낸다
1. Installing IP Filter
솔라리스용 바이너리 IP Filter는 http://www.maraudingpirates.org/ipfilter/ 에서 다운로드 받을 수 있다. 32비트 커널 모듈과 64비트 커널 모듈로 컴파일 되어 있다.
2. IP Filter Configuration
IP Filter의 구성파일은 /etc/opt/ipf/ipf.conf 이다. /etc/init.d/ipfboot , /etc/rc2.d/S65ipfboot 스크립트에의해 시스템이 런레벨 2 로 부팅될 때 구동된다. IP Filter의 Rules의 문법은 다음 형식이며, 룰은 위에서 아래로 순서대로 적용되며 하나에 대해 여러 개의 룰을 정의하게 되면 가장 마지막에 정의한 룰이 적용된다.
IP Filter의 rule 형식> action direction packet
action은 패킷의 처리 방식을 지정한다. block 은 통과시키지 않는 rule이며, pass 는 통과 시키는 rule이다.
direction 은 패킷의 방향이다. in 은 IP Filter로 들어오는 패킷에 대한 정책이며, out 은 패킷필터를 통해 나가는 패킷에 대한 정책이다.
3. IP Filtering Rules
기본적인 룰은 입력되는 모든 패킷에 대해 블록 시키며 나가는 모든 패킷에 대해 통과 시키는 정책이다. 패킷 정책 설정은 다음과 같다.
block in all
pass out all
(1) Matching Packets
패킷의 패턴 매칭은 패킷의 내용을 비교하여 매치되는 패킷에 대해서 정책을 적용한다.
block in from 192.168.0.0/24 to any
>> 송신자의 IP주소가 192.168.0.0 망에서 오는 모든 패킷은 막는다
pass in on hme0 all
>> 인터페이스 hme0로 들어오는 모든 패킷은 통과시킨다.
block in proto icmp all
>> 모든 들어오는 ICMP 패킷은 막는다.
Block in proto icmp-type echo
>> 모든 들어오는 ICMP echo 패킷은 막는다.
Block in proto tcp all port = 513
>> 모든 들어오는 tcp 513(rlogin)번 패킷은 막는다.
block in on hme0 proto udp from 192.168.0.0/24 to any port = 2049
block in on hme0 proto tcp from 192.168.0.0/24 to any port = 2049
>> 192.168.0.0망에서 hme0 인터페이스로 들어오는 NFS 요청은 모두 블럭한다.
(2) Bypassing Rules
quick 키워드는 모든 패킷에 대해 적용하는 절대적인 룰을 의미한다. 보통의 경우 룰의 처음부터 끝까지 비교하면서 제일 마지막 매치되는 패턴의 룰을 적용받지만 그럴 필요가 없는 경우 quick 키워드를 사용하여 더 이상 패턴 비교를 하지 않도록 설정할 수 있다.
block in quick from 192.168.0.0/24 to any
>> 192.168.0.0망에서 들어오는 모든 패킷은 블록시키고 더 이상 패턴 매칭 검사를 하지 않는다. group 룰을 사용하면 방화벽을 좀더 효율적으로 관리할 수 있다. hme0 의 패킷은 적당한 hme0의 룰에 의해 처리된다.
block in log quick proto udp from any to any port=161
>> 모든 SNMP 패킷을 블록 시킨다.
(3) IP Filter Logging
기본적으로 모든 룰 작동은 기록을 남기지 않는다. 하지만 log 라는 키워드를 사용하면 rule 작동에 대한 기록을 로그로 남길 수 있다.
Logging에서 사용되는 Rule Keyword
log : rule작동에 대한 기록을 남긴다
log first : 첫번째 TCP세션의 패킷만 기록한다.
log body : 패킷의 헤더와 payload의 128비트를 기록한다.
log level facility.level : syslog가 로그를 기록하도록 설정
dup-to : 지정 인터페이스가 목적지인 패킷을 복사한다.
to : 패킷을 지정한 인터페이스로 리다이렉트한다.
block in log quick proto tcp from any to any port=12345
block in log quick proto tcp from any to any port=12346
block in log quick proto tcp from any to any port=20034
block in log quick proto tcp from any to any port=31337
>> 모든 Back Orifice 와 NetBus 패킷을 블록 시키며 룰 동작에 대한 로그를 남긴다.
block in log-first quick on hme0 proto tcp from any to 192.168.0.1/32 port=80
>> 192.168.0.1 서버로 웹서비스를 요청하는 패킷을 블럭 시키고 첫번째 TCP 세션 패킷을 로그로 남긴다.
# /sbin/ipmon -s
>> ipmon명령을 사용하여 로깅디바이스인 /dev/ipl을 모니터링하고, 시스템 로그로 이벤트를 전송한다.
이제 패킷이 로깅되도록 rule을 작성해 보자
block in quick on hme0 to hme1 proto tcp from any to any port = 23
>> hme0 로 들어오는 모든 telnet 패킷을 hme1으로 보낸다. 이 경우 snort이 hme1을 listen하고 있다고 가정한다.
pass in quick on hme0 dup-to hme1 from any to 192.168.0.1/32 port = 80
pass in quick on hme0 dup-to hme1 from any to 192.168.0.1/32 port = 443
>> hme0 로 들어오는 192.168.0.1로 가는 웹서비스 요청 패킷은 hme1으로 복사된다. 이 경우 hme1은 snort이 listen하고 있는 인터페이스로 설정되어 있는경우다.
(4) Stateful Filtering
기본적으로 IP Filter는 네트웍 크래픽 처리에 관한 상태 정보를 추적하지 않고 각각의 패킷을 각각의 이벤트로 처리한다. 하지만 "keep state" 키워드를 사용하면 세션에 속해있는 패킷의 상태를 추적하여 매칭 시키는 룰을 작성할 수 이다.
UDP같은 경우 stateless통신을 하므로 "세션"이라는 개념이 없다. 나가는 패킷의 소스와 목적지 포트를 관찰해 두었다가 들어올 때 확인하는 방법으로 상태를 추측해서 관리한다.
block in quick on hme0 all
pass out quick on hme0 proto icmp from 192.168.0.23 to any keep state
pass out quick on hme0 proto tcp from 192.168.0.23 to any keep state
pass out quick on hme0 proto udp from 192.168.0.23 to any keep state
>> 이 룰은 먼저 모든 들어오는 트래픽은 블럭시킨다. 그런다음 192.168.0.23에서 초기화된 ICMP,TCP,UDP패킷은 제한없이 나갈 수 있다.
(5) Advanced Packet Matching
“flags"키를 statefule 필터링과 연동해서 사용하게 되면 들어오는 패킷이 세션의 어디에 속하는 지를 정확하게 체크 할수 있으므로 스텔스 스캔과 같은 패킷을 효과적으로 막을 수 있다.
block in quick proto tcp from any to any port = 23 flags S
>> port 23으로 SYN flag가 설정되어 들어오는 패킷은 막는다.
pass in quick proto tcp from any to 192.0.2.42/32 port = 22 flags S keep state
block in quick from any to 192.0.2.42/32
>> 들어오는 SSH 트래픽은 허용하고 나머지는 모두 막는다.
pass in quick proto tcp from any to 192.0.2.42/32 port = 22 flags S keep state keep flags
>> "keep frags" 키워드는 필터링을 하기 전에 패킷 재조합을 한다.
(6) IP Filter Stealthiness
효율적인 방화벽을 구축하기위한 룰들에 대해 알아보았다. 그러나 이러한 것에는 중요한 한가지 결점이있다. 가장 바람직한 방화벽은 공격자가 방화벽이 있다는 것을 인식하지 못하도록 하는것이다. 디폴트 동작으로 IP Filter는 필터링된 패킷을 버린다. 이러한 것들이 방화벽이 중간에 존재한다고 알리는 역할을 하게 되는것이다.
block return-rst in proto tcp from any to 192.0.2.42/32 port = 23
>> "return-rst"키워드를 사용하여 필터링 패킷에 대해 "RST" 응답을 하도록 구성하는것이다.
block return-icmp(port-unr) in proto udp from any to 192.0.2.42/32 port = 69
>> non-listening UDP포트에는 ICMP port-unreachable packet을 응답한다.
앞의 두가지 형태의 응답은 ICMP에러패킷에 소스의 IP가 포함되는데 원래 목적지의 IP가 아닌 방화벽의 IP가 들어가는점이 문제가 된다. 그래서 원래 목적지 IP를 소스IP 대신 집어넣어서 port-unreachable패킷을 전송하게 하는 키워드가 "return-icmp-as-dest"이다.
block return-icmp-as-dest(port-unr) in proto udp from any to 192.0.2.42/32 port = 69
>> ICMP 에러 패킷의 payload에 들어가는 소스의 IP주소를 원래 목적지로 변경한다.
block in quick fastroute proto u에 from any to any port 33434 >< 33465
>> “fastroute" 키워드를 사용하면 TTL값을 감소시키지 않도록 한다. 모든 들어오는 traceroute에대해 패킷의 TTL값을 감소시키지 않고 처리한다.
4. IP Filter Tools
IP 필터는 추가적인 커널 모듈과 여러 가지의 유틸리티를 제공한다. ipf 유틸리티는 기본적인 룰셋을 구현하기위한 기본명령이다.
# /sbin/ipf -Fa -f /etc/opt/ipf/ipf.conf
>> ipf.conf 파일로부터 방화벽정책을 읽어서 설정한다.
# /sbin/ipfstat
>> IP Filter의 퍼포먼스 상태를 요약해서 출력해 준다.
# /sbin/ipfstat -oh
# /sbin/ipfstat -ih
>> outbound, inbound 에 적용된 룰을 보여준다. 그리고 룰이 적용된 횟수도 출력해 준다.
# /sbin/ipfstat -s
>> state table의 demp를 출력한다.
# /usr/sbin/ipmon -s
>> log 를 syslogd에게 넘겨서 처리한다.
방화벽 설정에 대한 테스를 위한 유틸리티들도 같이 제공되고 있다.
# ipftest
>>rule list 를 테스트
# iptest
>> 기형의 패킷을 전송
# ipsend
>> sendip와 같이 패킷을 만들어서 전송한다.
# ipresend
>> snoop이나 tcpdump 데이타 파일에 있는 기록을 "play back"으로 사용한다.
5. IP Filter Extensions
laba는 http://inc2.com/isba 사이트에서 다운로드 받을 수 있다. isba는 IP 필터의 관리를 위한 강력한 그래픽 인터페이스를 제공하는 패키지이다. isba를 사용하면 그래픽 에디터를 사용하여 쉽게 정책을 정의하거나 수정하는 작업을 할 수 있다. 또한 리모트 관리 콘솔을 지원하고 있다. SSH 터널을 사용하여 중앙 웍스테이션에서 엔터프라이즈 방화벽을 관리할 수 있다. 이 패키지는 프리라이센스의 소스코드로 제공되고 있으며, 이 패키지를 설치하기 위해서는 Perl 과 Perl/TK 라이브러리가 설치되어 있어야 한다.
fwanalog는 http://tud.at/programm/fwanalog/ 에서 다운로드 받을 수 있다. 이 패키지는 프리 라이센스 의 간단한 본쉘 스크립트로 작성되어 있다. 이 스크립트는 IP필터의 로그를 분석하여 요약하여 결과를 그래프로 생성하거나 웹 기반의 보고서를 생성하는 작업을 한다. cron을 기반으로 시간마다 실행하게 하여 시간대별 리포트 분석을 할 수 있다. fwanalog는 웹 로그 분석을 위해 analog 패키지가 설치되어 있어야 한다. analog는 가장 만힝 사용되고 있는 웹 로그를 분석하는 패키지로 http://www.analog.cx/ 사이트에서 Solaris 환경의 소스코드 또는 바이너리 파일을 다운로드 받을 수 있다.
SUN 제품 및 BSD계열 등에서 지원하는 IpFilter는 Sun Server에 사용할 수 있는 좋은 Freeware의 Packet Filter로 시스템 및 네트워크 보안에 아주 강력한 기능을 보유한 소프트웨어 이다. Stateful 패킷 필터이며 커널 모듈과 사용자 유틸리티로 구현되어있다.
IpFilter에서 하는일
- 불필요한 패킷은 버린다.
- 필요에 따라 패킷을 자른다
- 정상적인 처리는 커널을 통과시켜 사용자 프로그램에게 보낸다
1. Installing IP Filter
솔라리스용 바이너리 IP Filter는 http://www.maraudingpirates.org/ipfilter/ 에서 다운로드 받을 수 있다. 32비트 커널 모듈과 64비트 커널 모듈로 컴파일 되어 있다.
2. IP Filter Configuration
IP Filter의 구성파일은 /etc/opt/ipf/ipf.conf 이다. /etc/init.d/ipfboot , /etc/rc2.d/S65ipfboot 스크립트에의해 시스템이 런레벨 2 로 부팅될 때 구동된다. IP Filter의 Rules의 문법은 다음 형식이며, 룰은 위에서 아래로 순서대로 적용되며 하나에 대해 여러 개의 룰을 정의하게 되면 가장 마지막에 정의한 룰이 적용된다.
IP Filter의 rule 형식> action direction packet
action은 패킷의 처리 방식을 지정한다. block 은 통과시키지 않는 rule이며, pass 는 통과 시키는 rule이다.
direction 은 패킷의 방향이다. in 은 IP Filter로 들어오는 패킷에 대한 정책이며, out 은 패킷필터를 통해 나가는 패킷에 대한 정책이다.
3. IP Filtering Rules
기본적인 룰은 입력되는 모든 패킷에 대해 블록 시키며 나가는 모든 패킷에 대해 통과 시키는 정책이다. 패킷 정책 설정은 다음과 같다.
block in all
pass out all
(1) Matching Packets
패킷의 패턴 매칭은 패킷의 내용을 비교하여 매치되는 패킷에 대해서 정책을 적용한다.
block in from 192.168.0.0/24 to any
>> 송신자의 IP주소가 192.168.0.0 망에서 오는 모든 패킷은 막는다
pass in on hme0 all
>> 인터페이스 hme0로 들어오는 모든 패킷은 통과시킨다.
block in proto icmp all
>> 모든 들어오는 ICMP 패킷은 막는다.
Block in proto icmp-type echo
>> 모든 들어오는 ICMP echo 패킷은 막는다.
Block in proto tcp all port = 513
>> 모든 들어오는 tcp 513(rlogin)번 패킷은 막는다.
block in on hme0 proto udp from 192.168.0.0/24 to any port = 2049
block in on hme0 proto tcp from 192.168.0.0/24 to any port = 2049
>> 192.168.0.0망에서 hme0 인터페이스로 들어오는 NFS 요청은 모두 블럭한다.
(2) Bypassing Rules
quick 키워드는 모든 패킷에 대해 적용하는 절대적인 룰을 의미한다. 보통의 경우 룰의 처음부터 끝까지 비교하면서 제일 마지막 매치되는 패턴의 룰을 적용받지만 그럴 필요가 없는 경우 quick 키워드를 사용하여 더 이상 패턴 비교를 하지 않도록 설정할 수 있다.
block in quick from 192.168.0.0/24 to any
>> 192.168.0.0망에서 들어오는 모든 패킷은 블록시키고 더 이상 패턴 매칭 검사를 하지 않는다. group 룰을 사용하면 방화벽을 좀더 효율적으로 관리할 수 있다. hme0 의 패킷은 적당한 hme0의 룰에 의해 처리된다.
block in log quick proto udp from any to any port=161
>> 모든 SNMP 패킷을 블록 시킨다.
(3) IP Filter Logging
기본적으로 모든 룰 작동은 기록을 남기지 않는다. 하지만 log 라는 키워드를 사용하면 rule 작동에 대한 기록을 로그로 남길 수 있다.
Logging에서 사용되는 Rule Keyword
log : rule작동에 대한 기록을 남긴다
log first : 첫번째 TCP세션의 패킷만 기록한다.
log body : 패킷의 헤더와 payload의 128비트를 기록한다.
log level facility.level : syslog가 로그를 기록하도록 설정
dup-to : 지정 인터페이스가 목적지인 패킷을 복사한다.
to : 패킷을 지정한 인터페이스로 리다이렉트한다.
block in log quick proto tcp from any to any port=12345
block in log quick proto tcp from any to any port=12346
block in log quick proto tcp from any to any port=20034
block in log quick proto tcp from any to any port=31337
>> 모든 Back Orifice 와 NetBus 패킷을 블록 시키며 룰 동작에 대한 로그를 남긴다.
block in log-first quick on hme0 proto tcp from any to 192.168.0.1/32 port=80
>> 192.168.0.1 서버로 웹서비스를 요청하는 패킷을 블럭 시키고 첫번째 TCP 세션 패킷을 로그로 남긴다.
# /sbin/ipmon -s
>> ipmon명령을 사용하여 로깅디바이스인 /dev/ipl을 모니터링하고, 시스템 로그로 이벤트를 전송한다.
이제 패킷이 로깅되도록 rule을 작성해 보자
block in quick on hme0 to hme1 proto tcp from any to any port = 23
>> hme0 로 들어오는 모든 telnet 패킷을 hme1으로 보낸다. 이 경우 snort이 hme1을 listen하고 있다고 가정한다.
pass in quick on hme0 dup-to hme1 from any to 192.168.0.1/32 port = 80
pass in quick on hme0 dup-to hme1 from any to 192.168.0.1/32 port = 443
>> hme0 로 들어오는 192.168.0.1로 가는 웹서비스 요청 패킷은 hme1으로 복사된다. 이 경우 hme1은 snort이 listen하고 있는 인터페이스로 설정되어 있는경우다.
(4) Stateful Filtering
기본적으로 IP Filter는 네트웍 크래픽 처리에 관한 상태 정보를 추적하지 않고 각각의 패킷을 각각의 이벤트로 처리한다. 하지만 "keep state" 키워드를 사용하면 세션에 속해있는 패킷의 상태를 추적하여 매칭 시키는 룰을 작성할 수 이다.
UDP같은 경우 stateless통신을 하므로 "세션"이라는 개념이 없다. 나가는 패킷의 소스와 목적지 포트를 관찰해 두었다가 들어올 때 확인하는 방법으로 상태를 추측해서 관리한다.
block in quick on hme0 all
pass out quick on hme0 proto icmp from 192.168.0.23 to any keep state
pass out quick on hme0 proto tcp from 192.168.0.23 to any keep state
pass out quick on hme0 proto udp from 192.168.0.23 to any keep state
>> 이 룰은 먼저 모든 들어오는 트래픽은 블럭시킨다. 그런다음 192.168.0.23에서 초기화된 ICMP,TCP,UDP패킷은 제한없이 나갈 수 있다.
(5) Advanced Packet Matching
“flags"키를 statefule 필터링과 연동해서 사용하게 되면 들어오는 패킷이 세션의 어디에 속하는 지를 정확하게 체크 할수 있으므로 스텔스 스캔과 같은 패킷을 효과적으로 막을 수 있다.
block in quick proto tcp from any to any port = 23 flags S
>> port 23으로 SYN flag가 설정되어 들어오는 패킷은 막는다.
pass in quick proto tcp from any to 192.0.2.42/32 port = 22 flags S keep state
block in quick from any to 192.0.2.42/32
>> 들어오는 SSH 트래픽은 허용하고 나머지는 모두 막는다.
pass in quick proto tcp from any to 192.0.2.42/32 port = 22 flags S keep state keep flags
>> "keep frags" 키워드는 필터링을 하기 전에 패킷 재조합을 한다.
(6) IP Filter Stealthiness
효율적인 방화벽을 구축하기위한 룰들에 대해 알아보았다. 그러나 이러한 것에는 중요한 한가지 결점이있다. 가장 바람직한 방화벽은 공격자가 방화벽이 있다는 것을 인식하지 못하도록 하는것이다. 디폴트 동작으로 IP Filter는 필터링된 패킷을 버린다. 이러한 것들이 방화벽이 중간에 존재한다고 알리는 역할을 하게 되는것이다.
block return-rst in proto tcp from any to 192.0.2.42/32 port = 23
>> "return-rst"키워드를 사용하여 필터링 패킷에 대해 "RST" 응답을 하도록 구성하는것이다.
block return-icmp(port-unr) in proto udp from any to 192.0.2.42/32 port = 69
>> non-listening UDP포트에는 ICMP port-unreachable packet을 응답한다.
앞의 두가지 형태의 응답은 ICMP에러패킷에 소스의 IP가 포함되는데 원래 목적지의 IP가 아닌 방화벽의 IP가 들어가는점이 문제가 된다. 그래서 원래 목적지 IP를 소스IP 대신 집어넣어서 port-unreachable패킷을 전송하게 하는 키워드가 "return-icmp-as-dest"이다.
block return-icmp-as-dest(port-unr) in proto udp from any to 192.0.2.42/32 port = 69
>> ICMP 에러 패킷의 payload에 들어가는 소스의 IP주소를 원래 목적지로 변경한다.
block in quick fastroute proto u에 from any to any port 33434 >< 33465
>> “fastroute" 키워드를 사용하면 TTL값을 감소시키지 않도록 한다. 모든 들어오는 traceroute에대해 패킷의 TTL값을 감소시키지 않고 처리한다.
4. IP Filter Tools
IP 필터는 추가적인 커널 모듈과 여러 가지의 유틸리티를 제공한다. ipf 유틸리티는 기본적인 룰셋을 구현하기위한 기본명령이다.
# /sbin/ipf -Fa -f /etc/opt/ipf/ipf.conf
>> ipf.conf 파일로부터 방화벽정책을 읽어서 설정한다.
# /sbin/ipfstat
>> IP Filter의 퍼포먼스 상태를 요약해서 출력해 준다.
# /sbin/ipfstat -oh
# /sbin/ipfstat -ih
>> outbound, inbound 에 적용된 룰을 보여준다. 그리고 룰이 적용된 횟수도 출력해 준다.
# /sbin/ipfstat -s
>> state table의 demp를 출력한다.
# /usr/sbin/ipmon -s
>> log 를 syslogd에게 넘겨서 처리한다.
방화벽 설정에 대한 테스를 위한 유틸리티들도 같이 제공되고 있다.
# ipftest
>>rule list 를 테스트
# iptest
>> 기형의 패킷을 전송
# ipsend
>> sendip와 같이 패킷을 만들어서 전송한다.
# ipresend
>> snoop이나 tcpdump 데이타 파일에 있는 기록을 "play back"으로 사용한다.
5. IP Filter Extensions
laba는 http://inc2.com/isba 사이트에서 다운로드 받을 수 있다. isba는 IP 필터의 관리를 위한 강력한 그래픽 인터페이스를 제공하는 패키지이다. isba를 사용하면 그래픽 에디터를 사용하여 쉽게 정책을 정의하거나 수정하는 작업을 할 수 있다. 또한 리모트 관리 콘솔을 지원하고 있다. SSH 터널을 사용하여 중앙 웍스테이션에서 엔터프라이즈 방화벽을 관리할 수 있다. 이 패키지는 프리라이센스의 소스코드로 제공되고 있으며, 이 패키지를 설치하기 위해서는 Perl 과 Perl/TK 라이브러리가 설치되어 있어야 한다.
fwanalog는 http://tud.at/programm/fwanalog/ 에서 다운로드 받을 수 있다. 이 패키지는 프리 라이센스 의 간단한 본쉘 스크립트로 작성되어 있다. 이 스크립트는 IP필터의 로그를 분석하여 요약하여 결과를 그래프로 생성하거나 웹 기반의 보고서를 생성하는 작업을 한다. cron을 기반으로 시간마다 실행하게 하여 시간대별 리포트 분석을 할 수 있다. fwanalog는 웹 로그 분석을 위해 analog 패키지가 설치되어 있어야 한다. analog는 가장 만힝 사용되고 있는 웹 로그를 분석하는 패키지로 http://www.analog.cx/ 사이트에서 Solaris 환경의 소스코드 또는 바이너리 파일을 다운로드 받을 수 있다.