Как известно безопасность сервера дело нелегкое, но крайне
необходимое, а тем паче если речь идет о веб сервера, который постоянно
находится под «обстрелом» извне.Для защиты нашего сервера будем
использовать Iptables (как вы поняли речь в статье пойдет о ОС Linux).
Принципы работы iptables, а равно и все ключи, я здесь описывать не
буду, статей на эту тему в интернете море. То есть подразумевается, что
вы знакомы с iptables, хотя бы минимально. Но, не знание темы, не
помешает вам настроить защиту, так как все команды протестированы на
реальной системы и успешно работают.
Приступим к написанию правил:
1. Первым делом очистим существующую таблицу правил:
# iptables -F
2. Добавляем первое правило которое позволит нам не потерять
удаленный контроль на сервером (по умолчанию порт SSH – 22, у вас может
быть другой):
# iptables -A INPUT -p tcp -i eth0 --dport 22 -j ACCEPT
3. Прописываем политики по умолчанию:
# iptables -P INPUT DROP
# iptables -P FORWARD ACCEPT
# iptables -P OUTPUT ACCEPT
Итак, цепочкой DROP, мы режем все входящии соединения, иными словами
политику мы будем настраивать по принципу – запрещено все, кроме явно
разрешенного. Так мне кажется более правильно, и более контролируемо. Но
никто не запрещает вам делать и наоборот.
Политики FORWARD и OUTPUT я оставляю открытыми, так как на мой взгляд
они менее опасны в плане безопасности , хотя никто не мешает порезать и
их. Да, и не забудте, если вы хотите все политики поставить в цепочки
DROP, то добавьте к правилу разрешающему входящий доступ по ssh, правило
разрешающие исходящий трафик по 22 порту, иначе вы потеряете удаленной
доступ. (iptables -A OUTPUT -p tcp -i eth0 –dport 22 -j ACCEPT)
4. Теперь приступаем к прописыванию основных правил для нашего веб-сервера.
Разрешаем хождение трафика по localhost:
# iptables -A INPUT -i lo -j ACCEPT
Делаем защиту от Dos атак:
# iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
Разрешаем пакеты по протоколам tcp\udp создающие новые подключения
(например у меня без этих правил некорректно работала админка Вордпресса
и не открывался один из виртуальных сайтов).
# iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
Разрешаем трафик для необходимых служб
# iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
# iptables -A INPUT -i eth0 -p udp --sport 53 -j ACCEPT
# iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 3 -j ACCEPT
# iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 11 -j ACCEPT
# iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 12 -j ACCEPT
Итак что я разрешил:
порт 21 – ftp
порт 80 – http
порт 443 – https
порт 25 – smtp
порт 53 – dns
И плюс необходимые типы icmp пакетов. Так же не забываем что открыт ssh порт 22.
Далее пропишем правила защищаюшее наш ssh порт от брутфорса (подбора паролей роботами):
# iptables -A INPUT -p tcp --syn --dport 22 -m recent --name radiator --set
# iptables -A INPUT -p tcp --syn --dport 22 -m recent --name radiator --update --seconds 30 --hitcount 3 -j DROP
Теперь робот после трех попыток в течении 30 секунд подобрать пароль – отваливается.
Если вам необходимо установить полностью доверительные отношения между двумя серверами то делаем так:
# iptables -A INPUT -p tcp --source {ip-адрес удаленного сервера} -j ACCEPT
# iptables -A INPUT -p udp --source {ip-адрес удаленного сервера} -j ACCEPT
На этом с основными правилами все, хотя шаманить можно и дальше.
5. Сохраняем наши новые правила и прописываем их в конфигурационный файл, дабы они не потерлись после перезагрузки системы.
# iptables-save
# iptables-save > /etc/sysconfig/iptables
Посмотреть текущую таблицу фильтрации можно так:
# iptables -L
Удаление определенных правил.
При помощи следующей команды смотрим номер правила, которое нам необходимо удалить:
# iptables -L INPUT --line-number
Запомним номер и удалим правило под номером 2:
# iptables -D INPUT 2
Если возникли проблемы и режется то что не должно резаться включаем логирование
# iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "INPUT packet: "
Как вы видите я выставил лимит в 3 минуты, дабы логи не забили все пространство на жестком диске
Теперь пропишем следующую строчку kern.=debug -/var/log/messages в syslog.conf
Смотрим ссыпающиеся логи /var/log/messages
Теперь наш веб сервер защищен фаерволлом на основе iptables.
Примечание:
апперанд A -добававляет правило в конец указанной цепочки.
апперанд I – добававляет правило в начало цепочки
|