Безопасность Samba посредством Iptables

Безопасность Samba посредством Iptables

26.01.2018 Безопасность 0
samba

В Samba имеется достаточно много возможностей для ограничения доступа к общим ресурсам, например, это разрешение доступа только для определенных пользователей, установка паролей, проверка членства в группах и фильтрация на сетевом уровне. Параметры последней группы, например, allow hosts и smb ports работают на уровне IP-адресов и портов UDP/TCP, позволяя указывать, каким компьютерам разрешено подключаться к серверу Samba.

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

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

Управление доступом на уровне хоста, а не на уровне приложения позволяет разделять проблемы и снижает количество ошибок, вызванных внесением изменений в файл smb.conf.

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

Первая важная идея iptables заключается в идее самих таблиц. Таблица – это независимый список правил и действий. Если ядро Linux должно отфильтровать пакет, то оно обращается к таблице filter. Если выполняется трансляция сетевых адресов (NAT), то используется таблица nat. В зависимости от того, какие сетевые функции были загружены в ядро, могут использоваться различные таблицы. Пакеты могут передаваться между несколькими таблицами, например, при выполнении фильтрации пакета до выполнения трансляции сетевого адреса.

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

INPUT. Используется для определения того, что делать с пакетами, предназначенными для самого хоста.
OUTPUT. Применяется к пакетам, созданным хостом.
FORWARD. Работает только с пакетами, передающимися с одного сетевого интерфейса на другой, например, когда хост выступает в качестве маршрутизатора.

Цепочка содержит упорядоченный список правил (он может быть пустым), каждое из которых состоит из условия и выполняемого действия. Условие может быть практически любым, начиная от IP-адреса или порта и заканчивая операторами ограничения скорости, срабатывающими только при слишком частом повторении определенного события. Выполняемым действием может быть другая цепочка или операция, например, инструкция на принятие или сброс пакета. Как условия, так и выполняемые действия можно создавать с помощью модулей ядра, поэтому возможности безграничны.

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

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

Если вы решили защищать весь хост, то не имеет значения, какие порты использует Samba. В следующем примере показана простая политика, позволяющая локальному серверу принимать трафик только от клиентов частной сети 192.168.5.0/24.

Первая команда добавляет правило в цепочку INPUT путем его добавления в текущий список правил. Это правило говорит о том, что для любого трафика, приходящего из сети-источника (-s) 192.168.5.0/24, будет выполняться действие ACCEPT, разрешающее получение пакетов. Вторая команда разрешает получение пакетов, приходящих при уже установленном соединении – за это отвечает вызов matcher state (оператор проверки соответствия состояния -m state). Этот matcher state следит за тем, какие подключения покидают хост. Ответные исходящие пакеты считаются установленными или связанными (established или related), поэтому остальные правила пропускают эти пакеты.

Последняя команда определяют политику по умолчанию цепочки INPUT, сбрасывающую пакеты. Если пакет не пришел из сети 192.168.5.0/24 или не является пакетом установленного хостом соединения, то он сбрасывается.

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

Samba использует четыре различных порта:

137 UDP. Службы имен NetBIOS.
138 UDP. Службы датаграмм NetBIOS.
139 TCP. Службы сеансов NetBIOS.
445 TCP. Прямая передача (CIFS over TCP).

Политика, разрешающая подключения к Samba только из сети 192.168.5.0/24 и подключения к Web-серверу без каких-либо ограничений (на уровне портов)

Политика на уровне портов сложнее политики, реализованной принимать трафик от клиентов определенной частной сети, указанной выше, поскольку в ней определяются несколько различных приложений, для каждого из которых применяются свои правила. Первые два правила соответствуют любым входящим TCP-пакетам (-p tcp), являющимся частью нового подключения (-m state —state NEW) и отправляемым на порты 80 или 443 (—dport 80, —dport 443). Никаких ограничений на адрес источника нет, поэтому принимаются любые пакеты.

Следующие две строки соответствуют UDP-пакетам (-p udp), приходящим из внутренней сети (-s 192.168.5.0/24) на порты 137 и 138 (—dport 137, —dport 138). UDP является протоколом без запоминания состояния (stateless), поэтому нет необходимости выяснять, новое это подключение или уже установленное.

Строки 5 и 6 объединяют команду сопоставления состояния с фильтром адресов источников, разрешая только новые подключения к портам 139 и 445, если пакеты приходят из внутренней сети.

Наконец, последние две строки работают так же, как и в предыдущей политике. Если пакет относится к уже установленному соединению, то он принимается. Весь остальной трафик отбрасывается.

Для просмотра политики используется команда unexpected. Опция -L выводит содержимое политики, а опция -v позволяет выводить дополнительную информацию, например, счетчики пакетов.

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

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

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

Политика, содержащая перекрывающиеся правила:

Политика, содержащая перекрывающиеся правила

Здесь видно, что сервер находится в другой сети с адресом 192.168.1.0/24. Доступ для остальных пользователей компании, находящихся в сети 192.168.5.0/24, должен быть заблокирован. Поскольку сеть 192.168.1.0/24 является частью сети 192.168.5.0/24, а правило, полностью блокирующее всю сеть 192.168.5.0/24 указано перед правилами, относящимися к SMB, то для пользователей сети 192.168.1.0/24 будет срабатывать правило DROP, поскольку в iptables используется принцип первого совпадения, а не наилучшего.

Решением этой проблемы является перемещение правила блокирования второй сети вниз чтобы оно стояло после более конкретных правил. Тогда прием пакетов второй сети (192.168.1.0/24) сервером будет разрешен.

Не редки случаи, когда неправильно настроенный брандмауэр блокирует доступ к samba — серверу. Самый простой способ проверить это – отключить брандмауэр и посмотреть, установится ли соединение, или нет. Однако это не всегда возможно, поэтому если вы не можете отключить брандмауэр, то проверьте, приходят ли пакеты на сервер.

Сетевые пакеты, которые видит сервер (даже если брандмауэр блокирует их), может показать программа tcpdump. Если tcpdump показывает попытки установления соединения сервером, значит, пакеты доходят до него. Это означает, что пакеты блокируются брандмауэром (при условии, что служба запущена).

Трассировка пакетов заблокированного SMB-подключения

tcpdump была запущен со следующими опциями:

-i wlan0. Прослушивать сетевой интерфейс wlan0.
tcp port 445. Отслеживать пакеты на TCP-порту 445.

Здесь мы видим три пакета, пришедшие на сервер. Стрелка означает направление потока: эти три пакета пришли с клиента на порт сервера microsoft-ds (порт с номером 445). Символ S в конце строки означает попытку подключения, а отсутствие ответа означает, что сервер не отвечает.

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

Настройка сервера SAMBA для инсталлятора