![](https://habrastorage.org/getpro/habr/post_images/117/dd4/b8a/117dd4b8aa045b5411c6fa4e2d5144c9.png)
Статья является продолжением первой части, посвящённой организации практической безопасности сетей, построенных на оборудовании MikroTik. До этого уже даны общие рекомендации по настройке оборудования, а также подробно рассмотрены вопросы безопасности L1 и L2 уровней. В текущей части поговорим о настройке протокола Dot1X и работе Firewall. Лирическое отступление представлено в первой части статьи, поэтому не будем терять время и сразу приступим к техническому описанию. Продолжим говорить про организацию безопасности L2 и рассмотрим безопасность L3.
6. Защита L2 (продолжение)
Dot1X отличный протокол, который должен быть обязательно внедрён в корпоративной сети. Если он работает, то нелегитимное устройство при наличии фактического проводного подключения не получит доступ, пока не будет авторизовано в системе. Здесь в бой вступает открытое программное обеспечение Freeradius, позволяющее организовать полноценный RADIUS сервер. Поднимем его на устройстве, находящемся внутри периметра, канал связи лучше использовать шифрованный, повторим один из постулатов первой части статьи. Особых требований к ресурсам сервера не предъявляются, поэтому для тестов можно использовать самый простой VPS:
![](https://habrastorage.org/webt/_c/_f/mk/_c_fmkbrfshx-hnzxdwkgiw5wxm.jpeg)
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:
![](https://habrastorage.org/webt/_m/kn/oh/_mknohesw312cn-ekoty1h4pku0.jpeg)
Далее требуется настроить соответствующий сетевой интерфейс на работу с протоколом Dot1X, как показано на скрине:
![](https://habrastorage.org/webt/wp/vr/a5/wpvra5tr6dewxpaevuvhdxv9nqe.jpeg)
Если всё сделано верно, то обмен пакетами начнётся только после того, как устройство пройдёт необходимую процедуру:
![](https://habrastorage.org/webt/l0/q8/jf/l0q8jfi2i132x0-i602cwrcaiqw.jpeg)
Просмотрим пакеты, передающиеся службой 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 доступ в локальную сеть:
![](https://habrastorage.org/webt/u6/ax/5d/u6ax5dspdzuuru62r5yzqrqovbm.jpeg)
Со стороны MikroTik это выглядит так:
![](https://habrastorage.org/webt/nk/pe/dy/nkpedy5pnf481kouzvcf_zzaye0.jpeg)
Если нет, то будет примерно такая картина:
![](https://habrastorage.org/webt/eb/h3/xa/ebh3xa-nubg1wuttsomhkiqrqbe.jpeg)
Кроме этого, как было сказано в первой части статьи, RADIUS сервер можно использовать для работы беспроводной сети по протоколу WPA2-Enterprise. В таком случае, при успешном подключении пользователей в логах можно увидеть сообщения:
![](https://habrastorage.org/webt/0k/d3/ye/0kd3ye0p7szhjkc1rgevudafqmy.jpeg)
Для удобного администрирования осталось обзавестись удобным интерфейсом. Для этого существует проект Daloradius, который представляет из себя красивое и удобное web приложение, позволяющее отслеживать работу Freeradius сервера и управлять его пользователями:
![](https://habrastorage.org/webt/af/ex/pz/afexpzbxomvdj851xm5mxucyhm4.jpeg)
Для его установки выполним следующие действия:
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 доступ в сеть, во-вторых, вмешаться в её нормальное функционирование.
![](https://habrastorage.org/webt/2r/az/vw/2razvwh7zukynpi6ebtu4nxl24k.jpeg)
![](https://habrastorage.org/webt/g2/jy/xd/g2jyxd7-rrdni_opiz3zqh7bxi8.jpeg)
На рисунке приведено, как это выглядит, в том числе глазами MikroTik, когда DHCP сервер ему выдал адрес 192.168.1.2, а в ручном режиме был задан 192.168.1.55:
![](https://habrastorage.org/webt/ae/y8/v_/aey8v_ph3ep2s7avxde_bv6t_yo.jpeg)
Для борьбы с этим необходимо выполнить настройки, знакомые из первой части статьи:
/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
![](https://habrastorage.org/webt/ou/g5/kh/oug5kh6sjydt9llengsiebnp40w.png)
Комментарии (37)
Kirikekeks
13.09.2021 22:29Очень ждал родительский контроль. Все руки не доходят, а детки растут.
olegtsss Автор
13.09.2021 22:40+2Firewall filter или соответствующий раздел RouterOS вам в помощь. Могу сделать отдельную статью.
Kirikekeks
14.09.2021 10:11Если у Вас детки есть :-). Польза и для себя. 2 Пк 2Телефона и что бы соцсети работали, вай фай не отключался (препятствие для мобильного интернета), и игры не грузились онлайновые. Если такое возможно. И удалёнка у родителей не отваливалась.
maxwolf
20.09.2021 14:28Пытался делать такое весной прошлого года (правда, не на микротике, а на кинетике), и пришёл к выводу, что для «простого смертного» это — практически неподъемная задача :( Из-за повсеместного использования распределённой архитектуры, CDN, и зачастую предпринимаемых разработчиками мер по борьбе с проблемами связи, как естественными, так и искусственными, трудозатраты на выборочное блокирование (для «черных списков»), или разрешение (для «белых списков») отдельных сервисов в домашнем хозяйстве выходят за разумные пределы. Для того, чтобы разрешить или запретить какой-нибудь условный скайп, нужно определить и внести в список контроля десятки IP адресов. А для какого-нибудь условного телеграма — и этого может оказаться недостаточно. Тут нужен или внешний доверенный источник (БД) сервисов и их IP адресов, данные их которого можно было бы (полу)автоматически преобразовывать в правила фильтрации на раутере, или система типа IDS, которая бы отслеживала весь трафик, и имела команды типа «для такого-то внутреннего хоста заблокировать/добавить в исключения трафик типа такого, который зафиксирован за последние 3 минуты»…
AlexGluck
14.09.2021 02:03Я всё недоумеваю, а почему в штыки воспринимается вариант с линуксом типа openwrt?
Harwest
14.09.2021 05:57Почему 'в штыки' ? Отличная операционка
Просто у openwrt нет производителя, нет техподдержки, тысячи вариантов сборок, множество вариантов/форков версий одних и тех же пакетов.
Antonto
15.09.2021 18:18Плюс - совместимые модели роутеров периодически снимаются с производства. А те, что есть на рынке - разных ревизий, из которых не все поддерживают OpenWrt. Тяжело подобрать подходящий роутер.
olegtsss Автор
14.09.2021 06:38У производителей некоторые функции сделаны аппаратно, что положительно влияет на производительность. Плюс постоянное развитие функционала.
Lopar
14.09.2021 12:29+1Тот же Микротик можно тупо купить и включить в розетку.
А OpenWRT, нужны какие-то железки из таблицы совместимости, которые нужно кастомно перепрошивать, которые теряют лицензию\гарантию при перепрошивке, которые шьётся не чем попало, а определённой сборкой под определённое железо, перечитай горы мануалов (мануал по установке буквально говорит - перед установкой прочтите все страницы документации, форумы и всё же будьте готовы ходить по минному полю) и прочая прочая прочая.
И это всё чтобы просто получить железку с ОС, которую потом ещё настраивать.
Если есть возможность пропустить весь этот пласт, почему бы и нет? Даже по деньгам не особо экономнее выходит.
wrewolf
14.09.2021 13:44Если купить норм роутер, то прошивка OpenWRT ничем не отличается от обновления прошивки самого роутера. А дальше оно работает сразу после включения, как и до этого. Но возможно у меня искаженное восприятие, т.к. все эти операции для меня рутина как зубы почистить, или масло в машине сменить.
Whyborn77
14.09.2021 15:12+1имхо OpenWRT сугубо для домашнего пользования, в проде, даже самом легком - OpenWRT = геморрой
wrewolf
14.09.2021 15:25Речь то шла про включить в розетку, а для прода это де-факто не подходящее решение.
Whyborn77
14.09.2021 15:30с рук микротик можно купить от 300 руб. и на всех них будет одна ОС
а железо под OpenWRT нужно искать
из опыта скажу что залитый соседями микротик значительно проще купить и пролить сырой или бинарный бека- конфиг чем железку с OpenWRT
Lopar
14.09.2021 16:48+1Да, но опять же, если устройство новое - это потеря гарантии.
wrewolf
14.09.2021 17:04-2Хуяндии, если тушка сдохла так, что не работает boot, то и сервис не будет морочиться, а в остальных случаях вкатить родную прошу 5 минут.
olegtsss Автор
14.09.2021 17:20Мое мнение, RouterOS - это круто, гибко, бюджетно. Европейский производитель, более симпатизирую ему чем китайским аналогам.
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")"olegtsss Автор
14.09.2021 13:05Мне не нравится подход со спам листом. Грубо, не контролируем кто туда попадает, от нулевого дня не защищает и т.д.
Whyborn77
14.09.2021 13:07имхо спамлисты это поверх всего, как основа защищенного периметра
Aelliari
14.09.2021 17:17+2Имхо - бессмысленная нагрузка. Нормально закрытый фаерволл + политика белых списков для соединений с устройством со стороны wan. Как формировать белый список - вопрос отдельный. Это может быть port knocking (или даже spa для Linux устройств, что даже лучше), это может быть значение со стороннего ddns сервера, в конце концов это может быть явно задано настройками фаервола (менее предпочтительно).
Или, в качестве альтернативы, доступ за периметр через ВПН, и уже управление только изнутри периметра.
Оба подхода не закроют от зеродеев, но нет зависимости от непонятно как модерируемых спамлистов
Whyborn77
14.09.2021 17:21имхо drop на output спамхаус не даст ботнету функционировать на зараженном пк в моей сети, проверено, работает
таким вот способом отловил два "личных" ноута в гостевой (изолированной) сети
весь интернет хомякам в белый лист не загнать.
Aelliari
14.09.2021 17:31Белый список на соединения "из вне". А отлавливать ботов уже внутри сети - это другая задача, в конце концов этого бот не только шлюз по умолчанию может атаковать
olegtsss Автор
14.09.2021 17:51Я согласен, ваш способ позволяет прикрывать сеть от угроз. Мера рабочая . В статьях много о чем рассказывается, каждый выбирает собственную конфигурацию, адаптирует ее и поддерживает.
DurRandir
0-day от Mēris уже закрыли?)
zikasak
а он был? Микротик то заявил, что это все еще уязвимость 2018 года. https://forum.mikrotik.com/viewtopic.php?f=21&t=178417
olegtsss Автор
Мне кажется, что в этой статье описан вектор, через который он распространился:
https://habr.com/ru/company/ruvds/blog/559398/
DurRandir
Слишком свежии версии палятся в отчете Яндекса, чтобы можно было верить этим заявлениям.
olegtsss Автор
Точных данных, 0-days это или нет, пока нет. Поэтому все только предполагают.
olegtsss Автор
Пока нет технической информации, что это за уязвимость вообще.
DurRandir
Поэтому делать что-то надежное на микротике — преждевременно (мое мнение — всегда преждевременно, но вот сейчас — точно).
olegtsss Автор
Не согласен. Если все настроить качественно, то работать можно смело . CVE и для Cisco появляются. Если не сегодня, то может быть завтра. Здесь нужно держать руку на пульсе. Безопасность - это процесс.