Sys-Admin Forum

Iptables+ipset для web сервера

Доброе время суток. Владею небольшой vps-ой(nginx+apache2+mysql) и CMS системой на ней. Сейчас активно работаю над безопасностью ее (iptables+ipset+fail2ban) пока. Веб-сервера только только начинаю изучать. Вот выкладываю свой скрипт iptables. Прошу всех желающих дополнить, покритиковать, дать совет. Возможно куда мне стоит ещё залезть по поводу “защита веб”.

#!/bin/sh
#Защита от спуфинга (подмена адреса отправителя)
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter

export IPT="iptables"
ipset -N blacklist hash:ip

#Очистка всех цепочек iptables
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

#Разрешаем исходящий трафик и запрещаем весь входящий и транзитный:
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD DROP

#Состояние ESTABLISHED говорит, о том что это не первый пакет в соединении
#Пропускать все уже инициированные соединения, а так же дочерние от них
$IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
#Пропускать новые, а так же уже инициированные и их дочерние
$IPT -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#Отбрасываем все пакеты, которые не могут быть идентивицированы
#и поэтому не могут иметь определенного статуса.
$IPT -A INPUT -m state --state INVALID -j DROP
#Cтавим ограничение одновременных число коннектов к веб-серверу с одного ip (в тестовом режиме!!!)
#$IPT -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 3 --connlimit-mask 24 -j DROP
#********************************************************************
$IPT -I INPUT -m set --match-set blacklist src -j DROP
#********************************************************************
#SYN
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP
#Разрешаем ssh и веб сервисы:
$IPT -A INPUT -p tcp --dport 2278 -i enp0s3 -j ACCEPT
$IPT -A INPUT -p tcp -m multiport --dport 80,443 -i enp0s3 -j ACCEPT
$IPT -A INPUT -p tcp -m multiport --dport 21,12000:12100 -i enp0s3 -j ACCEPT
#$IPT -A INPUT -p tcp --dport 53 -i enp0s3 -j ACCEPT
#$IPT -A INPUT -p udp --dport 53 -i enp0s3 -j ACCEPT
#local loopback:
$IPT -A INPUT -i lo -j ACCEPT
#Разрешаем ping:
$IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#********************************************************************
#Запрет FIN-сканирования
$IPT -A INPUT -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
#Запрет X-сканирования
$IPT -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
#Запрет N-сканирования
$IPT -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
#Запрещаем сканирование NMAP-ом
$IPT -I INPUT -p tcp -m osf --genre NMAP -j DROP

#Защита от сканирования. +возможно от ddos(не проверял)
$IPT -N syn-flood
$IPT -A INPUT -p tcp --syn -j syn-flood
$IPT -A syn-flood -m limit --limit 30/second --limit-burst 70 -j RETURN
$IPT -A syn-flood -m set --match-set blacklist src -j LOG --log-prefix "DROP blacklist entry"
$IPT -A syn-flood -j SET --add-set blacklist src
#********************************************************************
#Блокируем все остальное
$IPT -A INPUT -j DROP

#Вывод информации о состоянии таблиц
route -n
$IPT -L
$IPT -L -v -n
$IPT -L -v -n -t nat
#Перезапуск fai2ban-incremental
service fail2ban restart 

Есть более интересные вопросы - чем и как ты ipset забиваешь и что конкретно делает fail2ban?

На счет apache - поищи mod_security почитай что это и тп, возможно тебе зайдет и ты начнешь его использовать.

В fail2ban (v0.11.0.3), сканит логи ssh, dovecot, exim4, vsftpd. В каждый джайл добавил секцию banaction = iptables-ipset-proto4

enabled = true
banaction = iptables-ipset-proto4
port = 2278
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Когда перезапускаеш скрипт iptables, автоматически стираются все цепочки правил. И необходимо перезапустить fail2ban для активации его правил.

Я еще делал импорт с глобальных черных списков, а так же лочил по странам, например Чад, Индонезия и т.п.

Запили еще скан директорий антивирусом или мониторингом на предмет новых файлов. Выше приведенные примеры, обычно защита от ботов.

Mod_security и мониторинг директорий в дополнении могут помочь от целенаправленной атаки / детектировать ее. Так-же убедись в корректности прав на каталог сайта.

По поводу iptables - всегда юзал firewalld, со стероидами в виде f2b и других тулз, можно закрыть бОльшую часть проблем. Почитай как закручивать гайки на apache - https://www.cisecurity.org/benchmark/apache_http_server/ и то-же самое для твоей системы.

Ну и логи веб сервера смотри, кто приходит к тебе, их тоже можно дропать, например по кривым юзер-агентам (как в apache не скажу, в nginx легко делается)

1 Симпатия