Twa-faktor autentikaasje fan VPN-brûkers fia MikroTik en SMS

Hallo kollega's! Tsjintwurdich, doe't de passy om wurk op ôfstân in bytsje ferdwûn is, hawwe de measte behearders de taak ferovere fan tagong op ôfstân fan meiwurkers nei it bedriuwsnetwurk, it is tiid om myn langsteande ûnderfining te dielen yn it ferbetterjen fan VPN-feiligens. Dit artikel sil de op it stuit modieuze IPSec IKEv2 en xAuth net dekke. It giet om it bouwen fan in systeem twa-faktor autentikaasje (2FA) VPN-brûkers as MikroTik fungearret as VPN-tsjinner. Nammentlik as "klassike" protokollen lykas PPP wurde brûkt.

Twa-faktor autentikaasje fan VPN-brûkers fia MikroTik en SMS

Hjoed sil ik jo fertelle hoe't jo MikroTik PPP-VPN kinne beskermje, sels as jo brûkersaccount is kape. Doe't dit skema waard yntrodusearre oan ien fan myn klanten, hy beskreau it koart as "goed, no is it krekt as yn in bank!"

De metoade brûkt gjin eksterne autentikaasjetsjinsten. De taken wurde yntern útfierd troch de router sels. Gjin kosten foar de ferbûne klant. De metoade wurket foar sawol PC-kliïnten as mobile apparaten.

It algemiene beskermingsskema is as folget:

  1. It ynterne IP-adres fan in brûker dy't mei súkses ferbûn is mei de VPN-tsjinner wurdt automatysk tafoege oan 'e grize list.
  2. It ferbiningsevenemint genereart automatysk in ienmalige koade dy't nei de brûker stjoerd wurdt mei ien fan 'e beskikbere metoaden.
  3. Adressen yn dizze list hawwe beheinde tagong ta lokale netwurkboarnen, mei útsûndering fan 'e "autentikator" tsjinst, dy't ferwachtet in ienmalige wachtwurdkoade te ûntfangen.
  4. Nei it presintearjen fan de koade hat de brûker tagong ta ynterne netwurkboarnen.

De earste it lytste probleem dat wy moasten tsjinkomme wie it bewarjen fan kontaktynformaasje oer de brûker om him in 2FA-koade te stjoeren. Om't it ûnmooglik is om willekeurige gegevensfjilden te meitsjen dy't oerienkomme mei brûkers yn Mikrotik, waard it besteande "kommentaar" fjild brûkt:

/ ppp geheimen tafoegje namme = Petrov wachtwurd = 4M@ngr! comment="89876543210"

De twadde it probleem blykte serieuzer te wêzen - de kar fan it paad en metoade foar it leverjen fan de koade. Op it stuit wurde trije skema's ymplementearre: a) SMS fia USB-modem b) e-post c) SMS fia e-post beskikber foar bedriuwskliïnten fan 'e reade mobile operator.

Ja, sms-skema's meitsje kosten. Mar as jo it sjogge, "feiligens is altyd oer jild" (c).
Ik persoanlik net leuk it e-mail skema. Net om't it fereasket dat de e-posttsjinner beskikber is foar de kliïnt dy't authentisearre wurdt - it is gjin probleem om ferkear te splitsen. As de kliïnt lykwols achteleas wachtwurden foar sawol VPN as e-post yn 'e browser hat bewarre, en dan syn laptop ferlear, sil de oanfaller dêrút folsleine tagong krije ta it bedriuwsnetwurk.

Dat, it is besletten - wy leverje in ienmalige koade mei SMS-berjochten.

Tredde it probleem wie wêr en hoe te generearjen pseudo-willekeurich koade foar 2FA yn MikroTik. D'r is gjin lykweardich oan 'e willekeurich () funksje yn' e RouterOS-skripttaal, en ik haw earder sjoen ferskate crummy scripted pseudo-willekeurige getallengenerators. Ik mocht om ferskate redenen beide net leuk.

Yn feite is d'r in pseudo-willekeurige sekwinsjegenerator yn MikroTik! It is ferburgen foar in oerflakkich each yn 'e kontekst fan / sertifikaten scep-tsjinner. De earste manier in ienmalige wachtwurd krije is maklik en ienfâldich - mei it kommando / sertifikaten scep-tsjinner otp generearje. As wy útfiere in ienfâldige fariabele tawizing operaasje, wy krije in array wearde dat kin brûkt wurde letter yn skripts.

De twadde manier it krijen fan in ienmalige wachtwurd, dat is ek maklik te brûken - mei help fan in eksterne tsjinst random.org om it winske type folchoarder fan pseudorandom nûmers te generearjen. Hjir is in ferienfâldige ien cantilever foarbyld fan it ûntfangen fan gegevens yn in fariabele:

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

