29 сентября 2011 г.

WEB-сервер на Linux. Часть 6 - Настройка IPTables

Пришло время заняться безопасностью! В этой заметке я рассмотрю настройку IPTables в режиме максимальной безопасности.

Для начала определимся, какие порты мы хотим видеть открытыми для внешней сети:
  • FTP - 20/TCP и 21/TCP (только из подсетей организации)
  • SSH - 22/TCP (с ограниченного списка администраторских хостов)
  • HTTP - 80/TCP (только из подсетей организации)
  • HTTPS - 443/TCP (только из подсетей организации)
Порт для MySQL открывать наружу нет никакой необходимости, т.к. взаимодействие с ним осуществляет Apache.

В IPTables правила необходимо загружать каждый раз при старте системы. Для этого существует 2 способа загрузки правил: с помощью команды iptables-load и с помощью shell-скрипта. Я буду использовать второй способ, т.к. он более гибкий, хотя и достаточно медленный, в силу того, что [почти] для каждой операции происходит отдельный запуск iptables, в то время как при работе с iptables-load происходит только один запуск iptables во время которого загружаются все правила разом.

Создание правил
Во время настройки IPTables я активно пользовался отличным справочником [1] из которого взял шаблон шелл-скрипта для загрузки правил и изменил его под свои нужды.
В скрипте сначала определяется несколько переменных:
  • LAN_IP_RANGE - диапазон адресов локальной сети
  • LAN_IFACE - имя интерфейса локальной сети
  • LAN_BROADCAST - широковещательный адрес локальной сети
  • LO_IFACE - имя петлевого интерфейса
  • LO_IP - адрес петлевого интерфейса
  • IPTABLES - путь до бинарника iptables
Далее подгружаются модули ядра, необходимые для корректной работы iptables и правил:
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state

После чего, из соображений безопасности, для цепочек INPUT, OUTPUT и FORWARD устанавливается политика по умолчанию DROP, чтобы пакеты, не удовлетворяющие ни одному из правил, отбрасывались.

Далее, создаю дополнительные цепочки, в которые будут попадать пакеты, определенных протоколов:
  • bad_tcp_packets - в ней все tcp-пакеты будут проверяться на корректность формата/флагов и т.п. В случает если пакет имеет некорректный формат, он отбрасывается. В случае, если с форматом все в порядке, пакет проходит дальше по цепочке правил.
  • tcp_packets - корректные tcp-пакеты
  • udp_packets - upd-пакеты
  • icmp_packets - icmp-пакеты
  • allowed - разрешенные tcp-пакеты. В этой цепочке проверяется корректность флагов/состояние пакета. Если все в порядке, пакет принимается, в противном случае - отбрасывается.
Информация о пакетах, отброшенных только потому, что для них нет правил, будет заноситься в syslog. Для того чтобы не засорять syslog огромным количеством сообщений, будет разумно сделать дополнительные правила, отбрасывающие определенные пакеты, такие как DHCP-запросы, широковещательные пакеты и т.п.

Вот что получилось у меня в итоге (ipt-rules.sh):


Помимо основного скрипта я написал еще 3 вспомогательных:
1. Сброс правил и запрет прохождения всех пакетов (ipt-flush.sh):


2. Сброс правил и разрешение прохождения всех пакетов (ipt-flush-accept.sh):


3. Перезагрузка правил (ipt-reload-rules.sh):


Теперь можно запустить скрипт и проверить доступность необходимых сервисов, таких как WWW, FTP, SSH. И, в случае если подводных граблей не обнаружилось, переходить к следующему шагу.

Автоматическая загрузка правил при старте системы
Я решил реализовать загрузку правил с помощью файла /etc/network/interfaces. В нем можно для каждого интерфейса указать действия, выполняемые при поднятии/отключении интерфейса.

Итак, скопируем скрипты в папку /etc/init.d/ и установим на них необходимые права:
$ sudo cp ./ipt-* /etc/init.d/
$ sudo chmod 755 /etc/init.d/ipt-*

Теперь отредактируем файл /etc/network/interfaces, добавив в секцию, описывающую петлевой интерфейс, вызов скрипта загрузки правил:
# The loopback network interface
auto lo
iface lo inet loopback
up /etc/init.d/ipt-reload-rules.sh

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


Источники информации
  1. Руководство по IPTables

Комментариев нет:

Отправить комментарий