MikroTik және SMS арқылы VPN пайдаланушыларының екі факторлы аутентификациясы

Сәлем әріптестер! Бүгінде қашықтан жұмыс істеуге деген құштарлық аздап басылған кезде, әкімшілердің көпшілігі қызметкерлердің корпоративтік желіге қашықтан қол жеткізу міндетін жеңіп алды, VPN қауіпсіздігін жақсартудағы көпжылдық тәжірибеммен бөлісетін кез келді. Бұл мақалада қазіргі заманғы сәнді IPSec IKEv2 және xAuth қарастырылмайды. Бұл жүйені құру туралы екі факторлы аутентификация (2FA) MikroTik VPN сервері ретінде әрекет еткен кезде VPN пайдаланушылары. Атап айтқанда, PPP сияқты «классикалық» протоколдар пайдаланылғанда.

MikroTik және SMS арқылы VPN пайдаланушыларының екі факторлы аутентификациясы

Бүгін мен сіздің пайдаланушы тіркелгіңіз ұрланған болса да, MikroTik PPP-VPN қалай қорғау керектігін айтамын. Бұл схема менің клиенттерімнің біріне таныстырылған кезде, ол оны қысқаша сипаттады: «Енді бұл банктегідей!»

Әдіс сыртқы аутентификация қызметтерін пайдаланбайды. Тапсырмаларды ішкі маршрутизатордың өзі орындайды. Қосылған клиент үшін ақысыз. Әдіс ДК клиенттері үшін де, мобильді құрылғылар үшін де жұмыс істейді.

Жалпы қорғаныс схемасы келесідей:

  1. VPN серверіне сәтті қосылған пайдаланушының ішкі IP мекенжайы сұр тізімге автоматты түрде қосылады.
  2. Қосылым оқиғасы қол жетімді әдістердің бірін пайдаланып пайдаланушыға жіберілетін бір реттік кодты автоматты түрде жасайды.
  3. Бұл тізімдегі мекенжайлардың бір реттік құпия сөз кодын алуды күтетін «аутентификация» қызметін қоспағанда, жергілікті желі ресурстарына кіру мүмкіндігі шектеулі.
  4. Кодты ұсынғаннан кейін пайдаланушы ішкі желі ресурстарына қол жеткізе алады.

Бірінші Бізге тап болған ең кішкентай мәселе 2FA кодын жіберу үшін пайдаланушы туралы байланыс ақпаратын сақтау болды. Микротикте пайдаланушыларға сәйкес келетін ерікті деректер өрістерін жасау мүмкін болмағандықтан, бар «түсініктеме» өрісі пайдаланылды:

/ppp құпияларын қосу аты=Петров құпия сөзі=4M@ngr! түсініктеме = "89876543210"

Екінші мәселе анағұрлым күрделі болып шықты – кодты жеткізу жолы мен әдісін таңдау. Қазіргі уақытта үш схема жүзеге асырылуда: а) USB модем арқылы SMS б) электрондық пошта б) қызыл ұялы байланыс операторының корпоративтік клиенттері үшін қолжетімді электрондық пошта арқылы SMS.

Иә, SMS схемалары шығындарды талап етеді. Бірақ егер сіз оған қарасаңыз, «қауіпсіздік әрқашан ақшаға байланысты» (c).
Маған электрондық пошта схемасы ұнамайды. Пошта серверінің аутентификацияланатын клиентке қолжетімді болуын талап ететіндіктен емес - трафикті бөлу қиын емес. Алайда, егер клиент браузерде VPN және электрондық пошта үшін құпия сөздерді абайсызда сақтаса, содан кейін ноутбук жоғалса, шабуылдаушы одан корпоративтік желіге толық қол жеткізе алады.

Сонымен, шешім қабылданды - біз SMS хабарламалары арқылы бір реттік кодты жеткіземіз.

Үшінші мәселе қайда және болды MikroTik-те 2FA үшін псевдокездейсоқ кодты қалай жасауға болады. RouterOS сценарий тілінде random() функциясының баламасы жоқ, мен бұған дейін бірнеше күрделі сценарийлі псевдокездейсоқ сандар генераторларын көрдім. Маған олардың екеуі де әртүрлі себептермен ұнамады.

Шын мәнінде, MikroTik-те псевдокездейсоқ реттілік генераторы бар! Ол /certificates scep-server контекстінде үстірт қараудан жасырылған. Бірінші әдіс бір реттік парольді алу оңай және қарапайым - пәрмен арқылы /сертификаттар scep-server otp генерациялайды. Қарапайым айнымалыны тағайындау операциясын орындасақ, кейінірек сценарийлерде пайдалануға болатын массив мәнін аламыз.

Екінші тәсіл бір реттік парольді алу, оны пайдалану оңай - сыртқы қызметті пайдалану random.org жалған кездейсоқ сандар тізбегінің қажетті түрін жасау. Міне, жеңілдетілген конструктор айнымалыға деректерді қабылдау мысалы:

