Главная страница

Статья на Хабре Используем nftables в Red Hat Enterprise Linux 8 Технические требования


Скачать 0.63 Mb.
НазваниеСтатья на Хабре Используем nftables в Red Hat Enterprise Linux 8 Технические требования
Анкорnftables
Дата15.09.2022
Размер0.63 Mb.
Формат файлаdocx
Имя файлаtest.docx
ТипСтатья
#678367
страница3 из 4
1   2   3   4


Подготовка стенда

  1. Средствами системы виртуализации создадим отдельную виртуальную сеть (VMnet), которую назовем «Custom11».

  2. Ранее созданный шаблон виртуальной машины растиражируем в 5 отдельных экземпляров: FW, User1, User2, Server1, Server2.

  3. К виртуальной машине FW добавим второй виртуальный сетевой адаптер, который соединим с сетью «Custom11». Ее первый сетевой адаптер должен быть подключен к виртуальной сети «NAT».

  4. Сетевые адаптеры машин User1 и User2 подключим к «Custom11», а сетевые адаптеры Server1, Server2 подключим к «NAT».

  5. Редактируя файлы /etc/network/interfaces, назначим всем виртуальным машинам статические IP-адреса, а также шлюзы (GW) и DNS-сервера в соответствии со схемой лабораторного стенда. В качестве шлюзов по умолчанию для Host1 и Host2 будет 192.168.0.40, для Server1 и Server2 172.30.0.40, а для FW 172.30.0.2

  6. На виртуальной машине FW активируем функции маршрутизации IPv4 трафика. Для этого в файле /etc/sysctl.conf раскомментируем строку net.ipv4.ip_forward=1. Сделать это можно с помощью заклинания:


sed '/net.ipv4.ip_forward=1/s/^#//' -i /etc/sysctl.conf

  1. Проверим стенд. Host1 и Host2 должны иметь возможность «пингануть» Server1, Server2 и FW и наоборот. FW должен иметь возможность «пингануть» любой из узлов сети.


Ход выполнения работы

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

  2. Анализируя матрицу доступа можно предположить, что User1 является рядовым работником, и ему требуется доступ по http ко всем серверам. Назовем такой доступ ролью «all_web». Для User2 требуется предоставить доступ ко всем серверам по SSH, вероятно он системный администратор. Обозначим такой доступ ролью «all_ssh». Обоим пользователям требуется доступ к DNS-серверу — это будет роль «DNS».

  3. Наиболее простым способом создать в nftables ролевую систему разграничения доступа будет применение правил, где в качестве аргументов используются списки (sets), содержащие конкретные параметры предоставления доступа. В нашем случае для каждой роли нужно создать два списка: наименование роли_users и наименование роли_servers. В первый список будут добавляться IP-адреса пользователей, во второй — IP-адреса серверов, а также протоколы и доступные порты.

  4. После создания списков для каждой роли создадим правило, разрешающее установку соединений ip saddr @название роли_users ip daddr. meta l4proto. th dport @название роли_servers accept. Трафик по инициированным соединения, как обычно, будет проходить с помощью правила ct state established,related accept.

  5. Итоговый конфигурационный файл (/etc/nftables.conf), решающий поставленную задачу будет выглядеть следующим образом:


#!/usr/sbin/nft -f
flush ruleset
table ip firewall {
set all_web_users {

type ipv4_addr

flags interval

elements = { 192.168.0.101 }

}
set all_web_servers {

type ipv4_addr . inet_proto . inet_service

flags interval

elements = { 172.30.0.101-172.30.0.102 . tcp . 80 }

}
set all_ssh_users {

type ipv4_addr

flags interval

elements = { 192.168.0.102 }

}
set all_ssh_servers {

type ipv4_addr . inet_proto . inet_service

flags interval

elements = { 172.30.0.101-172.30.0.102 . tcp . 22 }

}

set DNS_users {

type ipv4_addr

flags interval

elements = { 192.168.0.101, 192.168.0.102 }

}
set DNS_servers {

type ipv4_addr . inet_proto . inet_service

flags interval

elements = { 172.30.0.2 . udp . 53 }

}
chain fw_forward {

type filter hook forward priority filter; policy drop;

ct state established,related accept
ip saddr @all_web_users ip daddr . meta l4proto . th dport @all_web_servers accept

ip saddr @all_ssh_users ip daddr . meta l4proto . th dport @all_ssh_servers accept

ip saddr @DNS_users ip daddr . meta l4proto . th dport @DNS_servers accept

}

}


