Категорії
FreeBSD Linux OpenBSD Security

Увеличиваем безопасность через файерволы.

Обновил статью 4.10.2011

В этой статье расскажу, о правилах файерволов, которые позволяют бороться с паразитируещим траффиком (фрагментированные пакеты, неправильные бродкасты, …). Приведу примеры для таких файерволов: ipfw, pf, iptables. В некоторых из них будут специфические правила, которые отсутствуют в других.

Сразу скажу о переменных, которые используются здесь:

– ${FwCMD} – путь к бинарнику ipfw, обычно это /sbin/ipfw
– ${LanOut} – внешний интерфейс
– ${IPT} – путь к бинарнику iptables, обычно это /sbin/iptables
$meIP адрес сервера

1) IPFW

# Разрешаем весь траффик по внутреннему интерфейсу (петле)
# Вообще я во многих местах читал что без него может ничё не заработать вообще
# и прочие страшилки. Работает - почта, апач, .... А вот squid - не работает :)
# так что без него и правда - никуда.
${FwCMD} add allow ip from any to any via lo0
${FwCMD} add deny ip from any to 127.0.0.0/8
${FwCMD} add deny ip from 127.0.0.0/8 to any

# режем частные сети на внешнем интерфейсе - по легенде он у нас
# смотрит в интернет, а значит пакетам этим браться неоткуда на нём.
# рубим частные сeти
${FwCMD} add deny ip from any to 10.0.0.0/8 in via ${LanOut}
${FwCMD} add deny ip from any to 172.16.0.0/12 in via ${LanOut}
${FwCMD} add deny ip from any to 192.168.0.0/16 in via ${LanOut}
${FwCMD} add deny ip from any to 0.0.0.0/8 in via ${LanOut}

# рубим автоконфигуреную частную сеть
${FwCMD} add deny ip from any to 169.254.0.0/16 in via ${LanOut}

# рубаем мультикастовые рассылки
${FwCMD} add deny ip from any to 240.0.0.0/4 in via ${LanOut}

# рубим фрагментированные icmp
${FwCMD} add deny icmp from any to any frag

# рубим широковещательные icmp на внешнем интерфейсе
${FwCMD} add deny icmp from any to 255.255.255.255 in via ${LanOut}
${FwCMD} add deny icmp from any to 255.255.255.255 out via ${LanOut}

# рубим траффик к частным сетям через внешний интерфейс
# заметтьте - эти правила отличаются от тех что были выше!
${FwCMD} add deny ip from 10.0.0.0/8 to any out via ${LanOut}
${FwCMD} add deny ip from 172.16.0.0/12 to any out via ${LanOut}
${FwCMD} add deny ip from 192.168.0.0/16 to any out via ${LanOut}
${FwCMD} add deny ip from 0.0.0.0/8 to any out via ${LanOut}

# рубим автоконфигуреную частную сеть
${FwCMD} add deny ip from 169.254.0.0/16 to any out via ${LanOut}

# рубаем мультикастовые рассылки
${FwCMD} add deny ip from 224.0.0.0/4 to any out via ${LanOut}

# рубаем мультикастовые рассылки
${FwCMD} add deny ip from 240.0.0.0/4 to any out via ${LanOut}

# port-scan protect
${FwCMD} add deny log tcp from any to me in via ${LanOut} tcpflags fin, syn, rst, psh, ack, urg
${FwCMD} add deny log tcp from any to me in via ${LanOut} tcpflags !fin, !syn, !rst, !psh, !ack, !urg
${FwCMD} add deny log tcp from any to me not established tcpflags fin

# Запрещаем пакеты с не кор рек т ны ми TCP-флагами.
# NULL-пакеты = второй тест nmap
${FwCMD} add deny log tcp from any to me in via ${LanOut} tcpflags !syn,!ack,!rst

# XMAS-пакеты = третий тест nmap
${FwCMD} add deny log tcp from any to me in via ${LanOut} tcpflags syn,fin,urg,psh,!ack
${FwCMD} add deny log tcp from any to me in via ${LanOut} tcpflags syn,fin,!ack

# Седьмой тест nmap
${FwCMD} add deny log tcp from any to me in via ${LanOut} tcpflags fin,urg,psh,!ack
${FwCMD} add deny log tcp from any to me in via ${LanOut} tcpflags fin,!ack
${FwCMD} add deny log tcp from any to me in via ${LanOut} tcpflags urg,!ack
${FwCMD} add deny log tcp from any to me in via ${LanOut} tcpflags psh,!ack

# Отбрасываем пакеты с нестандартными IP-опциями
${FwCMD} add deny log all from any to me in via ${LanOut} ipoptions ssrr
${FwCMD} add deny log all from any to me in via ${LanOut} ipoptions lsrr
${FwCMD} add deny log all from any to me in via ${LanOut} ipoptions rr
# Запрещаем пакеты с Timestampf
${FwCMD} add deny log all from any to any in via ${LanOut} ipoptions ts

