Статьи

Защитите свой сервер с помощью iptables

Центральным элементом защиты сервера Linux, подключенного к Интернету, является наличие хорошего брандмауэра и определенных политик. Для тех, кто рассматривает брандмауэры для Linux, существует множество вариантов, однако бесплатное и включенное решение предлагается через Netfilter и iptables.

Stateful Firewall

Начиная с ядра Linux 2.4 и выше, Netfilter был включен как расширение ядра большинством (если не всеми) дистрибьюторами Linux. iptables является его аналогом и инструментом для управления правилами брандмауэра. Дуэт, который я называю просто «iptables», создает межсетевой экран с сохранением состояния на рабочем столе или сервере Linux. «Stateful» относится к способности брандмауэра отслеживать состояние пакетов, входящих и выходящих из сервера и / или сети.

Это улучшение по сравнению с предыдущими ipchains, благодаря которым состояние пакета было недоступно. Таким образом, iptables может различать новые и существующие соединения и отслеживать трафик. iptables распознает четыре типа состояний пакетов: новые, установленные, связанные и недействительные.

Разработчик может использовать любое количество маршрутов и вариантов при развертывании брандмауэра iptables: с помощью предварительно упакованных решений, таких как APF , из панели управления, такой как Webmin , в которой имеется модуль iptables, или с помощью инструмента настройки графического интерфейса, такого как Firestarter .

В этой статье мы сосредоточимся на защите единой среды веб-сервера разработки, в которой предлагается несколько услуг. Это будет выполнено путем настройки iptables вручную в текстовом редакторе командной строки (который традиционно хранится в / etc / sysocnfig / iptables).

Это также означает, что мы будем обсуждать только таблицу фильтров, которая является одной из трех таблиц в системе брандмауэра (другие включают в себя Mangle, которая управляет проблемами качества обслуживания с трафиком пакетов, и таблицу NAT (преобразование сетевых адресов)).

Как работает iptables

iptables выполняет свои правила на основе рукопожатия протокола TCP. Когда удаленное устройство подключается к вашему серверу, пакет отправляется с битом SYN (сокращение от синхронизации), который обычно подтверждается с помощью SYN / ACK (подтверждение синхронизации) отправляется с вашего сервера обратно клиенту. Затем клиент подтверждает получение этого с помощью ACK, и сетевые отношения устанавливаются.

Эта терминология также стала более привычной для администраторов, не входящих в сеть, в последние годы из-за некоторых широко известных случаев наводнения SYN, которое используется для выполнения атак типа «отказ в обслуживании». Это происходит, когда удаленный злонамеренный хост (или хосты) повторно отправляет пакеты SYN на несколько портов на сервере, которые сервер подтверждает. Однако вместо того, чтобы отправлять ACK обратно, чтобы открыть законное соединение, удаленные злонамеренные хосты продолжают отправлять пакеты SYN, и сервер неоднократно пытается подтвердить их, в конечном итоге забивая пропускную способность и системные ресурсы, и либо серьезно препятствуя, либо блокируя весь другой трафик. ,

Мы рассмотрим вариант защиты от переполнения SYN позже, когда настроим брандмауэр нашего сервера.

Начиная

Только пользователь root может управлять iptables, поэтому обычные меры предосторожности — принятие мер в качестве пользователя root — могут нанести вред здоровью вашего сервера, если пользователь не будет осторожен.

iptables может или не может работать в вашей системе. Вы можете проверить, выполнив '/etc/rc.d/init.d/iptables status'

Управлять операциями iptables просто, с такими параметрами, как запуск, остановка, состояние и другие, используя вышеуказанную команду.

На данный момент мы предполагаем, что у вас нет конфигурации iptables, и мы создадим файл правил с нуля. Во-первых, нам нужно определить сервисы, которые вы хотите включить (например, FTP, SSH, почта и HTTP), определить проблемные области (например, SYN-флуд) и, возможно, отметить любые IP-адреса, доступ к которым вы можете попытаться заблокировать.

