четверг, 21 октября 2010 г.

Оптимизация и харденинг правил IPFilter II

Однажды я писал об оптимизации и корректном написании правил IPFilter. В общем-то, описываемый набор правил достаточно хорош и, в принципе, может показаться, что оптимизировать там, в общем-то, нечего.

На самом деле это не вполне верно. 

Хорошим резервом для оптимизации IPFilter является создание групп правил в тех случаях, когда имеется более одного однотипного правила.

Достаточно долгое время мне не удавалось собрать в группу общие блокирующие правила. В текущей версии IPFilter (от релиза Солярис 10/09) это наконец получилось.

Для простоты рассмотрим совсем небольшую конфигурацию, на которой этот набор был первоначально опробован.

Для начала, с точки зрения структуры конфигурации, имеет смысл описания всех групп правил сделать в самом начале:

# Rules groups setup
# Group 100 - Blocked networks & packets on any interface
# Group 100 setup
block in all head 100
# Group 200 - Opened incoming ports on eri0
# Group 200 setup
pass in on eri0 head 200


Как видно из этого описания, у нас будет всего две группы правил (первоначально было только одно), причем в группу 100 мы включим все без исключения общие блокирующие правила. В большинстве конфигураций блокирующие правила не привязываются к определенному интерфейсу, что и видно на нашем примере:

# ---------------------
# Common blocking rules
# ---------------------

# Block all IP fragments
block in quick all with frag group 100

# Block all short IP fragments
block in quick proto tcp all with short group 100

# Block any IP packets with options set in them
block in quick all with ipopts group 100

# Block OS fingerprint attempts
block in log first quick proto tcp all flags SF/SF group 100
block in log first quick proto tcp all flags SF/SFRA group 100
block in log first quick proto tcp all flags /SFRA group 100
block in log first quick proto tcp all flags SFUP/SFUP group 100
block in log first quick proto tcp all flags FUP/FUP group 100
block in log first quick proto tcp all flags F/F group 100
block in log first quick proto tcp all flags U/U group 100
block in log first quick proto tcp all flags P/P group 100

Антиспуфинговые правила также включаются в группу 100:

# Anti-spoofing rules
#block in quick from 192.168.0.0/16 to any group 100
block in quick from 172.16.0.0/12 to any group 100
block in quick from 10.0.0.0/8 to any group 100
block in quick from 127.0.0.0/8 to any group 100
block in quick from 0.0.0.0/8 to any group 100
block in quick from 169.254.0.0/16 to any group 100
block in quick from 192.0.2.0/24 to any group 100
block in quick from 204.152.64.0/23 to any group 100
block in quick from 224.0.0.0/3 to any group 100



Далее следует группа 200:

# ---------------------- eri0 interface --------------------------
# 21 port - FTP service. Disable port and service on Internet servers!
#pass in quick on eri0 proto tcp from 192.168.100.0/24 to blade port=21 flags S keep state group 200
# 22 port - SSH
pass in quick on eri0 proto tcp from 192.168.100.0/24 to blade port=22 flags S keep state group 200
# 80 port - HTTP
pass in quick on eri0 proto tcp from 192.168.100.0/24 to blade port=80 flags S keep state group 200
# 177 port - x11 service. Disable port and service on Internet servers!
pass in quick on eri0 proto udp from 192.168.100.0/24 to blade port=177 keep state group 200
# 443 port - HTTPS
pass in quick on eri0 proto tcp from 192.168.100.0/24 to blade port=443 flags S keep state group 200
# 2222 port - SSH Alternative
#pass in quick on eri0 proto tcp from 192.168.100.0/24 to blade port=2222 flags S keep state group 200
# 1158 port - OEM console.
# Note: Secure console on Internet servers!
#pass in quick on eri0 proto tcp from 192.168.100.0/24 to blade port=1158 flags S keep state group 200
# Note: OEM console may be on port 5500
#pass in quick on eri0 proto tcp from 192.168.100.0/24 to blade port=5500 flags S keep state group 200
# 1521 port - Oracle. Disable port on Internet servers!
pass in quick on eri0 proto tcp from 192.168.100.0/24 to blade port=1521 flags S keep state group 200
# 7777 port - OHS. Disable port when using WebCache.
#pass in quick on eri0 proto tcp from 192.168.100.0/24 to blade port=7777 flags S keep state group 200
# ---------------------- eri0 interface --------------------------


Последними следуют исходящие правила и финальное блокирующее правило:

# Outgoing and callbacks sessions
# Allow connections originating from local machine out
pass out quick proto tcp/udp from any to any keep state keep frags
pass out quick proto icmp from any to any keep state

# Finally block all unmatched
block in quick all


Таким образом, уменьшение количества не сгруппированных правил повышает эффективность обработки пакетов.

PS. При группировке правил нужно помнить о том, что они касаются однотипных правил. В группе не должно быть взаимоисключающих правил по направлению действия или интерфейсу.