# allow trafic only to that int, where it arrive
${FwCMD} add deny log ip from any to any not verrevpath in

#Защита от icmp флуда
${FwCMD} add 500 deny icmp from any to any in icmptype 5,9,13,14,15,16,17

# Разрешаем только корректные пакеты на порты публичных сервисов (на примере 25 порта)
${FwCMD} add pass tcp from any to me 25 in via ${LanOut} tcpflags syn,!ack,!psh,!fin,!urg,!rst
${FwCMD} add pass tcp from any to me 25 in via ${LanOut} tcpflags ack,!syn,!psh,!fin,!urg,!rst
${FwCMD} add pass tcp from any to me 25 in via ${LanOut} tcpflags ack,psh,!syn,!fin,!urg,!rst
${FwCMD} add pass tcp from any to me 25 in via ${LanOut} tcpflags ack,fin,!syn,!psh,!urg,!rst

Примечание.

Если у вас пакеты могу приходить с одного интерфейса, а уходить через другой – то последнее правило нужно убрать, иначе оно заблокирует такие пакеты.

2) PF

# Нормализируем весь входящий траффик. Это избавит от всякого рода фрагментированностей.

#ВНИМАНИЕ! В OPENBSD, НАЧИНАЯ С ВЕРСИИ 4.6 ЭТОГО ПРАВИЛА УЖЕ НЕТ
#ИСПОЛЬЗОВАНИЯ ЕГО ПРИВЕДЁТ К ОШИБКЕ, БУДЬ-ТЕ ВНИМАТЕЛЬНЫ

#scrub in all

# Нормализация трафика автоматически отфильтрует нестандартные пакеты атакующего, изменит TTL
scrub in on $LanOut all fragment reassemble min-ttl 20 max-mss 1440
scrub on $LanOut all reassemble tcp
# можно манипулировать IP-опциями, например, сбрасывать флаг DF в 0
scrub out on $LanOut all no-df

#Включаем блокировку антиспуффинга. Кстати, для нормальной работы нужно ещё правило для петлевого интерфейса
set skip on lo0
antispoof quick for $LanOut

# Защищаемся от сканнирования Nmap'a.
block in quick from any os NMAP

# Разрешаем весь траффик по внутреннему интерфейсу (петле)
# Вообще я во многих местах читал что без него может ничё не заработать вообще
# и прочие страшилки. Работает - почта, апач, .... А вот squid - не работает :)
# так что без него и правда - никуда.
pass on lo0 from any to any
block quick from any to 127.0.0.0/8
block quick from 127.0.0.0/8 to any

# режем частные сети на внешнем интерфейсе - по легенде он у нас
# смотрит в интернет, а значит пакетам этим браться неоткуда на нём.
# рубим частные сeти
block in quick on $LanOut from any to 10.0.0.0/8
block in quick on $LanOut from any to 172.16.0.0/12
block in quick on $LanOut from any to 192.168.0.0/16
block in quick on $LanOut from any to 0.0.0.0/8

# рубим автоконфигуреную частную сеть
block in quick on $LanOut from any to 169.254.0.0/16

# рубаем мультикастовые рассылки
block in quick on $LanOut from any to 240.0.0.0/4

# рубим широковещательные icmp на внешнем интерфейсе
block in quick on $LanOut proto icmp from any to 255.255.255.255
block out quick on $LanOut proto icmp from any to 255.255.255.255

# рубим траффик к частным сетям через внешний интерфейс
# заметьте - эти правила отличаются от тех что были выше!
block out quick on $LanOut from 10.0.0.0/8 to any
block out quick on $LanOut from 172.16.0.0/12 to any
block out quick on $LanOut from 192.168.0.0/16 to any
block out quick on $LanOut from 0.0.0.0/8 to any

# рубим автоконфигуреную частную сеть
block out quick on $LanOut from 169.254.0.0/16 to any

# рубаем мультикастовые рассылки
block out quick on $LanOut from 240.0.0.0/4 to any

# Запрещаем пакеты с некорректными TCP-флагами.
block in log level local3.info quick proto tcp from any to $me flags SF/SF
block in log level local3.info quick proto tcp from any to $me flags FPU/FPU
block in log level local3.info quick proto tcp from any to $me flags F/F
block in log level local3.info quick proto tcp from any to $me flags U/U
block in log level local3.info quick proto tcp from any to $me flags P/P

# Разрешаем только правильные tcp-запросы к публичному сервису
pass in quick on $LanOut proto tcp from any to $me port = 25 flags S/S
pass in quick on $LanOut proto tcp from any to $me port = 25 flags A/A
pass in quick on $LanOut proto tcp from any to $me port = 25 flags AP/AP
pass in quick on $LanOut proto tcp from any to $me port = 25 flags AF/AF

# Фильтрация TCP-флагов
block in quick proto tcp from any to $me flags SF/SFRA
block in quick proto tcp from any to $me flags SFUP/SFRAU
block in quick proto tcp from any to $me flags FPU/SFRAUP
block in quick proto tcp from any to $me flags F/SFRA
block in quick proto tcp from any to $me flags U/SFRAU
block in quick proto tcp from any to $me flags P/P