Если вы используете систему со вкусом Red Hat, как и я (Fedora Core 3 на сервере разработки), вы можете найти некоторые общие правила в файле / etc / sysconfig / iptables. Вы захотите сделать резервную копию существующего файла iptables, если он использовался. Это можно сделать в командной строке через 'cp /etc/sysconfig/iptables /etc/sysconfig/iptables.backup'

Чтобы начать создавать свои правила, откройте этот файл в своем любимом редакторе командной строки. Я выпускаю 'vi /etc/sysconfig/iptables' Вы нажмете клавишу Вставить или клавишу буквы I, чтобы начать редактирование. Помните, что когда вы закончите редактирование, вам нужно нажать клавишу ESC и набрать ‘: wq’, чтобы сохранить файл в Vi.

Разрешение целевого доступа

Давайте создадим набор правил брандмауэра, которые разрешат ftp и разрешат ssh только для указанных вами IP-адресов и некоторых дополнительных портов, которые могут вам понадобиться для других служб. Мы разберем каждый раздел и обсудим детали по ходу дела.

Одно предостережение: этот пример брандмауэра не будет полностью усиленным обзором для действительно параноидальной производственной коробки; он призван служить учебником для начинающих, чтобы помочь вам привыкнуть к работе с основными правилами с надежным уровнем фильтрации пакетов.

Открыв файл iptables в своем любимом текстовом редакторе, начните с установки основных параметров. Используйте следующую запись:

 #My firewall config in /etc/sysconfig/iptables 
#It is good practice to comment, initial, and date your config files for the sake of shared #administrative environments and, also, so you remember what has been done in a file.
*filter
:OUTPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:FWALL-INPUT - [0:0]
:INPUT ACCEPT [0:0]
-A INPUT -j FWALL-INPUT