код
:global rnd1 [:pick ([/tool fetch url="https://www.random.org/strings/?num=1&len=7&digits=on&unique=on&format=plain&rnd=new" as-value output=user ]->"da
ta") 1 6] :put $rnd1

Консоль үшін пішімделген сұрау (скрипт мәтінінде арнайы таңбалардан құтылу қажет) $rnd1 айнымалысына алты сандық таңба жолын алады. Келесі «қою» пәрмені айнымалы мәнді MikroTik консолінде көрсетеді.

Төртінші мәселе Аутентификацияның екінші кезеңінде қосылған клиент өзінің бір реттік кодын қалай және қайда жіберетінін тез шешу керек болды.

MikroTik және SMS арқылы VPN пайдаланушыларының екі факторлы аутентификациясы

MikroTik маршрутизаторында кодты қабылдай алатын және оны белгілі бір клиентпен сәйкестендіруге болатын қызмет болуы керек. Берілген код күтілетін кодқа сәйкес келсе, клиенттің мекенжайы компанияның ішкі желісіне кіруге рұқсат етілген мекенжайлары бар белгілі «ақ» тізімге қосылуы керек.

Қызметтердің шектеулі таңдауына байланысты, Mikrotik ішіне орнатылған webproxy арқылы http арқылы кодтарды қабылдау туралы шешім қабылданды. Брандмауэр IP мекенжайларының динамикалық тізімдерімен жұмыс істей алатындықтан, кодты іздейтін, оны клиенттің IP-мен сәйкестендіретін және Layer7 regexp көмегімен «ақ» тізімге қосатын желіаралық қалқан. Маршрутизатордың өзіне шартты DNS атауы «gw.local» тағайындалды және оған PPP клиенттеріне беру үшін статикалық A жазбасы жасалды:

DNS
/ip dns static add name=gw.local address=172.31.1.1

Прокси арқылы расталмаған клиенттерден трафикті түсіру:
/ip firewall nat add chain=dstnat dst-port=80,443 in-interface=2fa protocol=tcp !src-address-list=2fa_approved action=redirect to-ports=3128

Бұл жағдайда проксидің екі функциясы бар.

1. Клиенттермен TCP қосылымдарын ашу;

2. Сәтті авторизацияланған жағдайда, клиент браузерін сәтті аутентификация туралы хабарлайтын бетке немесе суретке қайта бағыттаңыз:

Прокси конфигурациясы
/ip proxy
set enabled=yes port=3128
/ip proxy access
add action=deny disabled=no redirect-to=gw.local./mikrotik_logo.png src-address=0.0.0.0/0

Мен маңызды конфигурация элементтерін тізімдеймін:

  1. «2fa» интерфейс-тізімі – трафик 2FA шеңберінде өңдеуді қажет ететін клиенттік интерфейстердің динамикалық тізімі;
  2. address-list “2fa_jailed” — VPN клиенттерінің туннельдік IP мекенжайларының “сұр” тізімі;
  3. address_list "2fa_approved" - екі факторлы аутентификациядан сәтті өткен VPN клиенттерінің туннельдік IP мекенжайларының ақ тізімі.
  4. «input_2fa» брандмауэр тізбегі - ол TCP пакеттерін авторизациялау кодының бар-жоғын және код жіберушінің IP мекенжайының қажеттіге сәйкестігін тексереді. Тізбектегі ережелер динамикалық түрде қосылады және жойылады.

Пакеттерді өңдеудің оңайлатылған блок-схемасы келесідей көрінеді:

MikroTik және SMS арқылы VPN пайдаланушыларының екі факторлы аутентификациясы

Layer7 сканерлеуіне аутентификацияның екінші кезеңінен әлі өтпеген клиенттерден келетін трафикті «сұр» тізімге қосу үшін стандартты «енгізу» тізбегінде ереже жасалды:

код
/ip firewall filter add chain=input !src-address-list=2fa_approved action=jump jump-target=input_2fa

Енді осы байлықтың барлығын МЖӘ қызметіне қосуды бастайық. MikroTik профильдерде (ppp-профиль) сценарийлерді пайдалануға және оларды ppp қосылымын орнату және бұзу оқиғаларына тағайындауға мүмкіндік береді. ppp-профиль параметрлерін жалпы PPP серверіне де, жеке пайдаланушыларға да қолдануға болады. Бұл жағдайда пайдаланушыға тағайындалған профиль өзінің көрсетілген параметрлерімен тұтастай сервер үшін таңдалған профильдің параметрлерін басатын басымдыққа ие болады.

Осы тәсілдің нәтижесінде біз екі факторлы аутентификация үшін арнайы профиль жасай аламыз және оны барлық пайдаланушыларға емес, тек біз қажет деп санайтындарға тағайындай аламыз. Бұл PPP қызметтерін соңғы пайдаланушыларды қосу үшін ғана емес, сонымен қатар сайттар арасындағы байланыстарды құру үшін пайдалансаңыз маңызды болуы мүмкін.

Жаңадан жасалған арнайы профильде біз мекенжайлар мен интерфейстердің «сұр» тізімдеріне қосылған пайдаланушының мекенжайы мен интерфейсін динамикалық қосуды қолданамыз:

winbox
MikroTik және SMS арқылы VPN пайдаланушыларының екі факторлы аутентификациясы

код
/ppp profile add address-list=2fa_jailed change-tcp-mss=no local-address=192.0.2.254 name=2FA interface-list=2fa only-one=yes remote-address=dhcp_pool1 use-compression=no use-encryption= required use-mpls=no use-upnp=no dns-server=172.31.1.1

Dstnat (алдын ала бағыттау) тізбегінде қайталама авторизациядан өтпеген VPN клиенттерінен трафикті анықтау және түсіру үшін «мекен-жай тізімі» және «интерфейс-тізім» тізімдерін бірге пайдалану қажет.

Дайындық аяқталғанда, қосымша желіаралық қалқан тізбектері мен профиль жасалғанда, біз 2FA кодын және жеке желіаралық қалқан ережелерін автоматты түрде жасауға жауапты сценарий жазамыз.

Құжаттама wiki.mikrotik.com PPP-профильінде PPP клиентінің қосылуы және ажырату оқиғаларымен байланысты айнымалылар туралы ақпаратпен байытады. «Пайдаланушының кіру оқиғасында сценарийді орындаңыз. Бұл оқиға сценарийі үшін қолжетімді айнымалылар: пайдаланушы, жергілікті мекенжай, қашықтағы мекенжай, қоңырау шалушы идентификаторы, шақырылған идентификатор, интерфейс». Олардың кейбіреулері бізге өте пайдалы болады.

PPP қосылу оқиғасы үшін профильде пайдаланылатын код

#Логируем для отладки полученные переменные 
:log info (

quot;local-address")
:log info (


quot;remote-address")
:log info (


quot;caller-id")
:log info (


quot;called-id")
:log info ([/int pptp-server get (


quot;interface") name])
#Объявляем свои локальные переменные
:local listname "2fa_jailed"
:local viamodem false
:local modemport "usb2"
#ищем автоматически созданную запись в адрес-листе "2fa_jailed"
:local recnum1 [/ip fi address-list find address=(


quot;remote-address") list=$listname]

#получаем псевдослучайный код через random.org
#:local rnd1 [:pick ([/tool fetch url="https://www.random.org/strings/?num=1&len=7&digits=on&unique=on&format=plain&rnd=new" as-value output=user]->"data") 0 4] #либо получаем псевдослучайный код через локальный генератор
#:local rnd1 [pick ([/cert scep-server otp generate as-value minutes-valid=1]->"password") 0 4 ]

#Ищем и обновляем коммент к записи в адрес-листе. Вносим искомый код для отладки
/ip fir address-list set $recnum1 comment=$rnd1
#получаем номер телефона куда слать SMS
:local vphone [/ppp secret get [find name=$user] comment]

#Готовим тело сообщения. Если клиент подключается к VPN прямо с телефона ему достаточно
#будет перейти прямо по ссылке из полученного сообщения
:local msgboby ("Your code: ".$comm1."n Or open link http://gw.local/otp/".$comm1."/")

# Отправляем SMS по выбранному каналу - USB-модем или email-to-sms
if $viamodem do={
/tool sms send phone-number=$vphone message=$msgboby port=$modemport }
else={
/tool e-mail send server=a.b.c.d [email protected] [email protected] subject="@".$vphone body=$msgboby }

#Генерируем Layer7 regexp
local vregexp ("otp\/".$comm1)
:local vcomment ("2fa_".(


quot;remote-address"))
/ip firewall layer7-protocol add name=(


quot;vcomment") comment=(


quot;remote-address") regexp=(


quot;vregexp")

#Генерируем правило проверяющее по Layer7 трафик клиента в поисках нужного кода
#и небольшой защитой от брутфорса кодов с помощью dst-limit
/ip firewall filter add action=add-src-to-address-list address-list=2fa_approved address-list-timeout=none-dynamic chain=input_2fa dst-port=80,443,3128 layer7-protocol=(


quot;vcomment") protocol=tcp src-address=(


quot;remote-address") dst-limit=1,1,src-address/1m40s

Көшіру-қоюды ұнатпайтындар үшін әсіресе ескертемін - код сынақ нұсқасынан алынған және шағын қателер болуы мүмкін. Түсінетін адамға нақты қай жерде екенін анықтау қиын болмайды.

Пайдаланушы ажыратқанда, «On-Down» оқиғасы жасалады және параметрлері бар сәйкес сценарий шақырылады. Бұл сценарийдің мақсаты - ажыратылған пайдаланушы үшін жасалған брандмауэр ережелерін тазалау.

PPP қосу-төмен қосылым оқиғасы үшін профильде пайдаланылатын код

:local vcomment ("2fa_".(

quot;remote-address"))
/ip firewall address-list remove [find address=(


quot;remote-address") list=2fa_approved] /ip firewall filter remove [find chain="input_2fa" src-address=(


quot;remote-address") ] /ip firewall layer7-protocol remove [find name=$vcomment]
Содан кейін пайдаланушыларды жасауға және олардың кейбірін немесе барлығын екі факторлы аутентификация профиліне тағайындауға болады.

winbox
MikroTik және SMS арқылы VPN пайдаланушыларының екі факторлы аутентификациясы

код
/ppp secrets set [find name=Petrov] profile=2FA

Клиент жағынан ол қалай көрінеді.

VPN қосылымын орнатқан кезде SIM картасы бар Android/iOS телефонына/планшетіне шамамен келесідей SMS жіберіледі:

қысқаша хабар қызметі
MikroTik және SMS арқылы VPN пайдаланушыларының екі факторлы аутентификациясы

Егер байланыс телефоннан/планшеттен тікелей орнатылса, хабарламадағы сілтемені басу арқылы 2FA арқылы өтуге болады. Бұл ыңғайлы.

Егер VPN қосылымы компьютерден орнатылса, пайдаланушыдан құпия сөздің минималды түрін енгізу қажет болады. HTML файлы түріндегі шағын пішін VPN орнату кезінде пайдаланушыға жіберіледі. Файлды тіпті пошта арқылы жіберуге болады, осылайша пайдаланушы оны сақтай алады және ыңғайлы жерде таңбаша жасай алады. Бұл шамамен келесідей көрінеді:

Үстелдегі белгі
MikroTik және SMS арқылы VPN пайдаланушыларының екі факторлы аутентификациясы

Пайдаланушы төте жолды басады, қарапайым кодты енгізу пішіні ашылады, ол кодты ашылған URL мекенжайына енгізеді:

Пішін экраны
MikroTik және SMS арқылы VPN пайдаланушыларының екі факторлы аутентификациясы

Пішін мысал ретінде берілген ең қарапайым болып табылады. Қалаушылар оны өздеріне қарай өзгерте алады.

2fa_login_mini.html

<html>
<head> <title>SMS OTP login</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head>
<body>
<form name="login" action="location.href='http://gw.local/otp/'+document.getElementById(‘text').value"  method="post"
 <input id="text" type="text"/> 
<input type="button" value="Login" onclick="location.href='http://gw.local/otp/'+document.getElementById('text').value"/> 
</form>
</body>
</html>

Авторизация сәтті болса, пайдаланушы браузерде MikroTik логотипін көреді, ол сәтті аутентификация сигналы ретінде қызмет етуі керек:

MikroTik және SMS арқылы VPN пайдаланушыларының екі факторлы аутентификациясы

Кескін WebProxy Deny Redirect арқылы кірістірілген MikroTik веб-серверінен қайтарылатынын ескеріңіз.

Кескінді «hospot» құралы арқылы теңшеуге болады, сонда өз нұсқаңызды жүктеп алып, оған WebProxy көмегімен қайта бағыттауды болдырмау URL мекенжайын орнатуға болады.

Ең арзан «ойыншық» Микротикті 20 долларға сатып алып, оны 500 долларлық маршрутизатормен ауыстырғысы келетіндерге үлкен өтініш - мұны жасамаңыз. "hAP Lite"/"hAP mini" (үйдегі кіру нүктесі) сияқты құрылғыларда өте әлсіз CPU (smips) бар және бизнес сегментіндегі жүктемені көтере алмайды.

Назар аударыңыз! Бұл шешімнің бір кемшілігі бар: клиенттер қосылғанда немесе ажыратқанда конфигурация өзгерістері орын алады, оны маршрутизатор өзінің тұрақты жадында сақтауға тырысады. Клиенттердің көп санымен және жиі қосылымдар мен ажыратулармен бұл маршрутизатордағы ішкі жадтың нашарлауына әкелуі мүмкін.

PS: клиентке кодты жеткізу әдістері сіздің бағдарламалау мүмкіндіктеріңізге қатысты кеңейтілуі және толықтырылуы мүмкін. Мысалы, сіз телеграмда хабарламалар жібере аласыз немесе... опцияларды ұсына аласыз!

Бұл мақала сізге пайдалы болады және шағын және орта бизнес желілерін біршама қауіпсіз етуге көмектеседі деп үміттенемін.

Ақпарат көзі: www.habr.com