Простой FireWall для сервера

Итак, сейчас мы поговорим о сетевой безопасности. Ни для кого не секрет, что устанавливая ОС на сервер мы тем самим включаем его в сеть. При этом не всегда (точнее очень редко) настраивется брандмауэр. А это не есть очень хорошо, ибо все сервисы, установленые на нём всегда и всем доступны. Казалось бы всё нормально, поставил пароль и все дела... Но брут никто не отменял... он всегда поможет и всех выручит... Чем давать возможность подбирать уж лучше перекрыть доступ на совсем. Для тех, кому сервисами пользоваться не надо это не есть проблема. Ну а взломщики пусть негодуют...

Всё, о чём идёт здесь речь делалось на Gentoo Linux, но применить эти знания можно на любом другом дистрибутиве. И так начнём. Для начала установим необходимые пакеты:

# emerge -av net-firewall/iptables app-admin/sshguard

Теперь пошагово настроим firewall при помощи iptables. Для начала создадим необходимые цепочки:

# iptables -N TCP
# iptables -N UDP
# iptables -N SYN_FLOOD
# iptables -N bruteguard
# iptables -N sshguard

Тепер поясним для чего эти цепочки нужны. Первая будет содержать правила открытия TCP портов. Вторая откроет UDP порты. Третья обеспецит защиту от SYN-флуда. Четвёртая обеспечит защиту от брутфорса. Пятая - специальная, для блокировки специфыичных адресов (будет рассмотрено).

Сразу оговорим, что сервер просто выполняет функции какого-то Веб-сервера или FTP, но никому не раздаёт интернет, не служит маршрутизатором. Поэтому все операции по переброске пакетов запретим:

# iptables -P FORWARD DROP

Также мы предполагаем не ущемлять возможности сервера куда-то соединится и совершить какую нибудь операцию. Иными словами разрешаем весь исходящий траффик:

# iptables -P OUTPUT ACCEPT

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

# iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT

Далее добавляем правило на пропуск траффика новых соединений к открытым портам UDP, фильтруем SYN флуд, пропускем траффик к TCP портам:

# iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
# iptables -A INPUT -p tcp --syn -j SYN_FLOOD
# iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP

Наконец, настраиваем корректное отбрасывание пакетов, не прошедших в предыдущих правилах:

# iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
# iptables -A INPUT -p tcp -j REJECT --reject-with tcp-rst
# iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable

Ну и конечно же настроим партизанскую политику для цепочки INPUT:

# iptables -P INPUT DROP

Но это ещё не всё... нужно ещё обеспечить защиту от SYN флуда. Наполняем раннее созданную цепочку необходимым содержимим. Суть фильтрации SYN флуда в том, чтобы ограничить скорость поступления SYN пакетов к программам. Делаем так:

# iptables -A SYN_FLOOD -m limit --limit 500/sec --limit-burst 1500 -j RETURN
# iptables -A SYN_FLOOD -j DROP

Ну и конечно же добавим защиту от брута. Тут принцип таков - в начале цепочки bruteguard поставим правила для пропуска траффика с IP белого списка, тоесть тех IP которых никогда не будем блокировать, чтобы не случилось. А в конце пишем ссылку на цепочку sshguard.

# iptables -A bruteguard -j sshguard

Цепочка sshguard будет напоняться автоматически при помощи программы sshguard (мы её установили).

Теперь пора поговорить о том как что-нибудь открыть. Предположим, что нужно дать все доступ к апачу:

# iptables -A TCP -p tcp --dport 80 -j ACCEPT

Тоесть мы пропускаем новый траффик, идущий протоколом TCP к порту 80. Другой пример - дадим доступ по ssh из некоторой подсети 192.168.1.0/24:

# iptables -A TCP -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

Думаю по аналогии тут всё понятно... Если что не ясно, всегда можно обратится к документации по iptables, гуглить мы умеем. Обязательное, о чём не стоит забывать - защита от брутофорса. Для защиты от брутфорса нобходимо до пропуска траффика добавить правило:

# iptables -A TCP -p tcp --dport 22 -j bruteguard

Очевидно, что даный антибрутфорс относится к ssh. Хотя никто не мешает прикрутить к какому нибудь другому порту. Логика такова: сначала траффик направляется к bruteguard и если там никто пакет не остановит (например запись в sshguard), то пакет будет пропущен потом следующим правилом. Остаётся настроить сам sshguard ибо смысла нет в нём. Начиная с версии он использует прозрачную технологию анализа логов Log-Sucker. Это значит, что надо просто создать такой лог, в который будет сбрасыватся инфа о неудачных авторизациях. У меня системный лог ведёт syslog-ng, посему будем настраивать именно его. Первое - создадим фильтр для отборки сообщений (это прописываем в /etc/syslog-ng/syslog-ng.conf):

filter f_sshguard { facility(auth, authpriv) and not program("sshguard") and (program("sshd") or program("proftpd")); };

Данное правило отбирает сообщения авторизации от sshd и proftpd (такой у меня FTP сервер). Теперь назначим точку записи логов:

destination sshguard { file("/var/log/sshguard.log" template("$DATE $FULLHOST $MSGHDR$MESSAGE\n")); };

Ну и наконец свяжем правило и фильтр:

log { source(src); filter(f_sshguard); destination(sshguard); };

Готово. Перегружем конфигурацию syslog-ng:

# /etc/init.d/syslog-ng reload

Остаётся настроить сам Log-Sucker. В файле /etc/conf.d/sshguard пишем:

SSHGUARD_OPTS="${SSHGUARD_OPTS} -l /var/log/sshguard.log"

Если найдётё ещё опции -l в SSHGUARD_OPTS, то проследите, чтобы логи были на местах или уберите их совсем. Запускаем, добавляем в автозапуск:

# /etc/init.d/sshguard start
# rc-update add sshguard default

Тепер всё должно работать. При этих настройках четыре раза неправильный пароль - бан на 10 минут. Ещё раз - на 20. И т.д. Если надо срочно всех разбанить - просто перезапускаем sshguard.

В этой статье конечно не рассмотрены все тонкости настройки брандмауэра. Если интересует что-то ещё, свяжитесь, попробуем исправится...