Это позволяет исходящий доступ с вашего сервера и позволяет пересылать, а также принимать весь входящий трафик (если передача пакетов через ваш сервер не требуется, просто измените FORWARDACCEPTDROP Однако этот код перенаправляет весь входящий трафик в правила нашего брандмауэра ( FWALL-INPUT

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

 #accept all incoming ssh traffic 
-A FWALL-INPUT -p tcp -m tcp -s 0/0 --dport 22 -j ACCEPT

Альтернативно, SSH может быть ограничен идентифицированными хостами статического IP-адреса:

 #accept incoming ssh traffic from user John Doe 
-A FWALL-INPUT -p tcp -m tcp -s x.x.x.x --dport 22 -j ACCEPT
#end specific ssh access – this commenting is handy of you have multiple users here as #you can start and end sections if  users have multiple IPs from which they can access

Разбивая эти строки кода, мы видим:

  • -A
  • -ptcpudpicmp
  • -mSYN Это лучше объяснить подробно в «man iptables», чем здесь, так как доступно несколько уровней опций.
  • -s0/010.0.1.0/24
  • --dport в случае с SSH — 22
  • -jACCEPTDROP

Далее, давайте рассмотрим FTP, запись для панели управления Webmin и множество часто используемых портов, которые важны для работы вашего сервера в Интернете.

# manage ftp port traffic
-A FWALL-INPUT-p tcp -m tcp --dport 21 -j ACCEPT
# end ftp port

# Мой пользовательский порт webmin
-A FWALL-INPUT -p tcp -m tcp —dport 42009 -j ПРИНЯТЬ
# конец webmin

#SNMP-мониторинг, чтобы я мог использовать инструмент удаленного мониторинга
-A FWALL-INPUT -p udp -m udp —dport 161 -j ПРИНЯТЬ
-A FWALL-INPUT -P UDP -M UDP —Sport 1023: 2999 -J ПРИНЯТЬ
#end SNMP

Краткое замечание по безопасности: при включении удаленного доступа к SNMP, убедитесь, что потратили время на защиту ваших файлов конфигурации SNMP, включая изменение строк сообщества и использование аутентификации.

 # some standard out ports with port definition 
#POP mail
-A FWALL-INPUT-p tcp -m tcp --dport 110 -j ACCEPT  --syn
#HTTPS
-A FWALL-INPUT-p tcp -m tcp --dport 443 -j ACCEPT  --syn
#SMTP Traffic
-A FWALL-INPUT-p tcp -m tcp --dport 25 -j ACCEPT  --syn
#HTTP
-A FWALL-INPUT-p tcp -m tcp --dport 80 -j ACCEPT  --syn
#In my case - Urchin
-A FWALL-INPUT-p tcp -m tcp --dport 9999 -j ACCEPT  --syn
#MySQL database server
-A FWALL-INPUT-p tcp -m tcp --dport 3306 -j ACCEPT  --syn
-A FWALL-INPUT-p udp -m udp --dport 3306 -j ACCEPT
#IMAP mail services
-A FWALL-INPUT-p tcp -m tcp --dport 143 -j ACCEPT  --syn
#DNS
-A FWALL-INPUT-p tcp -m tcp --dport 53 -j ACCEPT  --syn
-A FWALL-INPUT-p udp -m udp --dport 53 -j ACCEPT
-A FWALL-INPUT-p udp -m udp -s 0/0 -d 0/0 --sport 53 -j ACCEPT
#Localhost traffic
-A FWALL-INPUT-i lo -j ACCEPT
#The below commits the rules to production for iptables to execute
COMMIT

Вы заметите, что мы добавили флаг --syn Это часть ранее упомянутой опции -m Здесь мы специально гарантируем, что будут приняты только новые соединения с битом SYNACK

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

 #Drop all other new requests not meeting any existing rule requirements applied to traffic 
-A FWALL-INPUT -p tcp -m tcp -j REJECT  --syn
-A FWALL-INPUT -p udp -m udp -j REJECT
SYN Защита от наводнений

Для некоторой дополнительной защиты мы можем также попытаться предотвратить переполнение новых запросов (пакеты с установленным битом SYNACK

 -A FWALL-INPUT –p tcp --syn -m limit --limit 5/second -j ACCEPT

Это должно появиться в верхней части ваших правил, чуть выше первой записи SSH.

Запрет доступа

Если в журналах обнаружены проблемные хосты, их можно заблокировать с помощью iptables; Однако будьте осторожны в свете маскировки IP. Поищите IP-адрес, который вы хотите заблокировать, чтобы убедиться, что он не является легальным SMTP-сервером или, что еще хуже, одним из ваших клиентов, подделанных.

Чтобы заблокировать определенный хост:

 #Block malicious system 
-A FWALL-INPUT -p tcp -m tcp -s x.x.x.x -j DROP
Проверка журналов брандмауэра

iptables традиционно записывает основные записи в /var/log/messages Тем не менее, если вы хотите отслеживать и исследовать трафик, в правилах брандмауэра должны быть указаны конкретные записи. Многие предпочитают регистрировать только действия по drop/reject

Это может быть обработано с помощью следующей записи:

 #Option 1 logging drop/reject actions 
-A FWALL-INPUT -j LOG --log-level alert
#Option 2 logging with a prefix for easy search/grep of log file
-A FWALL-INPUT -j LOG --log-prefix "Dropped: "

Наконец, доступен хороший анализатор логов с открытым исходным кодом iptables ; он предоставляет интерфейс, аналогичный тем, которые обычно используются для просмотра статистики веб-трафика. Этот демон, который можно найти на сайте gege.org , можно внедрить в среду LAMP (в частности, PHP и MySQL) и использовать для регистрации всех действий iptables вместо стандартных /var/log/messages

Настройка и настройка просты, и только незначительное изменение файла iptables запустит процесс создания отчетов.

Следующие шаги

Страницы руководства по iptables обширны, и рекомендуется потратить некоторое время на привыкание к различным параметрам, прежде чем запускать брандмауэр в производство. Например, существуют опции для использования опции -m (сопоставление) для управления состояниями пакетов — то есть, разрешать только новые и установленные соединения для определенных сервисов.

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

Наконец, как отмечалось ранее, этот брандмауэр не представляет конфигурацию be-all и end-all. Это отличное место для начала при изучении ваших вариантов с iptables. Администраторы, в зависимости от их среды, будут иметь различные уровни паранойи, чтобы приспособиться. Некоторые системы, которыми я управляю, заблокированы настолько, насколько это возможно, в то время как другие имеют достаточно открытые двери для тестирования и разработки.