Примечание. После настройки всех правил вы столкнетесь с одной проблемой: DNS на User1 и User2 работать не будет. Это не баг, это методическая фича. Проблема в том, что DNS-сервер работает на виртуальном маршрутизаторе, который ничего не знает о пользовательской сети 192.168.0.0/24, из-за этого ответы на запросы не доходят до адресатов. Этой проблемой хотелось показать реальные сложности, возникающие при сегментации уже работающих сетей с помощью разделения их на IP-подсети. На предприятиях со сложившейся инфраструктурой, но низким уровнем зрелости IT внедрить подобные меры защиты крайне сложно, а учитывая user resistance, практически невозможно. Но проблема все же имеет решение, и мы поговорим о нем прямо сейчас.
Типовой сценарий: сегментирование локальной сети коммутатором с функцией брандмауэра


Данный подход к межсетевому экранированию имеет множество названий: коммутатор с функцией брандмауэра, «stealth firewall», «transparent firewall» и др. Суть, однако, заключается в том, что сегментируемая сеть сохраняет свою IP-адресацию, а разделение происходит путем установки коммутатора в разрыв между будущими сегментами. Причем коммутатор фильтрует трафик как обычный межсетевой экран — на основании данных со всех инкапсулированных протоколов (L2, L3, L4, L7), а не только данных с протоколов канального уровня (L2), как в случае с обычным коммутатором.

Сетевые интерфейсы коммутатора не имеют IP-адресов (за исключением тех, что используются для управления). Соответственно, данное устройство не видимо для других сетевых узлов (за исключением случаев, когда используются специфические протоколы, например OSPF). Поэтому коммутатор с функцией брандмауэра часто называют прозрачный межсетевой экран — stealth firewall.

Применение фильтрующих коммутаторов имеет несколько неоспоримых преимуществ:



  1. Внедрение устройства не требует выделения IP-подсетей и, как следствие, перенастройки таблиц маршрутизации роутеров и сетевых стеков узлов.

  2. Устройство очень просто внедрить и очень просто изъять из сети в случае его поломки.


Основной недостаток данной технологии, как ни странно, является прямым следствием ее основного достоинства: сегментирование сети без разделения ее на IP-подсети не позволяет ограничивать широковещательный трафик, что негативным образом сказывается на производительности сетей и усиливает негативные последствия от атак типа широковещательный шторм (broadcast flood), отравления кэша ARP (ARP-poisoning), подмены DHCP (Rogue DHCP Server) и других.
Практическая работа: провести сегментирование сети без разделения ее на IP-подсети


Описание стенда


Используемый лабораторный стенд (Рисунок 5) очень похож на предыдущий, за исключением того, что все машины здесь находятся в одной IP-подсети. Для того, чтобы машины UserX и ServerX не могли связаться между собой напрямую, а использовали для связи FW, их разделили по виртуальным сетям «Custom11» и «NAT».


(Рисунок 5)
Задача


Настроить разграничение трафика в соответствии с матрицей доступа из предыдущей задачи.
Подготовка стенда

  1. Внося изменения в файлы /etc/network/interfaces, назначим статические адреса всем узлам сети.

  2. Для организации работы FW в режиме коммутатора установим на него пакет bridge-utils:


