Twee-faktor-verifikasie van VPN-gebruikers via MikroTik en SMS

Hallo kollegas! Vandag, toe die intensiteit van passies rondom “afgeleë werk” effens bedaar het, het die meerderheid admins die taak van afstandtoegang van werknemers tot die korporatiewe netwerk gewen, is dit tyd om my jarelange ervaring in die verbetering van VPN-sekuriteit te deel. Hierdie artikel sal nie nou modieus wees nie IPSec IKEv2 en xAuth. Dit gaan oor die bou van 'n stelsel. twee-faktor-verifikasie (2FA) VPN-gebruikers wanneer MikroTik as 'n VPN-bediener optree. Naamlik wanneer "klassieke" protokolle soos PPP gebruik word.

Twee-faktor-verifikasie van VPN-gebruikers via MikroTik en SMS

Vandag sal ek jou vertel hoe om MikroTik PPP-VPN te beskerm, selfs al is die gebruikersrekening "gekaap". Toe hierdie skema aan een van my kliënte bekend gestel is, het hy dit kortliks beskryf as "wel, nou is dit net soos in 'n bank!".

Die metode gebruik nie eksterne verifikasiedienste nie. Die take word intern deur die router self uitgevoer. Geen koste vir die koppelkliënt nie. Die metode werk vir beide rekenaarkliënte en mobiele toestelle.

Die algemene beskermingskema is soos volg:

  1. Die interne IP-adres van 'n gebruiker wat suksesvol aan die VPN-bediener gekoppel het, word outomaties op 'n gryslys geplaas.
  2. Die verbindingsgebeurtenis genereer outomaties 'n eenmalige kode wat met een van die beskikbare metodes aan die gebruiker gestuur word.
  3. Adresse in hierdie lys het beperkte toegang tot plaaslike netwerkhulpbronne, met die uitsondering van die "authenticator"-diens, wat wag om 'n eenmalige wagwoord te ontvang.
  4. Nadat die kode aangebied is, het die gebruiker toegang tot die interne hulpbronne van die netwerk.

Eerste die kleinste probleem waarmee ek te kampe gehad het, was om kontakinligting oor die gebruiker te stoor om vir hom die 2FA-kode te stuur. Aangesien dit onmoontlik is om arbitrêre datavelde te skep wat ooreenstem met gebruikers in Mikrotik, is die bestaande "kommentaar"-veld gebruik:

/ppp-geheime voeg naam by=Petrov-wagwoord=4M@ngr! kommentaar="89876543210"

Die tweede die probleem blyk ernstiger te wees - die keuse van die pad en metode om die kode te lewer. Drie skemas word tans geïmplementeer: a) SMS via USB-modem b) e-pos c) SMS via e-pos beskikbaar vir korporatiewe kliënte van die rooi sellulêre operateur.

Ja, SMS-skemas bring koste mee. Maar as jy kyk, "veiligheid gaan altyd oor geld" (c).
Ek persoonlik hou nie van die skema met e-pos nie. Nie omdat dit vereis dat die posbediener beskikbaar moet wees vir die kliënt wat geverifieer word nie - dit is nie 'n probleem om die verkeer te verdeel nie. As 'n kliënt egter sorgeloos beide vpn- en e-poswagwoorde in 'n blaaier gestoor het en dan hul skootrekenaar verloor het, sou die aanvaller daaruit volle toegang tot die korporatiewe netwerk verkry.

So, daar is besluit - ons lewer 'n eenmalige kode deur middel van SMS-boodskappe.

Третья Die probleem was waar hoe om 'n pseudo-ewekansige kode vir 2FA in MikroTik te genereer. Daar is geen ekwivalent aan die ewekansige () funksie in die RouterOS script taal, en ek het verskeie kruk script pseudo-ewekansige getal generators voorheen gesien. Ek het om verskeie redes nie van een van hulle gehou nie.

Trouens, daar is 'n pseudo-ewekansige volgordegenerator in MikroTik! Dit is weggesteek vir 'n oppervlakkige blik in die konteks van /certificates scep-server. Die eerste manier om 'n eenmalige wagwoord te kry is maklik en eenvoudig - met die opdrag /sertifikate scep-bediener otp genereer. As ons 'n eenvoudige veranderlike toewysingsbewerking uitvoer, sal ons 'n skikkingswaarde kry wat later in skrifte gebruik kan word.

Die tweede manier die verkryging van 'n eenmalige wagwoord wat ook maklik is om toe te pas - deur 'n eksterne diens te gebruik random.org om die verlangde soort volgorde van pseudo-ewekansige getalle te genereer. Hier is 'n vereenvoudigde vrykragtig voorbeeld om data in 'n veranderlike te kry:

Kode
: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