In fersyk opmakke foar de konsole (ûntsjiende spesjale tekens sille ferplicht wurde yn it lichem fan it skript) ûntfangt in tekenrige fan seis numerike tekens yn 'e $rnd1-fariabele. It folgjende kommando "put" toant gewoan de fariabele yn 'e MikroTik-konsole.

It fjirde probleem dy't rap oplost wurde moast wie hoe en wêr't de ferbûne kliïnt syn ienmalige koade yn 'e twadde faze fan autentikaasje soe stjoere.

Twa-faktor autentikaasje fan VPN-brûkers fia MikroTik en SMS

D'r moat in tsjinst wêze op 'e MikroTik-router dy't de koade kin akseptearje en oerienkomme mei in spesifike klant. As de opjûne koade oerienkomt mei de ferwachte, moat it adres fan 'e kliïnt opnommen wurde yn in bepaalde "wite" list, adressen wêrfan tagong ta it ynterne netwurk fan it bedriuw tastien is.

Fanwegen de beheinde kar fan tsjinsten waard besletten om koades te akseptearjen fia http mei de yn Mikrotik ynboude webproxy. En om't de brânmuorre kin wurkje mei dynamyske listen fan IP-adressen, is it de brânmuorre dy't de koade siket, oerienkomt mei de kliïnt IP en foeget it ta oan 'e "wite" list mei Layer7 regexp. De router sels is in betingste DNS-namme "gw.local" tawiisd, en in statysk In record is derop makke foar útjefte oan PPP-kliïnten:

DNS
/ip dns statyske tafoegje namme = gw.local adres = 172.31.1.1

Ferkear fangen fan net ferifiearre kliïnten troch proxy:
/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

Yn dit gefal hat de proxy twa funksjes.

1. Iepenje TCP-ferbiningen mei kliïnten;

2. Yn gefal fan suksesfolle autorisaasje, omliede de kliïntblêder nei in side of ôfbylding dy't notifikaasje oer suksesfolle autentikaasje hat:

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

Ik sil de wichtige konfiguraasje-eleminten listje:

  1. ynterface-list "2fa" - in dynamyske list fan client-ynterfaces, ferkear wêrfan ferwurking fereasket binnen it ramt fan 2FA;
  2. adreslist "2fa_jailed" - "grize" list fan tunnel IP-adressen fan VPN-kliïnten;
  3. address_list "2fa_approved" - in wite list mei tunnel-IP-adressen fan VPN-kliïnten dy't twa-faktor-autentikaasje mei súkses hawwe trochjûn.
  4. firewall ketting "input_2fa" - it kontrolearret TCP-pakketten foar de oanwêzigens fan in autorisaasjekoade en oft it IP-adres fan de koadestjoerder oerienkomt mei it fereaske. Regels yn 'e keatling wurde dynamysk tafoege en fuortsmiten.

In ferienfâldige streamdiagram foar pakketferwurking sjocht der sa út:

Twa-faktor autentikaasje fan VPN-brûkers fia MikroTik en SMS

Om ferkear op te nimmen fan kliïnten op 'e "grize" list dy't de twadde faze fan autentikaasje noch net hawwe trochjûn yn 'e Layer7-scan, is in regel makke yn' e standert "ynput" keten:

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

Litte wy no al dizze rykdom begjinne te ferbinen mei de PPP-tsjinst. MikroTik lit jo skripts brûke yn profilen (ppp-profyl) en tawize se oan 'e eveneminten fan it opsetten en brekken fan in ppp-ferbining. De ynstellings fan it ppp-profyl kinne sawol tapast wurde op de PPP-tsjinner as gehiel en op yndividuele brûkers. Yn dit gefal hat it profyl dat oan 'e brûker is tawiisd prioriteit, mei syn oantsjutte parameters de parameters fan it profyl selektearre foar de tsjinner as gehiel.

As gefolch fan dizze oanpak kinne wy ​​​​in spesjaal profyl meitsje foar twa-faktora-autentikaasje en it net oan alle brûkers tawize, mar allinich oan dyjingen dy't wy nedich achtsje om dit te dwaan. Dit kin relevant wêze as jo PPP-tsjinsten brûke net allinich om ein brûkers te ferbinen, mar tagelyk om side-to-site ferbiningen te bouwen.

Yn it nij oanmakke spesjale profyl brûke wy dynamyske tafoeging fan it adres en ynterface fan 'e ferbûne brûker oan' e "grize" listen mei adressen en ynterfaces:

winbox
Twa-faktor autentikaasje fan VPN-brûkers fia MikroTik en SMS

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

It is needsaaklik om de "adres-list" en "ynterface-list" -listen tegearre te brûken om ferkear te identifisearjen en te fangen fan VPN-kliïnten dy't gjin sekundêre autorisaasje hawwe trochjûn yn 'e dstnat (prerouting) keten.

