14:50 

Настраиваем Iptables для защиты веб сервера на базе debian или ubuntu

jewish dragon
Alea jacta est. Юлий Цезарь 44 г. до н.э. (Жребий брошен)





1. Первым делом очистим существующую таблицу правил:

# iptables -F

2. Нам нужно разрешить SSH доступ чтобы при блокировании всего, мы не потеряли контроль над сервером. Стндартным решением (по мнению авторов большинства подобных статей) для этого была бы команда:

-A INPUT -p tcp -i eth0 --dport 22 -j ACCEPT

Но разрешая доступ на SSH в самом начале, мы потом не сможем наложить на SSH правила по его защите от перебора паролей (Bruteforce). Почему? потому, что правила в iptables применяются последовательно! И все другие ограничения которые бы мы наложили на 22 порт ниже текущего правила, уже не имели бы своей силы.
Итак, сначала защита самого SSH потом его доступ, потом остальная конфигурация.

2.1 Для качественой защиты от брутфорса, будем использовать дополнительный модуль который можно установить и сконфигурировать так:

# aptitude install module-assistant xtables-addons-source
# module-assistant prepare
# module-assistant auto-install xtables-addons-source
# depmod -a

2.2 После успешной установки доп. модулей, вводим правила для защиты SSH:

Вариант 1.

# iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --update --seconds 20 -j TARPIT
# iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT

Первое правило проверяет наличие в динамическом списке ip-адреса отправителя, и запись об этом адресе должна быть “моложе” 20 секунд. Иначе – TARPIT. Второе правило разрешает обращение на 22-й порт и заносит IP-адрес в динамический список.

Вариант 2.

# iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit 1/hour --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name SSH --hashlimit-htable-expire 60000 -j ACCEPT

# iptables -A INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -j DROP

Первое правило разрешает два соединения на 22-й порт в течение часа, после чего начнёт срабатывать второе правило. Срок действия хэш-таблицы с ip-адресами – 60 секунд, после которых можно повторить попытку. Однако при срабатывании второго правила этот счетчик будет сбрасываться. При действии этих правил в /proc/net/ipt_hashlimit будет создаваться файл с именем, заданным параметром –hashlimit-name.

2.3 Теперь после защиты, можно открыть SSH:

# 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 атак:

Защита от SYN-flood:

# iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
# iptables -A INPUT -p tcp --syn -j DROP

Защита от сканеров портов:

# iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
# iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP

Защита от Ping of death:

# iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

- Разрешаем трафик для необходимых служб

# iptables -A INPUT -i eth0 -p tcp --dport 21 -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 tcp --dport 80 -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp --dport 443 -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.

5. Настраиваем стандартные исходящие и входящие потоки

# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

6. Сохраняем наши новые правила и прописываем их в конфигурационный файлик, дабы они не потерлись после перезагрузки системы.

# iptables-save
# iptables-save > /etc/iptables.conf

Посмотреть текущую таблицу фильтрации можно так:

# iptables -L

7. Автоматическая запись и восстановление правил

# nano /etc/network/interfaces

добавляем в конец файла interfaces следующие строки:

pre-up iptables-restore < /etc/iptables.conf
post-down iptables-save > /etc/iptables.conf

Теперь при отключении машины правила сами будут сохраняться, а при включении - восстанавливаться.

*Удаление определенных правил.

При помощи следующей команды смотрим номер правила, которое нам здесь необходимо удалить:

# iptables -L INPUT --line-number

Запомним номер и удалим правило под номером 2

# iptables -D INPUT 2

@темы: IT

URL
   

Просто жизнь...

главная