'n Versoek wat vir die konsole geformateer is (ontsnapende spesiale karakters sal in die skrifliggaam vereis word) ontvang 'n string van ses syfers in die $rnd1-veranderlike. Die volgende "sit"-opdrag vertoon eenvoudig die veranderlike in die MikroTik-konsole.

Die vierde probleem wat vinnig opgelos moes word - dit is hoe en waar die gekoppelde kliënt sy eenmalige kode by die tweede stadium van verifikasie sal oordra.

Twee-faktor-verifikasie van VPN-gebruikers via MikroTik en SMS

Daar moet 'n diens op die MikroTik-roeteerder wees wat die kode kan aanvaar en dit by 'n spesifieke kliënt kan pas. As die verskafde kode ooreenstem met die verwagte een, moet die kliënt se adres in 'n sekere "wit" lys ingesluit word, adresse waarvandaan toegang tot die maatskappy se interne netwerk toegelaat word.

Weens die swak keuse van dienste is daar besluit om kodes via http te aanvaar deur die webproxy wat in Mikrotik ingebou is. En aangesien die firewall met dinamiese lyste van IP-adresse kan werk, is dit die firewall wat die soektog na die kode uitvoer, dit met die kliënt-IP pas en dit by die "wit" lys voeg deur Layer7 regexp te gebruik. Die router self is 'n voorwaardelike DNS-naam "gw.local" toegeken, 'n statiese A-rekord is daarop geskep vir uitreiking aan PPP-kliënte:

DNS
/ip dns statiese voeg naam=gw.local adres=172.31.1.1 by

Vang verkeer van ongeverifieerde kliënte op die instaanbediener:
/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

In hierdie geval het die proxy twee funksies.

1. Maak tcp-verbindings met kliënte oop;

2. In die geval van suksesvolle magtiging, herlei die kliëntblaaier na 'n bladsy of prent wat in kennis stel van suksesvolle stawing:

Proxy konfig
/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

Ek sal die belangrike konfigurasie-elemente lys:

  1. koppelvlak-lys "2fa" - 'n dinamiese lys van kliënt koppelvlakke, verkeer van wat vereis verwerking binne 2FA;
  2. adreslys "2fa_jailed" - "grys" lys van tonnel IP-adresse van VPN-kliënte;
  3. address_list "2fa_approved" - "wit" lys van tonnel IP-adresse van VPN-kliënte wat twee-faktor-verifikasie suksesvol geslaag het.
  4. firewall-ketting "input_2fa" - dit kontroleer tcp-pakkies vir die teenwoordigheid van 'n magtigingskode en pas die IP-adres van die kodesender met die vereiste een. Reëls in die ketting word dinamies bygevoeg en verwyder.

'n Vereenvoudigde vloeidiagram van pakkieverwerking lyk soos volg:

Twee-faktor-verifikasie van VPN-gebruikers via MikroTik en SMS

Om in die Layer7-tjek van verkeer van kliënte van die "grys" lys te kom wat nog nie die tweede stadium van stawing geslaag het nie, is 'n reël in die standaard "invoer"-ketting geskep:

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

Kom ons begin nou om al hierdie rykdom aan die PPP-diens vas te maak. MikroTik laat jou toe om skrifte in profiele (ppp-profiel) te gebruik en dit toe te wys aan die gebeure van die vestiging en verbreek van 'n ppp-verbinding. Die ppp-profielinstellings kan op die PPP-bediener as geheel of op individuele gebruikers toegepas word. Terselfdertyd het die profiel wat aan die gebruiker toegewys is, prioriteit, wat die parameters van die profiel wat vir die bediener as geheel gekies is met sy gespesifiseerde parameters ignoreer.

As gevolg van hierdie benadering kan ons 'n spesiale profiel vir twee-faktor-verifikasie skep en dit nie aan alle gebruikers toewys nie, maar slegs aan diegene wat dit nodig ag om dit te doen. Dit kan relevant wees as jy PPP-dienste gebruik om nie net eindgebruikers te verbind nie, maar terselfdertyd om werf-tot-werf-verbindings te bou.

In die nuutgeskepte spesiale profiel gebruik ons ​​die dinamiese toevoeging van die adres en koppelvlak van die gekoppelde gebruiker tot die "grys" lyste van adresse en koppelvlakke:

wenboks
Twee-faktor-verifikasie van VPN-gebruikers via MikroTik en SMS

Kode
/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

Dit is nodig om beide "adres-lys" en "koppelvlak-lys" lyste te gebruik om verkeer van nie-sekondêre VPN-kliënte in die dstnat-ketting (voor-roetering) op te spoor en vas te vang.

Wanneer die voorbereiding voltooi is, bykomende brandmuurkettings en 'n profiel geskep word, sal ons 'n skrif skryf wat verantwoordelik is vir die outo-generering van die 2FA-kode en individuele firewall-reëls.

Dokumentasie wiki.mikrotik.com op PPP-Profile verryk ons ​​met inligting oor veranderlikes wat verband hou met PPP-kliënt-verbinding-ontkoppel-gebeure "Voer skrip uit op gebruikeraanmeldinggebeurtenis. Dit is beskikbare veranderlikes wat toeganklik is vir die gebeurtenisskrip: gebruiker, plaaslike adres, afstandadres, oproeper-ID, genoem-ID, koppelvlak". Sommige van hulle is baie nuttig vir ons.

Kode wat in profiel gebruik word vir PPP aan-op verbinding gebeurtenis

#Логируем для отладки полученные переменные 
: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

Ek waarsku jou, veral vir diegene wat daarvan hou om onbedagsaam te kopieer-plak, die kode is uit die toetsweergawe geneem en kan geringe tikfoute bevat. Dit sal nie moeilik wees vir 'n begripvolle persoon om presies uit te vind waar nie.

Wanneer 'n gebruiker ontkoppel, word 'n "On-Down" gebeurtenis gegenereer en die ooreenstemmende skrif met parameters word opgeroep. Die doel van hierdie skrif is om die firewall-reëls wat vir die ontkoppelde gebruiker geskep is skoon te maak.

Kode gebruik in profiel vir PPP on-down verbinding gebeurtenis

: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]
U kan dan gebruikers skep en almal of sommige van hulle aan 'n twee-faktor-verifikasieprofiel toewys.

wenboks
Twee-faktor-verifikasie van VPN-gebruikers via MikroTik en SMS

Kode
/ppp secrets set [find name=Petrov] profile=2FA

Hoe dit aan die kliëntkant lyk.

Wanneer 'n VPN-verbinding tot stand gebring word, ontvang 'n Android/iOS-foon/tablet met 'n SIM-kaart 'n SMS soos hierdie:

SMS
Twee-faktor-verifikasie van VPN-gebruikers via MikroTik en SMS

As die verbinding direk vanaf die telefoon / tablet tot stand gebring word, kan u deur 2FA gaan deur eenvoudig op die skakel van die boodskap te klik. Dis gemaklik.

As die VPN-verbinding vanaf 'n rekenaar tot stand gebring word, sal daar van die gebruiker verwag word om 'n minimale wagwoordvorm in te voer. 'n Klein vorm in die vorm van 'n HTML-lêer word aan die gebruiker gegee wanneer die VPN opgestel word. Die lêer kan selfs per pos gestuur word sodat die gebruiker dit stoor en 'n kortpad op 'n gerieflike plek skep. Dit lyk so:

Etiket op die tafel
Twee-faktor-verifikasie van VPN-gebruikers via MikroTik en SMS

Die gebruiker klik op die kortpad, 'n eenvoudige kode-inskrywingsvorm maak oop, wat die kode in die oopgemaakte URL sal plak:

Skermvorm
Twee-faktor-verifikasie van VPN-gebruikers via MikroTik en SMS

Die mees primitiewe vorm word as voorbeeld gegee. Diegene wat wil kan vir hulself wysig.

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>

As die magtiging suksesvol was, sal die gebruiker die MikroTik-logo in die blaaier sien, wat suksesvolle verifikasie moet aandui:

Twee-faktor-verifikasie van VPN-gebruikers via MikroTik en SMS

Let daarop dat die prent teruggestuur word vanaf die ingeboude MikroTik-webbediener met WebProxy Deny Redirect.

Ek veronderstel dat die prent aangepas kan word deur die "hotspot"-nutsding te gebruik, jou eie weergawe daarheen op te laai en die Deny Redirect URL daarheen te stel met WebProxy.

'n Groot versoek aan diegene wat probeer om die goedkoopste "speelding" Mikrotik vir $20 te koop en 'n $500 router daarmee te vervang - moenie dit doen nie. Toestelle soos "hAP Lite" / "hAP mini" (tuistoegangspunt) het 'n baie swak SVE (smips), en dit is waarskynlik dat hulle nie die las in die besigheidsegment sal hanteer nie.

Waarskuwing! Hierdie oplossing het een nadeel: wanneer kliënte koppel of ontkoppel, vind konfigurasieveranderinge plaas, wat die roeteerder probeer stoor in sy nie-vlugtige geheue. Met 'n groot aantal kliënte en gereelde verbindings en ontkoppelings, kan dit lei tot agteruitgang van die interne berging in die router.

NS: Metodes vir die lewering van kode aan die kliënt kan uitgebrei en aangevul word so ver as wat jou programmeringsvermoëns voldoende is. U kan byvoorbeeld boodskappe na telegram stuur of ... opsies voorstel!

Ek hoop dat die artikel vir u nuttig sal wees en sal help om die netwerke van klein en mediumgrootte ondernemings 'n bietjie veiliger te maak.

Bron: will.com