Защищаем Linux с помощью iptables

—

от автора

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

Система Iptables встроена в ядро Linux. То есть, все сетевые пакеты, которые проходят через данный узел, отправляются или принимаются данным узлом, ядро операционной системы направляет через фильтр iptables. В процессе обработки ядром эти пакеты проходят проверку, по результатам которой к ним применяется указанное в настройках iptables действие. Так пакет может быть передан далее целевому приложению или отброшен.

По типам все пакеты можно разделить на три вида: входящие (Input), проходящие (Forward), исходящие (Output). Рассмотрим каждый из этих видов подробнее.   

Для настройки iptables используются цепочки (chains), поэтому далее говоря о настройках МЭ мы будем использовать этот термин.  Цепочка входящие используется для управления поведением входящих подключений. Например, если пользователь попытается подключиться по SSH к вашему ПК/серверу, iptables попытается сопоставить IP-адрес и порт с правилом в цепочке Input.

Цепочка Output используется для исходящих подключений. Например, если вы попытаетесь выполнить пинг ya.ru, iptables проверит свою цепочку Output, чтобы узнать, какие правила действуют в отношении ping и ya.ru прежде чем принимать решение разрешить или запретить попытку подключения.

И, наконец, цепочка Forward. Эта цепочка используется для входящих подключений, которые на самом деле не доставляются локально на данный узел. Здесь можно провести аналогию с маршрутизатором – данные всегда отправляются на него, но редко на самом деле предназначены для самого маршрутизатора (за исключением каких-нибудь маршрутных таблиц OSPF или BGP), данные просто пересылаются своему адресату. Если ваш узел не является программным маршрутизатором (такое тоже иногда бывает) или чем-либо еще, требующим переадресации, вы даже не будете использовать эту цепочку.

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

Идеология МЭ

Перед тем, как начать настраивать правила на любом межсетевом экране необходимо определиться с тем, по какому принципу у нас будет настраиваться доступ. Можно по принципу запрещено все, что не разрешено или разрешено все, что не запрещено. И хотя все прекрасно знают, что безопасным и соответственно правильным является первый принцип, на практике можно встретить разные варианты построения списков доступа. Очень часто бывает так, что по факту запрещаются только отдельные соединения и протоколы а все остальное остается разрешенным (например последнее правило на периметровом МЭ – permit any any).

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

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

 iptables --policy INPUT DROP

iptables --policy OUTPUT DROP

iptables --policy FORWARD DROP

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

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

В iptables пакет можно Принять (Accept), Отбросить (Drop) наше действие по умолчанию и Отклонить (Reject). Сразу может возникнуть вопрос, в чем разница между Отбросить и Отклонить, так как в обоих случаях у нас соединение не устанавливается. В случае Drop соединение прерывается и никакая информация в ответ не отправляется, в то время, как при Reject обратно отправляется сообщение об ошибке.

Типичной иллюстрацией различия этих двух действий является реакция на ping. Слева Drop, справа Reject.

Разрешаем хосты и порты

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

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

Соответственно, последовательность правил очень важна. Для добавления правила в конец списка мы будем использовать iptables -A. Если же требуется вставить правило в определенное место в списке, то нам необходимо использовать iptables -I с указанием номера позиции в списке на которую нужно поставить данную запись.

Также, если нам потребуется заменить одно правило на другое, то необходимо использовать iptables -R также с указанием номером заменяемого правила в списке.

Начнем с простого. Разрешим входящие соединения по TCP.

iptables -A INPUT -p tcp -j ACCEPT

Еще один пример, разрешим исходящие соединения на узел 192.168.222.2

iptables -A OUTPUT -d 192.168.222.2 -j ACCEPT

Здесь ключ -s это адрес источника, а -d это адрес назначения. Если мы хотим разрешить все входящие соединения на наш сервер по HTTP, то необходимо использовать следующее правило:

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

Где dport это и есть порт назначения.

Мы можем разрешить доступ также для отдельной подсети:

iptables -A INPUT -s 10.10.10.0/24 -j ACCEPT

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

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

iptables -A INPUT -p tcp —dport ssh -s 192.168.10.10 -m state —state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp —sport 22 -d 192.168.10.10 -m state —state ESTABLISHED -j ACCEPT

Скрипт для автоматизации настройки

В случае, если у вас есть несколько серверов Linux и для каждого из них необходимо применить базовые настройки межсетевого экранирования, мы можем подготовить скрипт, который избавит нас от необходимости ручного ввода отдельных команд. В примере ниже этот скрипт настроит Iptables для организации доступа на веб сервер. То есть, у нас будут доступны входящие соединения по портам 80 и 443, необходимым для работы самого веб сервера. Ну и заодно, наш веб сервер будет доступен для ICMP. Чтобы мы могли его пинговать.

#!/bin/sh  # Очищаем правила Iptables  iptables -P INPUT ACCEPT  iptables -F  iptables -X   iptables -A INPUT -i lo -j ACCEPT  iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT   # Разрешаем HTTP/HTTPS с любого узла  iptables -A INPUT -p tcp -m tcp -m state -m comment -s 0.0.0.0/0 --dport 80 --state NEW -j ACCEPT --comment " HTTP "  iptables -A INPUT -p tcp -m tcp -m state -m comment -s 0.0.0.0/0 --dport 443 --state NEW -j ACCEPT --comment " HTTPS "    # Разрешаем ICMP  iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT     # Политики по умолчанию  iptables -P INPUT DROP  iptables -P FORWARD DROP  iptables -P OUTPUT DROP   # Сохраняем правила  iptables-save

 

Помимо прочего, в этом скрипте показана команда, предназначенная для сохранения изменений — iptables-save

Проверить результаты применения iptables можно с помощью команды:

iptables -L -n

Заключение

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


17 июля в OTUS пройдет открытый урок, посвященный оптимизации производительности MySQL. На занятии познакомимся с основными аспектами оптимизации MySQL:

  • важнейшие параметры конфигурации;

  • работа с кэшированием;

  • оптимизация структуры БД;

  • поиск медленных запросов;

  • использование репликации и разделения ролей.

Записаться можно на странице курса «Administrator Linux. Advanced».


ссылка на оригинал статьи https://habr.com/ru/companies/otus/articles/746636/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *