Пришло время заняться безопасностью! В этой заметке я рассмотрю настройку IPTables в режиме максимальной безопасности.
Для начала определимся, какие порты мы хотим видеть открытыми для внешней сети:
В IPTables правила необходимо загружать каждый раз при старте системы. Для этого существует 2 способа загрузки правил: с помощью команды iptables-load и с помощью shell-скрипта. Я буду использовать второй способ, т.к. он более гибкий, хотя и достаточно медленный, в силу того, что [почти] для каждой операции происходит отдельный запуск iptables, в то время как при работе с iptables-load происходит только один запуск iptables во время которого загружаются все правила разом.
Создание правил
Во время настройки IPTables я активно пользовался отличным справочником [1] из которого взял шаблон шелл-скрипта для загрузки правил и изменил его под свои нужды.
В скрипте сначала определяется несколько переменных:
После чего, из соображений безопасности, для цепочек INPUT, OUTPUT и FORWARD устанавливается политика по умолчанию DROP, чтобы пакеты, не удовлетворяющие ни одному из правил, отбрасывались.
Далее, создаю дополнительные цепочки, в которые будут попадать пакеты, определенных протоколов:
Вот что получилось у меня в итоге (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.
Источники информации
Для начала определимся, какие порты мы хотим видеть открытыми для внешней сети:
- FTP - 20/TCP и 21/TCP (только из подсетей организации)
- SSH - 22/TCP (с ограниченного списка администраторских хостов)
- HTTP - 80/TCP (только из подсетей организации)
- HTTPS - 443/TCP (только из подсетей организации)
В IPTables правила необходимо загружать каждый раз при старте системы. Для этого существует 2 способа загрузки правил: с помощью команды iptables-load и с помощью shell-скрипта. Я буду использовать второй способ, т.к. он более гибкий, хотя и достаточно медленный, в силу того, что [почти] для каждой операции происходит отдельный запуск iptables, в то время как при работе с iptables-load происходит только один запуск iptables во время которого загружаются все правила разом.
Создание правил
Во время настройки IPTables я активно пользовался отличным справочником [1] из которого взял шаблон шелл-скрипта для загрузки правил и изменил его под свои нужды.
В скрипте сначала определяется несколько переменных:
- LAN_IP_RANGE - диапазон адресов локальной сети
- LAN_IFACE - имя интерфейса локальной сети
- LAN_BROADCAST - широковещательный адрес локальной сети
- LO_IFACE - имя петлевого интерфейса
- LO_IP - адрес петлевого интерфейса
- 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-пакеты. В этой цепочке проверяется корректность флагов/состояние пакета. Если все в порядке, пакет принимается, в противном случае - отбрасывается.
Вот что получилось у меня в итоге (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.
Источники информации
Комментариев нет:
Отправить комментарий