pt install bridge-utils

  1. Затем на узле FW сконфигурируем коммутатор, объединив в мост (bridge) все сетевые порты. Для этого файл /etc/network/interfaces заполним следующим образом:


  2. auto lo

  3. iface lo inet loopback



  4. iface ens33 inet static



  5. iface ens36 inet static



  6. auto br0

  7. iface br0 inet manual

bridge_ports ens33 ens36

  1. Проверим стенд. Все узлы, кроме FW, должны «пинговаться» между собой. DNS, кстати, тоже должен работать.


Ход выполнения работы

  1. Как и в предыдущей задаче рассмотрим только файл с правилами межсетевого экранирования /etc/nftables.conf. Скорее всего при беглом осмотре вы даже не заметите в нем различий по сравнению с таким же файлом из предыдущей задачи.



  2. #!/usr/sbin/nft -f



  3. flush ruleset



  4. table bridge firewall {



  5. set all_web_users {

  6. type ipv4_addr

  7. flags interval

  8. elements = { 172.30.0.11 }

  9. }



  10. set all_web_servers {

  11. type ipv4_addr . inet_proto . inet_service

  12. flags interval

  13. elements = { 172.30.0.101-172.30.0.102 . tcp . 80 }

  14. }



  15. set all_ssh_users {

  16. type ipv4_addr

  17. flags interval

  18. elements = { 172.30.0.12 }

  19. }



  20. set all_ssh_servers {

  21. type ipv4_addr . inet_proto . inet_service

  22. flags interval

  23. elements = { 172.30.0.101-172.30.0.102 . tcp . 22 }

  24. }



  25. set DNS_users {

  26. type ipv4_addr

  27. flags interval

  28. elements = { 172.30.0.11, 172.30.0.12 }

  29. }



  30. set DNS_servers {

  31. type ipv4_addr . inet_proto . inet_service

  32. flags interval

  33. elements = { 172.30.0.2 . udp . 53 }

  34. }



  35. chain fw_forward {

  36. type filter hook forward priority filter; policy drop



  37. ether type arp accept

  38. ct state established,related accept



  39. ip saddr @all_web_users ip daddr . meta l4proto . th dport @all_web_servers accept

  40. ip saddr @all_ssh_users ip daddr . meta l4proto . th dport @all_ssh_servers accept

  41. ip saddr @DNS_users ip daddr . meta l4proto . th dport @DNS_servers accept



  42. }

}


Основные отличия в том, что тип таблицы firewall изменился с ip на bridge, поменялись адреса в списках *_users (так как изменились соответствующие адреса машин), и к правилам фильтрации мы добавили разрешение прохождения ARP трафика.


Проект OneButtonFirewall


Можно ли сделать межсетевой экран, не требующий конфигурирования? Если можно, то что он будет уметь? Давайте разбираться.

Мы с вами рассмотрели несколько схем разграничения трафика. Есть ли среди них та, что не требует конфигурирования, то есть указания IP-адресов или портов, на основании которых производится фильтрация трафика? Конечно, есть, и эта схема первая в списке.

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



  • Запрещен транзит трафика из внешнего сегмента во внутренний, кроме того, что относится к уже установленным соединениям.

  • Разрешен транзит любого трафика из внутреннего сегмента во внешний сегмент.


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

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

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

Ну, вроде бы все учли… ан нет. В ходе эксплуатации OneButtonFirewall всплыла проблема, откуда не ждали – получение IP-адреса от DHCP-сервера, находящегося во внешнем сегменте. ОС Windows получает IP-адреса по DHCP сугубо на широковещательных рассылках, и текущих правил фильтрации ей полностью хватает. Linux же идет своим путем. При получении адреса на конечном этапе DHCP-сервер посылает клиенту адресный (unicast) пакет по UDP 68, и, чтобы тот достиг адресата, в правилах фильтрации нужно сделать соответствующее исключение.
Практическая работа: защитить сегмент сети с помощью межсетевого экрана, построенного по технологии OneButtonFirewall