As de tarieding foltôge is, binne ekstra brânmuorkettingen en in profyl makke, wy sille in skript skriuwe dat ferantwurdlik is foar de auto-generaasje fan 'e 2FA-koade en yndividuele firewall-regels.

Dokumintaasje wiki.mikrotik.com on PPP-Profile ferryket ús mei ynformaasje oer fariabelen ferbûn mei PPP client ferbining en disconnection eveneminten "Skript útfiere op brûker login-evenemint. Dit binne beskikbere fariabelen dy't tagonklik binne foar it evenemint skript: brûker, lokaal-adres, remote-adres, beller-id, neamd-id, ynterface". Guon fan harren sille foar ús tige nuttich wêze.

Koade brûkt yn it profyl foar de PPP on-up ferbining evenemint

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

Ik warskôgje jo foaral foar dyjingen dy't graach kopiearje en plakke - de koade is nommen út in testferzje en kin lytse flaters befetsje. It sil net dreech wêze foar in begryp persoan om út te finen wêr't krekt.

As in brûker loskeart, wurdt in "On-Down" evenemint oanmakke en it oerienkommende skript mei parameters wurdt neamd. It doel fan dit skript is it skjinmeitsjen fan de firewall regels makke foar de loskeppele brûker.

Koade brûkt yn it profyl foar de PPP on-down ferbining evenemint

: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]
Jo kinne dan brûkers oanmeitsje en guon of allegear tawize oan in twa-faktor autentikaasjeprofyl.

winbox
Twa-faktor autentikaasje fan VPN-brûkers fia MikroTik en SMS

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

Hoe sjocht it der út op de klant kant.

As jo ​​​​in VPN-ferbining meitsje, wurdt in sms sawat sa stjoerd nei jo Android/iOS-tillefoan/tablet mei in SIM-kaart:

SMS
Twa-faktor autentikaasje fan VPN-brûkers fia MikroTik en SMS

As de ferbining direkt fan jo tillefoan/tablet is oprjochte, dan kinne jo troch 2FA gean gewoan troch te klikken op de keppeling fan it berjocht. It is noflik.

As in VPN-ferbining wurdt oprjochte fanút in PC, dan sil de brûker ferplicht wurde om in minimale foarm fan wachtwurd yn te fieren. In lyts formulier yn 'e foarm fan in HTML-bestân wurdt nei de brûker stjoerd by it ynstellen fan de VPN. It bestân kin sels per post ferstjoerd wurde, sadat de brûker it kin opslaan en in fluchtoets meitsje op in handich plak. It sjocht der sa út:

Label op 'e tafel
Twa-faktor autentikaasje fan VPN-brûkers fia MikroTik en SMS

De brûker klikt op de fluchtoets, in ienfâldich koade-ynfierformulier iepenet, dat de koade ynfoegje sil yn 'e iepene URL:

Form skerm
Twa-faktor autentikaasje fan VPN-brûkers fia MikroTik en SMS

De foarm is de meast primitive, jûn as foarbyld. Dejingen dy't wolle, kinne it oanpasse oan harsels.

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 autorisaasje suksesfol is, sil de brûker it MikroTik-logo yn 'e browser sjen, dat moat tsjinje as in sinjaal fan suksesfolle autentikaasje:

Twa-faktor autentikaasje fan VPN-brûkers fia MikroTik en SMS

Tink derom dat de ôfbylding wurdt weromjûn fan 'e ynboude MikroTik-webserver mei WebProxy Deny Redirect.

Ik leau dat de ôfbylding kin wurde oanpast mei it "hotspot" ark, it uploaden fan jo eigen ferzje dêr en it ynstellen fan in Deny Redirect URL nei it mei WebProxy.

In grut fersyk foar dyjingen dy't besykje it goedkeapste "boartersguod" Mikrotik foar $ 20 te keapjen en it te ferfangen mei in $ 500-router - doch dat net. Apparaten lykas "hAP Lite"/"hAP mini" (thús tagongspunt) hawwe in heul swak CPU (smips), en sille wierskynlik net omgean mei de lading yn it bedriuwsegmint.

Warskôging! Dizze oplossing hat ien neidiel: as kliïnten ferbine of ôfbrekke, komme konfiguraasjewizigingen foar, dy't de router besiket te bewarjen yn syn net-flechtich ûnthâld. Mei in grut oantal kliïnten en faak ferbinings en disconnections, dit kin liede ta degradaasje fan de ynterne opslach yn de router.

PS: metoaden foar it leverjen fan koade oan 'e kliïnt kinne wurde útwreide en oanfolle wat jo programmearring mooglikheden oanbelanget. Jo kinne bygelyks berjochten ferstjoere op telegram of ... opsjes foarstelle!

Ik hoopje dat dit artikel nuttich foar jo sil wêze en helpe lytse en middelgrutte saaklike netwurken in bytsje feiliger te meitsjen.

Boarne: www.habr.com