А вот небольшой примерчик возможностей pf’a для защиты от перебора пароля:

pass in quick on $wan_if_u reply-to ($wan_if_u ($wan_if_u:0)) \
inet proto tcp from any to ($wan_if_u:0) port ssh \
flags S/SA keep state \
(max-src-conn 15, max-src-conn-rate 5/3, \
overload <bruteforce> flush global, floating) label "SSH"

Данное правило, разрешает входящие SSH соединения и создаёт обратное правило. При этом, ответ будет отправлен на тот интерфейс с которого он пришёл, независимо от маршрута по умолчанию. Если кто-то попытается установить соединения приевышающее max-src-conn-rate (разрешить не более 15 одновременных подключений и не более 5 за 3 секунды), адрес будет добавлен в таблицу bruteforce и что важно, ВСЕ установленные соединения с данным адресом (по люым потрам) будут незамедлительно закрыты. Да, и ещё важная деталь, это правило динамическое. Т.е. если у интерфейса $wan_if_u сменился адрес всё будет работать без перезагрузки правил.

3) IPTABLES

# Разрешаем весь траффик по внутреннему интерфейсу (петле)
# Вообще я во многих местах читал что без него может ничё не заработать вообще
# и прочие страшилки. Работает - почта, апач, .... А вот squid - не работает :)
# так что без него и правда - никуда.
${IPT} -A INPUT -p ALL -i lo0 -j ACCEPT
${IPT} -A OUTPUT -p ALL -i lo0 -j ACCEPT
${IPT} -A INPUT -p ALL --dst 127.0.0.0/8 -j REJECT
${IPT} -A OUTPUT -p ALL --dst 127.0.0.0/8 -j REJECT
${IPT} -A INPUT -p ALL --src 127.0.0.0/8 -j REJECT
${IPT} -A OUTPUT -p ALL --src 127.0.0.0/8 -j REJECT

### Check for loopback spoofing
iptables -A INPUT -p ALL -i lo -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT
iptables -A INPUT -p ALL -i ! lo -d 127.0.0.0/8 -j DROP

# режем частные сети на внешнем интерфейсе - по легенде он у нас
# смотрит в интернет, а значит пакетам этим браться неоткуда на нём.
# рубим частные сeти
${IPT} -A INPUT -p ALL -i ${LanOut} --dst 10.0.0.0/8 -j REJECT
${IPT} -A INPUT -p ALL -i ${LanOut} --dst 172.16.0.0/12 -j REJECT
${IPT} -A INPUT -p ALL -i ${LanOut} --dst 192.168.0.0/16 -j REJECT
${IPT} -A INPUT -p ALL -i ${LanOut} --dst 0.0.0.0/8 -j REJECT

# рубим автоконфигуреную частную сеть
${IPT} -A INPUT -p ALL -i ${LanOut} --dst 169.254.0.0/16 -j REJECT

# рубаем мультикастовые рассылки
${IPT} -A INPUT -p ALL -i ${LanOut} --dst 240.0.0.0/4 -j REJECT

# рубим фрагментированные icmp
${IPT} -A INPUT -f -p icmp -j REJECT

# рубим широковещательные icmp на внешнем интерфейсе
${IPT} -A INPUT -p icmp -i ${LanOut} --dst 255.255.255.255 -j REJECT
${IPT} -A OUTPUT -p icmp -i ${LanOut} --dst 255.255.255.255 -j REJECT

# режем частные сети на внешнем интерфейсе - по легенде он у нас
# смотрит в интернет, а значит пакетам этим браться неоткуда на нём.
# рубим частные сeти
${IPT} -A OUTPUT -p ALL -i ${LanOut} --src 10.0.0.0/8 -j REJECT
${IPT} -A OUTPUT -p ALL -i ${LanOut} --src 172.16.0.0/12 -j REJECT
${IPT} -A OUTPUT -p ALL -i ${LanOut} --src 192.168.0.0/16 -j REJECT
${IPT} -A OUTPUT -p ALL -i ${LanOut} --src 0.0.0.0/8 -j REJECT

# рубим автоконфигуреную частную сеть
${IPT} -A OUTPUT -p ALL -i ${LanOut} --src 169.254.0.0/16 -j REJECT

# рубаем мультикастовые рассылки
${IPT} -A OUTPUT -p ALL -i ${LanOut} --src 240.0.0.0/4 -j REJECT

Примечание: многое почерпнул с ресурса lissyara.su.

2 коментарі “Увеличиваем безопасность через файерволы.”

На самом деле эти правила на высоконагруженных системах могут создавать проблемы, так как каждый пакет начинает проходить эти все правила на предмет наличия соответствующих флагов. Рекомендуется использовать параметры skip-to для “хороших” пакетов, перед этими правилами. Тогда “хорошие” пакеты не будут тормозится.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff