Статья является продолжением первой части, посвящённой организации практической безопасности сетей, построенных на оборудовании MikroTik. До этого уже даны общие рекомендации по настройке оборудования, а также подробно рассмотрены вопросы безопасности L1 и L2 уровней. В текущей части поговорим о настройке протокола Dot1X и работе Firewall. Лирическое отступление представлено в первой части статьи, поэтому не будем терять время и сразу приступим к техническому описанию. Продолжим говорить про организацию безопасности L2 и рассмотрим безопасность L3.

6. Защита L2 (продолжение)


Dot1X отличный протокол, который должен быть обязательно внедрён в корпоративной сети. Если он работает, то нелегитимное устройство при наличии фактического проводного подключения не получит доступ, пока не будет авторизовано в системе. Здесь в бой вступает открытое программное обеспечение Freeradius, позволяющее организовать полноценный RADIUS сервер. Поднимем его на устройстве, находящемся внутри периметра, канал связи лучше использовать шифрованный, повторим один из постулатов первой части статьи. Особых требований к ресурсам сервера не предъявляются, поэтому для тестов можно использовать самый простой VPS:



apt install freeradius freeradius-mysql freeradius-utils
systemctl start freeradius

Проверяем, что все запустилось:

systemctl status freeradius
netstat -aun
udp        0      0 0.0.0.0:1812            0.0.0.0:*
udp        0      0 0.0.0.0:1813            0.0.0.0:*

Настраиваем параметры RADIUS клиента, которым будет являться наше устройство MikroTik (соединение, разумеется, пускаем по шифрованному VPN туннелю, так как протокол RADIUS работает без шифрования):

vi /etc/freeradius/3.0/clients.conf

client MIKROTIK {
ipaddr = 192.168.1.1
secret = testtest
}

vi /etc/freeradius/3.0/dictionary
$INCLUDE /usr/share/freeradius/dictionary.mikrotik
Добавляем пользователей:
vi /etc/freeradius/3.0/users

sun Cleartext-Password := "test2"
Mikrotik-Group = "full"

Проверяем корректность работы RADIUS службы (в файле конфигурации /etc/freeradius/3.0/clients.conf указан пароль по умолчанию для клиента «testing123», при подключении по localhost):

systemctl restart freeradius
radtest sun test2 localhost 0 testing123
radtest sun test2 192.168.1.9 0 testtest
radtest -t mschap test test localhost 0 testing123

Теперь настроим Dot1X клиент на оборудовании MikroTik:

/radius add address=192.168.1.9 secret=testtest service=wireless,dot1x timeout=1s
/interface dot1x server add comment=Test_Dot1X interface=LAN interim-update=30s

Настройки все прозрачны, поэтому на них не останавливаемся. Если всё сделано верно, то траблшутинг не понадобится. Просмотрим лог на наличие ошибок:

tail /var/log/freeradius/radius.log -F

Теперь рассмотрим настройку клиентской части на базе операционной системы Windows. Первым делом запустим необходимую службу Dot3svc:



Далее требуется настроить соответствующий сетевой интерфейс на работу с протоколом Dot1X, как показано на скрине:



Если всё сделано верно, то обмен пакетами начнётся только после того, как устройство пройдёт необходимую процедуру:



Просмотрим пакеты, передающиеся службой RADIUS:

tcpdump -i wlan1 'port 1812 or 1813'
IP 192.168.1.1.44019 >192.168.1.9.radius: RADIUS, Access-Request (1), id: 0xef length: 138
IP 192.168.1.9.radius > 192.168.1.1.44019: RADIUS, Access-Challenge (11), id: 0xef length: 80
IP 192.168.1.1.43602 > 192.168.1.9.radius: RADIUS, Access-Request (1), id: 0xf0 length: 153
IP 192.168.1.9.radius > 192.168.1.1.43602: RADIUS, Access-Challenge (11), id: 0xf0 length: 64
IP 192.168.1.1.54100 > 192.168.1.9.radius: RADIUS, Access-Request (1), id: 0xf1 length: 227
IP 192.168.1.1.54100 > 192.168.1.9.radius: RADIUS, Access-Request (1), id: 0xf1 length: 227

Если прошло корректно, то ваше устройство получит L2 доступ в локальную сеть:



Со стороны MikroTik это выглядит так:



Если нет, то будет примерно такая картина:



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



Для удобного администрирования осталось обзавестись удобным интерфейсом. Для этого существует проект Daloradius, который представляет из себя красивое и удобное web приложение, позволяющее отслеживать работу Freeradius сервера и управлять его пользователями:



Для его установки выполним следующие действия:

apt install mariadb-server mariadb-client
mysql_secure_installation

Настроим базу данных:

mysql -u root -p
CREATE DATABASE radius;
GRANT ALL ON radius.* TO radius@localhost IDENTIFIED BY "verySTRONGpassword!!";
FLUSH PRIVILEGES;

Установим необходимые компоненты для работы web приложения и выполним необходимые настройки:

apt install apache2 php libapache2-mod-php wget unzip php-{gd,common,mail,mail-mime,mysql,pear,mbstring,xml,curl}
pear install DB
mysql -u root -p radius </etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/
vi /etc/freeradius/3.0/mods-enabled/sql

sql {
	driver = "rlm_sql_mysql"
	dialect = "mysql"
	
	# Connection info:
	server = "localhost"
	port = 3306
	login = "radius"
	password = "verySTRONGpassword!!"
	# Database table configuration for everything except Oracle
	radius_db = "radius"
}

# Set to ‘yes’ to read radius clients from the database (‘nas’ table)
# Clients will ONLY be read on server startup.
read_clients = yes
# Table to keep radius client info
client_table = "nas"

chgrp -h freerad /etc/freeradius/3.0/mods-available/sql 
chown -R freerad:freerad /etc/freeradius/3.0/mods-enabled/sql

cd /usr/src/
wget https://github.com/lirantal/daloradius/archive/master.zip
unzip master.zip
mv daloradius-master/ daloradius
cd daloradius

mysql -u root -p radius < contrib/db/fr2-mysql-daloradius-and-freeradius.sql 
mysql -u root -p radius < contrib/db/mysql-daloradius.sql
cd ..
mv daloradius /var/www/html/
chown -R www-data:www-data /var/www/html/daloradius/
mv /var/www/html/daloradius/library/daloradius.conf.php.sample /var/www/html/daloradius/library/daloradius.conf.php
chmod 664 /var/www/html/daloradius/library/daloradius.conf.php
vi /var/www/html/daloradius/library/daloradius.conf.php

$configValues['CONFIG_DB_HOST'] = 'localhost';
$configValues['CONFIG_DB_PORT'] = '3306';
$configValues['CONFIG_DB_USER'] = 'radius';
$configValues['CONFIG_DB_PASS'] = 'verySTRONGpassword!!';
$configValues['CONFIG_DB_NAME'] = 'radius';

systemctl restart freeradius apache2

После этого показанная красивая web морда будет доступна по адресу IP_your_server/daloradius, логин и пароль соответственно administrator и radius. Для безопасности нужно обязательно настроить HTTPS для вашего веб сервера. Ну вот и все, что касается безопасности L2, настало время переходить на новый уровень. Поехали…

7. Защита L3


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





На рисунке приведено, как это выглядит, в том числе глазами MikroTik, когда DHCP сервер ему выдал адрес 192.168.1.2, а в ручном режиме был задан 192.168.1.55:



Для борьбы с этим необходимо выполнить настройки, знакомые из первой части статьи:

/ip dhcp-server set dhcp_home add-arp=yes
/interface bridge set bridge arp=reply-only

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

/ip firewall filter
add action=accept chain=input comment="Accept established,related" connection-state=established,related
add action=drop chain=input comment="Drop invalid" connection-state=invalid
add action=accept chain=forward comment="Accept established,related" connection-state=established,related
add action=drop chain=forward comment="Drop invalid" connection-state=invalid

Таким образом, связанные и уже установленные соединения будут пролетать мимо firewall. Не валидные соединения отправляем в drop. Далее, как и в комментариях пользователя, упомянутого в первой части статьи, закрываем доступ из внешней сети к роутеру и LAN:

add action=drop chain=input comment="Drop all input from !bridge" in-interface=!bridge
add action=drop chain=forward comment="Drop all from WAN to !DSTNAT" connection-nat-state=!dstnat connection-state=new in-interface=WAN

Это база. Остальные правила можно прикручивать под себя. Так, например, можно заблокировать попытки DOS маршрутизатора:

add action=add-src-to-address-list address-list=DDOS address-list-timeout=1h chain=input comment="List DDOS" connection-limit=100,32 connection-state=new in-interface=WAN
add action=drop chain=input comment="Drop DDOS list" src-address-list=DDOS

Существуют сервисы, которые ведут списки IP адресов, замеченных в различных незаконных действиях, такие как, spamhaus.org. Можно подгружать их в роутер и затем блокировать, но нам такой подход не очень нравится:

/system script add name="Spamhaus " source={
/tool fetch url="http://joshaven.com/spamhaus.rsc" mode=http;
:delay 30;	
/ip firewall address-list remove [find where comment="SpamHaus"];
/import file-name=spamhaus.rsc;
}

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

Поговорим теперь, каким способом можно силами firewall блокировать проходящий трафик по ключевым словам. Современный интернет работает по протоколу TLS, а значит это поле TLS SNI hostname, однако современные тенденции таковы, что в условиях международной борьбы за приватность частной жизни, этот способ будет становиться всё менее эффективным:

/ip firewall filter add action=drop chain=forward comment=TEST out-interface=WAN protocol=tcp tls-host=habr.com

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

/ip firewall filter add action=drop chain=forward comment=TEST content=habr disabled=yes out-interface=WAN protocol=tcp

В RouterOS ещё есть такая специфичная штука, как layer7-protocol, которая позволяет искать в первых 10 пакетах ICMP, TCP или UDP соединения (или 2 Кбайт) (потока) нешифрованного трафика совпадения с регулярными выражениями:

/ip firewall filter add action=drop chain=forward comment=TEST disabled=yes layer7-protocol=habr out-interface=WAN protocol=tcp
/ip firewall layer7-protocol add name=habr regexp="*habr"

Ну очень специфическая штука, сильно грузит центральный процессор, но, говорят, может детектировать даже некоторые допотопные малвари: Code Red и Nimda (атаки на Microsoft IIS веб-сервер). В идеале можно с помощью указанных настроек вычленять зловредный трафик и дропать его. Метод не очень, все C2 сервера так не победить.

8. Заключение


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

P/S
Часть 1. Настройка оборудования и вопросы безопасности L1 и L2 уровней
Часть 2. Настройка протокола Dot1X и работа Firewall
Часть 3. Варианты реализации централизованного логирования
Часть 4. Развертывание IDS и ее интеграция в инфраструктуру RouterOS

Комментарии (37)


  1. DurRandir
    13.09.2021 20:58

    0-day от Mēris уже закрыли?)


    1. zikasak
      13.09.2021 21:42
      +3

      а он был? Микротик то заявил, что это все еще уязвимость 2018 года. https://forum.mikrotik.com/viewtopic.php?f=21&t=178417


      1. olegtsss Автор
        13.09.2021 22:39

        Мне кажется, что в этой статье описан вектор, через который он распространился:

        https://habr.com/ru/company/ruvds/blog/559398/


      1. DurRandir
        15.09.2021 21:17

        Слишком свежии версии палятся в отчете Яндекса, чтобы можно было верить этим заявлениям.


        1. olegtsss Автор
          15.09.2021 22:26

          Точных данных, 0-days это или нет, пока нет. Поэтому все только предполагают.


    1. olegtsss Автор
      13.09.2021 22:38

      Пока нет технической информации, что это за уязвимость вообще.


      1. DurRandir
        15.09.2021 21:18

        Поэтому делать что-то надежное на микротике — преждевременно (мое мнение — всегда преждевременно, но вот сейчас — точно).


        1. olegtsss Автор
          15.09.2021 21:23

          Не согласен. Если все настроить качественно, то работать можно смело . CVE и для Cisco появляются. Если не сегодня, то может быть завтра. Здесь нужно держать руку на пульсе. Безопасность - это процесс.


  1. Kirikekeks
    13.09.2021 22:29

    Очень ждал родительский контроль. Все руки не доходят, а детки растут.


    1. olegtsss Автор
      13.09.2021 22:40
      +2

      Firewall filter или соответствующий раздел RouterOS вам в помощь. Могу сделать отдельную статью.


      1. Kirikekeks
        14.09.2021 10:11

        Если у Вас детки есть :-). Польза и для себя. 2 Пк 2Телефона и что бы соцсети работали, вай фай не отключался (препятствие для мобильного интернета), и игры не грузились онлайновые. Если такое возможно. И удалёнка у родителей не отваливалась.


        1. maxwolf
          20.09.2021 14:28

          Пытался делать такое весной прошлого года (правда, не на микротике, а на кинетике), и пришёл к выводу, что для «простого смертного» это — практически неподъемная задача :( Из-за повсеместного использования распределённой архитектуры, CDN, и зачастую предпринимаемых разработчиками мер по борьбе с проблемами связи, как естественными, так и искусственными, трудозатраты на выборочное блокирование (для «черных списков»), или разрешение (для «белых списков») отдельных сервисов в домашнем хозяйстве выходят за разумные пределы. Для того, чтобы разрешить или запретить какой-нибудь условный скайп, нужно определить и внести в список контроля десятки IP адресов. А для какого-нибудь условного телеграма — и этого может оказаться недостаточно. Тут нужен или внешний доверенный источник (БД) сервисов и их IP адресов, данные их которого можно было бы (полу)автоматически преобразовывать в правила фильтрации на раутере, или система типа IDS, которая бы отслеживала весь трафик, и имела команды типа «для такого-то внутреннего хоста заблокировать/добавить в исключения трафик типа такого, который зафиксирован за последние 3 минуты»…


    1. olegtsss Автор
      25.10.2021 19:30
      +1

      1. Kirikekeks
        25.10.2021 22:30
        +1

        Ай спасибо! Сделали счастливее!


  1. AlexGluck
    14.09.2021 02:03

    Я всё недоумеваю, а почему в штыки воспринимается вариант с линуксом типа openwrt?


    1. Harwest
      14.09.2021 05:57

      Почему 'в штыки' ? Отличная операционка

      Просто у openwrt нет производителя, нет техподдержки, тысячи вариантов сборок, множество вариантов/форков версий одних и тех же пакетов.


      1. Antonto
        15.09.2021 18:18

        Плюс - совместимые модели роутеров периодически снимаются с производства. А те, что есть на рынке - разных ревизий, из которых не все поддерживают OpenWrt. Тяжело подобрать подходящий роутер.


    1. olegtsss Автор
      14.09.2021 06:38

      У производителей некоторые функции сделаны аппаратно, что положительно влияет на производительность. Плюс постоянное развитие функционала.


    1. Lopar
      14.09.2021 12:29
      +1

      Тот же Микротик можно тупо купить и включить в розетку.

      А OpenWRT, нужны какие-то железки из таблицы совместимости, которые нужно кастомно перепрошивать, которые теряют лицензию\гарантию при перепрошивке, которые шьётся не чем попало, а определённой сборкой под определённое железо, перечитай горы мануалов (мануал по установке буквально говорит - перед установкой прочтите все страницы документации, форумы и всё же будьте готовы ходить по минному полю) и прочая прочая прочая.

      И это всё чтобы просто получить железку с ОС, которую потом ещё настраивать.

      Если есть возможность пропустить весь этот пласт, почему бы и нет? Даже по деньгам не особо экономнее выходит.


      1. olegtsss Автор
        14.09.2021 13:07

        Лично мне нравится работать с RouterOS. Причин много, в том числе личная предрасположенностью к нему.


        1. olegtsss Автор
          14.09.2021 13:07

          Много что одинаково с настройкой линукса, что имеет причинно-следственные отношения.


      1. wrewolf
        14.09.2021 13:44

        Если купить норм роутер, то прошивка OpenWRT ничем не отличается от обновления прошивки самого роутера. А дальше оно работает сразу после включения, как и до этого. Но возможно у меня искаженное восприятие, т.к. все эти операции для меня рутина как зубы почистить, или масло в машине сменить.


        1. Whyborn77
          14.09.2021 15:12
          +1

          имхо OpenWRT сугубо для домашнего пользования, в проде, даже самом легком - OpenWRT = геморрой


          1. wrewolf
            14.09.2021 15:25

            Речь то шла про включить в розетку, а для прода это де-факто не подходящее решение.


            1. Whyborn77
              14.09.2021 15:30

              с рук микротик можно купить от 300 руб. и на всех них будет одна ОС

              а железо под OpenWRT нужно искать

              из опыта скажу что залитый соседями микротик значительно проще купить и пролить сырой или бинарный бека- конфиг чем железку с OpenWRT


        1. Lopar
          14.09.2021 16:48
          +1

          Да, но опять же, если устройство новое - это потеря гарантии.


          1. wrewolf
            14.09.2021 17:04
            -2

            Хуяндии, если тушка сдохла так, что не работает boot, то и сервис не будет морочиться, а в остальных случаях вкатить родную прошу 5 минут.


            1. olegtsss Автор
              14.09.2021 17:20

              Мое мнение, RouterOS - это круто, гибко, бюджетно. Европейский производитель, более симпатизирую ему чем китайским аналогам.


  1. Whyborn77
    14.09.2021 13:04

    По поводу спамхауса и тп, зачем качать с непонятного сайта ?! На офф форуме есть хорошая тема - Address lists downloader (DShield, Spamhaus DROP/EDROP, etc) ~1240 куч ipv4

    Ниже мой скрипт с ежедневным обновлением спамлистов с оффф сайтов. Этот скрипт штатно работает даже на слабом железе, тестировал на hAP ac lite.

    Не "зайти" и не "выйти" через WAN на адреса в блоклистах реализована через RAW

    /interface list add name=WAN

    /ip firewall raw add action=drop chain=prerouting in-interface-list=WAN src-address-list=
    blacklist add action=drop chain=output dst-address-list=blacklist out-interface-list=
    WAN

    /system scheduler add interval=1d name=blacklists on-event="/system script run blacklists;"
    policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon
    start-date=feb/14/2021 start-time=06:50:00

    /system script
    add dont-require-permissions=no name=blacklists owner=admin policy=
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="i
    p firewall address-list\r
    \n:local update do={\r
    \n:do {\r
    \n:local data ([:tool fetch url=$url output=user as-value]->"data")\r
    \n:local array [find dynamic list=blacklist]\r
    \n:foreach value in=$array do={:set array (array,[get $value address])}
    \r
    \n:while ([:len $data]!=0) do={\r
    \n:if ([:pick $data 0 [:find $data "\n"]]~"^[0-9]{1,3}\\.[0-9]{1,3
    }\\.[0-9]{1,3}\\.[0-9]{1,3}") do={\r
    \n:local ip ([:pick $data 0 [:find $data $delimiter]].$cidr)\r
    \n:do {add list=blacklist address=$ip comment=$description timeout=1d} o
    n-error={\r
    \n:do {set ($array->([:find $array $ip]-[:len $array]/2)) timeout=1d}
    on-error={}\r
    \n}\r
    \n}\r
    \n:set data [:pick $data ([:find $data "\n"]+1) [:len $data]]\r
    \n}\r
    \n} on-error={:log warning "Address list <$description> update failed"}
    \r
    \n}\r
    \n$update url=https://www.dshield.org/block.txt description=DShield delim
    iter=("\t") cidr=/24\r
    \n$update url=https://www.spamhaus.org/drop/drop.txt description="Spamha
    us DROP" delimiter=("\_")\r
    \n$update url=https://www.spamhaus.org/drop/edrop.txt description="Spamh
    aus EDROP" delimiter=("\_")\r
    \n$update url=https://sslbl.abuse.ch/blacklist/sslipblacklist.txt descrip
    tion="Abuse.ch SSLBL" delimiter=("\r")"


    1. olegtsss Автор
      14.09.2021 13:05

      Мне не нравится подход со спам листом. Грубо, не контролируем кто туда попадает, от нулевого дня не защищает и т.д.


      1. Whyborn77
        14.09.2021 13:07

        имхо спамлисты это поверх всего, как основа защищенного периметра


        1. Aelliari
          14.09.2021 17:17
          +2

          Имхо - бессмысленная нагрузка. Нормально закрытый фаерволл + политика белых списков для соединений с устройством со стороны wan. Как формировать белый список - вопрос отдельный. Это может быть port knocking (или даже spa для Linux устройств, что даже лучше), это может быть значение со стороннего ddns сервера, в конце концов это может быть явно задано настройками фаервола (менее предпочтительно).

          Или, в качестве альтернативы, доступ за периметр через ВПН, и уже управление только изнутри периметра.

          Оба подхода не закроют от зеродеев, но нет зависимости от непонятно как модерируемых спамлистов


          1. Whyborn77
            14.09.2021 17:21

            имхо drop на output спамхаус не даст ботнету функционировать на зараженном пк в моей сети, проверено, работает

            таким вот способом отловил два "личных" ноута в гостевой (изолированной) сети

            весь интернет хомякам в белый лист не загнать.


            1. Aelliari
              14.09.2021 17:31

              Белый список на соединения "из вне". А отлавливать ботов уже внутри сети - это другая задача, в конце концов этого бот не только шлюз по умолчанию может атаковать


            1. olegtsss Автор
              14.09.2021 17:51

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


  1. Rim13
    14.09.2021 20:58
    +4

    Тут Docker в RouterOS 7.1 rc3 приехал. Теперь можно засунуть pihole на routeros, но как я понял, поддержка только на arm.


    1. Aelliari
      14.09.2021 21:46
      +1

      ZeroTier, Docker, ой как внезапно стало все интересно