Linux

Безопасный стандартный набор правил iptables для базового веб-сервера HTTP(s)

Я пытался собрать базовый серверный iptables скрипт, который будет работать для большинства сайтов, просто запускающих базовый веб-сервер, использующий HTTP(S) и SSH (порты 80, 443 и 22). В конце концов, большинству VPS нужны только эти начальные правила для портов, а почтовые или игровые порты можно добавить позже по мере необходимости. На данный момент у меня есть следующий набор правил, и мне интересно, знает ли кто-нибудь лучший сценарий или какие-нибудь улучшения, которые можно добавить.

*filter

# Разрешает весь loopback (lo0) трафик и отбрасывает весь трафик на 127/8, который не использует lo0.

-A INPUT -i lo -j ACCEPT

-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Принимает все установленные входящие соединения

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Разрешает весь исходящий трафик

# Вы можете изменить этот параметр, чтобы разрешить только определенный трафик

-A OUTPUT -j ACCEPT

# Позволяет HTTP и HTTPS соединения из любого места (обычные порты для веб-сайтов)

-A INPUT -p tcp --dport 80 -j ACCEPT

-A INPUT -p tcp --dport 443 -j ACCEPT

# Разрешает SSH-соединения (только 4 попытки с одного IP каждые 3 минуты, остальные отбрасываются)

-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource

-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 4 --name DEFAULT --rsource -j DROP

-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

# Разрешает ping

-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables запрет вызовов

-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Отклонять все другие входящие - по умолчанию запрещено, если политика явно не разрешена.

-A INPUT -j REJECT

-A FORWARD -j REJECT

COMMIT

iptables – одна из самых важных частей защиты вашего сервера (также см. fail2ban), и все же многие люди, как и я, испытывают трудности с пониманием всего того, что входит в создание безопасного базового брандмауэра для наших серверов.

Каков наиболее безопасный способ открыть только основные порты, необходимые для веб-сервера?

Ответ 1

Это выглядит довольно хорошо, но вы можете немного усовершенствовать настройки. Флаг -s – это IP-адрес источника или имя домена, и вы можете добавить «-s 198.23.12.32» или любой другой ваш IP-адрес, чтобы разрешить SSH только с вашего IP-адреса. Вы также можете выбрать диапазон IP-адресов источника, используя нотацию в стиле CIDR.

Следует соблюдать осторожность при регистрации отклоненных вызовов. IP-адрес вашего сервера будет сканироваться ботами, скрипт-кидди и т. д., и файл журнала может быстро стать большим. Если вы не пытаетесь диагностировать конкретную проблему, которая, по вашему мнению, может быть связана с тем, что кто-то пытается сломать ваш брандмауэр, я бы убрал эту опцию.

Вы также можете подключить fail2ban к iptables для псевдо-IDS. fail2ban будет сканировать ваши файлы журналов и может блокировать IP, если они пытаются проникнуть в вашу систему. Например, если определенный IP-адрес не смог войти в SSH 5 раз, вы можете заблокировать его на целый день. Он также работает на FTP и многих других (включая плохих ботов, атакующих Apache). Я использую его на всех своих серверах, чтобы обеспечить дополнительную защиту от атак методом перебора.

Ответ 2

Я бы сказал, что это довольно хороший брандмауэр, за исключением того, что он ориентирован на остановку входящего трафика и не сосредоточен на входящем или исходящем трафике. Во многих случаях так же важно уделять внимание исходящим соединениям с компьютера, как и входящим. В неудачном случае, когда машина действительно эксплуатируется, было бы неплохо иметь возможность предотвратить загрузку дополнительных корневых наборов, подключение к командным узлам и узлам управления или что-то еще.

Одна из приятных особенностей iptables в том, что он может запоминать состояние соединения, это может иметь последствия для производительности на сайтах с большим трафиком, но вы можете изменить ваш входящий доступ по http/https, чтобы разрешить ответ только на установленных соединениях, или специально ограничить определенных непривилегированных пользователей от исходящего доступа вообще. Тогда ваши правила исходящего доступа будут содержать пункты RELATED, ESTABLISHED, что предотвратит целый ряд вспомогательных атак и замедлит те, которые требуют вторичного этапа для фактической эксплуатации ящика, что очень распространено.

Наконец, я бы сказал, что лучше установить политику iptables -P DROP, чем добавлять REJECT в конце. Это в основном вопрос предпочтений, но это может уменьшить количество ошибок при добавлении в цепочки с существующими правилами вместо вставки или сброса.

Ответ 3

Посмотрите на Shorewall. Конфигурация по умолчанию с одним интерфейсом будет хорошей отправной точкой. Она проста в настройке и имеет макросы для таких вещей, как SSH и веб-доступ. Его можно настроить на блокировку сервера до нужного уровня при отключении брандмауэра. С помощью Shorewall-lite можно запустить сборку брандмауэра на другом сервере. Ведение журнала легко настроить на нужный уровень.

Для базового HTTP-сервера вам нужен открытый входящий доступ к порту 80 и к порту 443, если вы используете HTTPS. Входящий доступ SSH с нескольких ограниченных адресов обычно желателен. Возможно, вы захотите заблокировать и исходящий доступ. Откройте брандмауэр только для необходимых серверов и служб. Следует открыть NTP и DNS, а также канал для получения исправлений.

Схожие статьи

Linux

С какими проблемами сталкиваются администраторы при изучении дистрибутива Linux?

Linux

Что мешает кому-то установить некоторую запись для моего домена?

Linux

Цикл по содержимому файла в Bash

Linux

Как предотвратить случайное использование rm -rf ?

×