Описание стенда


Давайте теперь соберем лабораторный стенд (Рисунок 6) и отработаем на нем наши идеи. Тут мы даже немного усложним задачу. У FW будет не два интерфейса: один внутренний и один внешний, а четыре: один внешний и три внутренних. Все узлы, подключенные к внутренним интерфейсам, будем считать внутренним сегментом и фильтровать трафик между этими узлами не будем. Как вы увидите дальше, количество внутренних интерфейсов не имеет значения, но внешний может быть только один.


Рисунок 6

В этом примере для наглядности мы моделируем классическую корпоративную сеть на базе ОС Windows. Host1 – это Windows 10, подключенный к домену Active Directory, контроллер которого (ADDC) расположен во внешней сети. Host2 – Windows 10, не подключенная к домену, а Host3 – наша шаблонная машина на базе Debian. Все HostX получают IP-адреса по DHCP от виртуального маршрутизатора.

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


Защитить узлы HosX от несанкционированных подключений.
Подготовка стенда

  1. На узле FW установим 4 сетевых интерфейса. Для наглядности с помощью средств виртуализации изменим на них MAC-адреса (Рисунок 7):


    Рисунок 7


  2. Один из интерфейсов с MAC-адресом 00:11:11:11:11:00, подключенный к «NAT», переименуем в «external» (Рисунок 7).

    Для этого создадим файл /etc/systemd/network/10-set-external-name.link и заполним его следующим содержанием:


  3. # /etc/systemd/network/10-set-internal1-name.link

  4. [Match]

  5. MACAddress=00:11:11:11:11:00



  6. [Link]

Name=external

  1. Как и при решении прошлой задачи установим на узел FW пакет bridge-utils.

  2. Сделаем из FW коммутатор. Для этого в файл /etc/network/interfaces запишем следующее содержание:




  3. auto lo

  4. iface lo inet loopback



  5. iface external inet manual



  6. iface ens36 inet manual



  7. iface ens37 inet manual



  8. iface ens38 inet manual



  9. auto br0

  10. iface br0 inet manual

    bridge_ports external ens36 ens37 ens38

    1. Проверим работоспособность сети, «пингуя» все узлы. Для проведения тестирования не забудьте отключить встроенный межсетевой экран на Windows машинах. Все узлы должны «пинговаться».


    Ход выполнения работы


    1. Для решения поставленной задачи заполним файл /etc/nftables.conf следующим образом:

    #!/usr/sbin/nft -f
    flush ruleset
    table bridge firewall {
    chain fw_forward {

    type filter hook forward priority filter; policy drop;
    # Разрешаем весь трафик между внутренними портами и трафик

    # от внутренних портов к внешнему

    iifname != "external" accept
    # Разрешаем IPv4 трафик по уже установленным соединениям

    ether type ip ct state established,related accept
    # Разрешаем весь IPv4 трафик с широковещательными MAC адресами

    ether type ip ether daddr ff:ff:ff:ff:ff:ff accept
    # Разрешаем трафик из внешней сети во внутреннюю по UDP 68

    # Костыль для того, чтобы внутренние узлы могли получить адрес по DHCP из внешней сети

    udp dport 68 accept

    }

    }


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


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

    Построить OneButtonFirewall очень просто. Достаточно найти подходящую аппаратную платформу установить туда дистрибутив Linux, в котором есть поддержка nftables, и провести настройку из примера выше. Например, OneButtonFirewall, построенный на базе аппаратной платформы MikroTik, выглядит следующим образом (Рисунок 8):


    Рисунок 8
    Преимущества и недостатки OneButtonFirewall


    Преимуществами аппаратных устройств,, реализующих технологию OneButtonFirewall, по сравнению с другими межсетевыми экранами являются:



    1. Простота и скорость развертывания и изъятия системы защиты.

    2. Защищенность конфигурации от изменения.

    3. Минимальные требования к квалификации персонала.


    Недостатки технологии:



    1. Устройство реализует жесткий алгоритм фильтрации, который решает далеко не все задачи межсетевого экранирования.

    2. Устройство не фильтрует широковещательный трафик и трафик по порту UDP 68 из внешней сети во внутреннюю.


    Сценарии применения


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

    Рассмотрим теперь типовые сценарии применения OneButtonFirewall:



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

    2. Защита сети компании от компьютеров подрядчиков (например, аудиторов).
      Тут обратная схема. Узлы компьютеров подрядчиков через коммутатор подключаются к внешнему порту межсетевого экрана, корпоративная сеть подключается к внутреннему порту. Из корпоративной сети можно подключится к компьютерам подрядчиков, а вот в обратную сторону нет.

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


    Заключение


    Несмотря на довольно внушительный объем статьи, мы с вами успели рассмотреть лишь базовые приемы межсетевого экранирования, причем множество мер можно серьезно улучшить. Но так и должно быть — нет предела совершенству, но первый шаг к нему мы только что сделали.
    P.S.


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

    В Red Hat Enterprise Linux 8 приоритетным низкоуровневым решением является nftables. В этой статье мы поговорим о том, как начать использовать nftables. Наиболее актуальной она будет для системных администраторов и DevOps-специалистов. Там, где это имеет смысл, мы поговорим о различиях между nftables и его предшественником — iptables.

    Для начала необходимо отметить, что nftables – это userland-утилита, nft и подсистема ядра. Внутри ядра она строится на базе подсистемы netfilter. В этой статье мы будем говорить о взаимодействии пользователя с утилитой nft.

    Здесь вы найдете примеры команд, которые сможете протестировать на машине. Они будут полезны для лучшего понимания содержания.

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

    Начнем

    Итак, как будет выглядеть настройка nftables по-умолчанию? Давайте выясним, выведя весь набор правил.

    # nft list ruleset

    В результате мы получим… ничего. Ладно, это не очень интересно. О чем это говорит?

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

    Создание таблиц

    В nftables вам понадобится создавать таблицы вручную. Таблицы должны определять семейство: ip, ip6, inet, arp, bridge или netdev. Здесь inet означает, что таблица будет обрабатывать пакеты ipv4 и ipv6. Именно это семейство мы и будем использовать в статье.

    Примечание: Для тех, кто переходит с iptables, термин таблица может звучать неоднозначно. В nftables таблица – просто пространство имен, ни больше, ни меньше. По сути, она представляет из себя набор цепочек, правил, наборов и иных объектов.

    Давайте создадим нашу первую таблицу и перечислим набор правил.

    # nft add table inet my_table

    # nft list ruleset

    table inet my_table {

    }

    Отлично, теперь у нас есть таблица, но сама по себе она мало что дает. Давайте перейдем к цепочкам.

    Создание цепочек

    Цепочки – объекты, которые будут содержать правила брандмауэра.

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

    # nft add chain inet my_table my_filter_chain { type filter hook input priority 0 \; }

    Примечание: Обратный слэш () нужен, чтобы shell не интерпретировал скобку как конец команды.

    Цепочки также могут быть созданы без указания хука. Созданные таким образом цепочки эквиваленты цепочкам, созданным пользователями в iptables. Правила могут использовать операторы jump или goto для выполнения правил в цепочке. Эта механика полезна для логического разделения правил или для того, чтобы делиться подмножеством правил, которые в противном случае продублировались бы.

    # nft add chain inet my_table my_utility_chain

    Создание правил

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

    # nft add rule inet my_table my_filter_chain tcp dport ssh accept

    Здесь следует отметить, что как только мы добавили его в таблицу семейства inet, это единственное правило будет обрабатывать как пакеты IPv4, так и пакеты IPv6.

    Глагол 
  11. 1   2   3   4


написать администратору сайта