VPN-i kasutajate kahefaktoriline autentimine MikroTiku ja SMS-i kaudu

Tere kolleegid! Täna, kui kired “kaugtöö” ümber veidi vaibusid, võitis suurem osa administraatoreid töötajate kaugjuurdepääsu ettevõtte võrgule ülesande, on aeg jagada oma pikaajalist kogemust VPN-i turvalisuse parandamisel. See artikkel ei ole nüüd moes IPSec IKEv2 ja xAuth. See puudutab süsteemi ülesehitamist. kahefaktoriline autentimine (2FA) VPN-i kasutajad, kui MikroTik toimib VPN-serverina. Nimelt siis, kui kasutatakse "klassikalisi" protokolle nagu PPP.

VPN-i kasutajate kahefaktoriline autentimine MikroTiku ja SMS-i kaudu

Täna räägin teile, kuidas kaitsta MikroTik PPP-VPN-i isegi kasutajakonto "kaaperdamise" korral. Kui seda skeemi ühele mu kliendile tutvustati, kirjeldas ta seda lühidalt kui "noh, nüüd on see nagu pangas!".

Meetod ei kasuta väliseid autentimisteenuseid. Ülesandeid täidab sisemiselt ruuter ise. Ühendaval kliendil pole kulusid. Meetod töötab nii arvutiklientide kui ka mobiilseadmete jaoks.

Üldine kaitseskeem on järgmine:

  1. VPN-serveriga edukalt ühenduse loonud kasutaja sisemine IP-aadress kuvatakse automaatselt hallis.
  2. Ühenduse sündmus genereerib automaatselt ühekordse koodi, mis saadetakse kasutajale ühel saadaolevatest meetoditest.
  3. Selle loendi aadressidel on piiratud juurdepääs kohaliku võrgu ressurssidele, välja arvatud autentimisteenus, mis ootab ühekordse pääsukoodi saamist.
  4. Pärast koodi esitamist on kasutajal juurdepääs võrgu sisemistele ressurssidele.

Esimene väikseim probleem, millega ma silmitsi seisin, oli kasutaja kontaktandmete salvestamine, et talle 2FA-kood saata. Kuna Mikrotikas ei saa luua suvalisi kasutajatele vastavaid andmevälju, kasutati olemasolevat “kommentaari” välja:

/ppp saladused add name=Petrov parool=4M@ngr! comment = "89876543210"

Teine probleem osutus tõsisemaks - koodi edastamise tee ja meetodi valik. Praegu on kasutusel kolm skeemi: a) SMS USB-modemi kaudu b) e-post c) SMS e-posti teel, mis on saadaval punase mobiiltelefoni operaatori äriklientidele.

Jah, SMS-skeemid toovad kulusid. Aga kui te vaatate, siis "turvalisus seisneb alati rahas" (c).
Mulle isiklikult ei meeldi skeem e-kirjaga. Mitte sellepärast, et see nõuab, et meiliserver oleks autentitava kliendi jaoks saadaval – liikluse jagamine pole probleem. Kui aga klient salvestas hooletult brauserisse nii vpn-i kui ka e-posti parooli ja kaotas seejärel oma sülearvuti, saaks ründaja sellest täieliku juurdepääsu ettevõtte võrgule.

Niisiis, see on otsustatud – edastame ühekordse koodi SMS-sõnumite abil.

kolmas Probleem oli selles, kus kuidas luua MikroTikus pseudojuhuslikku koodi 2FA jaoks. RouterOS-i skriptikeeles funktsioonile random() analoogi pole ja olen varem näinud mitmeid crutch scripti pseudojuhuslike numbrite generaatoreid. Ükski neist ei meeldinud mulle erinevatel põhjustel.

Tegelikult on MikroTikus pseudojuhusliku järjestuse generaator! See on /certificates scep-serveri kontekstis pealiskaudse pilgu eest varjatud. Esimene tee ühekordse parooli hankimine on lihtne ja lihtne – käsuga /sertifikaadid scep-server otp genereerib. Kui sooritame lihtsa muutuja määramise operatsiooni, saame massiivi väärtuse, mida saab hiljem skriptides kasutada.

Teine võimalus ühekordse parooli hankimine, mida on samuti lihtne rakendada – kasutades välisteenust random.org soovitud tüüpi pseudojuhuslike arvude jada genereerimiseks. Siin on lihtsustatud konsool näide andmete saamisest muutujasse:

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

Konsooli jaoks vormindatud päring (skripti kehas on nõutavad erimärgid) saab muutujasse $rnd1 kuuekohalise stringi. Järgmine käsk "put" kuvab lihtsalt muutuja MikroTik konsoolis.

Neljas probleem mis tuli kiiresti lahendada – nii ja kuhu ühendatud klient autentimise teises etapis oma ühekordse koodi edastab.

VPN-i kasutajate kahefaktoriline autentimine MikroTiku ja SMS-i kaudu

MikroTik ruuteris peab olema teenus, mis suudab koodi vastu võtta ja sobitada selle konkreetse kliendiga. Kui antud kood ühtib oodatud, peaks kliendi aadress olema kindlas "valges" nimekirjas, mille aadressidelt on lubatud ligipääs ettevõtte sisevõrku.

Halva teenustevaliku tõttu otsustati Mikrotiku sisseehitatud veebipuhverserveri abil koodid vastu võtta http kaudu. Ja kuna tulemüür saab töötada dünaamiliste IP-aadresside loenditega, otsib tulemüür koodi, sobitades selle kliendi IP-ga ja lisades selle Layer7 regexpi abil "valgesse" loendisse. Ruuterile endale on määratud tingimuslik DNS-i nimi "gw.local", sellele on loodud staatiline A-kirje PPP klientidele väljastamiseks:

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

Kinnitamata klientide liikluse hõivamine puhverserveris:
/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

Sel juhul on puhverserveril kaks funktsiooni.

1. Ava tcp-ühendused klientidega;

2. Eduka autoriseerimise korral suunake kliendibrauser edukast autentimisest teavitavale lehele või pildile:

Puhverserveri konfiguratsioon
/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

Loetlesin olulised konfiguratsioonielemendid:

  1. liideste loend "2fa" - kliendiliideste dünaamiline loend, mille liiklus vajab töötlemist 2FA-s;
  2. aadressiloend "2fa_jailid" - VPN-i klientide tunneli IP-aadresside "hall" loend;
  3. address_list "2fa_approved" – kahefaktorilise autentimise edukalt läbinud VPN-klientide tunneli IP-aadresside "valge" loend.
  4. tulemüüri kett "input_2fa" - see kontrollib tcp-pakette autoriseerimiskoodi olemasolu suhtes ja sobitab koodi saatja IP-aadressi vajalikuga. Reeglid ahelas lisatakse ja eemaldatakse dünaamiliselt.

Pakettide töötlemise lihtsustatud vooskeem näeb välja selline:

VPN-i kasutajate kahefaktoriline autentimine MikroTiku ja SMS-i kaudu

Et pääseda Layer7 liikluse kontrolli "hallist" loendist klientidelt, kes pole veel autentimise teist etappi läbinud, on standardses "sisend" ahelas loodud reegel:

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

Nüüd hakkame kogu seda rikkust PPP-teenuse külge kinnitama. MikroTik võimaldab kasutada skripte profiilides (ppp-profiil) ja määrata need ppp-ühenduse loomise ja katkestamise sündmustele. Ppp-profiili sätteid saab rakendada nii PPP-serverile tervikuna kui ka üksikutele kasutajatele. Samal ajal on prioriteet kasutajale määratud profiil, mis alistab serveri kui terviku jaoks valitud profiili parameetrid selle määratud parameetritega.

Sellise lähenemise tulemusena saame luua kahefaktorilise autentimise jaoks spetsiaalse profiili ja määrata seda mitte kõigile kasutajatele, vaid ainult neile, kes peavad seda vajalikuks. See võib olla asjakohane, kui kasutate PPP-teenuseid mitte ainult lõppkasutajate ühendamiseks, vaid samal ajal ka saitidevaheliste ühenduste loomiseks.

Äsja loodud eriprofiilis kasutame ühendatud kasutaja aadressi ja liidese dünaamilist lisamist "hallidesse" aadresside ja liideste loenditesse:

winbox
VPN-i kasutajate kahefaktoriline autentimine MikroTiku ja SMS-i kaudu

Kood
/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 (eelmarsruutimise) ahela mittesekundaarsete VPN-klientide liikluse tuvastamiseks ja hõivamiseks on vaja kasutada nii aadressiloendi kui ka liidese loendi loendeid.

Kui ettevalmistus on lõppenud, luuakse täiendavad tulemüüriahelad ja profiil, kirjutame skripti, mis vastutab 2FA koodi ja individuaalsete tulemüürireeglite automaatse genereerimise eest.

Dokumentatsioon wiki.mikrotik.com PPP-profiilis rikastab meid teabega muutujate kohta, mis on seotud PPP kliendi ühendamise ja lahtiühendamise sündmustega "Käivita skript kasutaja sisselogimissündmusel. Need on saadaolevad muutujad, mis on sündmuse skripti jaoks kättesaadavad: kasutaja, kohalik aadress, kaug-aadress, helistaja ID, kutsutud ID, liides.. Mõned neist on meile väga kasulikud.

PPP sisselülitatud ühenduse sündmuse profiilis kasutatav kood

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

Eriti neile, kellele meeldib meeletult kopeerida-kleepida, hoiatan – kood on võetud testversioonist ja võib sisaldada väiksemaid kirjavigu. Mõistval inimesel pole raske aru saada, kus täpselt.

Kui kasutaja katkestab ühenduse, genereeritakse sündmus "On-Down" ja kutsutakse välja vastav skript koos parameetritega. Selle skripti eesmärk on puhastada lahti ühendatud kasutaja jaoks loodud tulemüürireeglid.

PPP sisselülitatud ühenduse sündmuse profiilis kasutatav kood

: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]
Seejärel saate luua kasutajaid ja määrata kõik või osa neist kahefaktorilisele autentimisprofiilile.

winbox
VPN-i kasutajate kahefaktoriline autentimine MikroTiku ja SMS-i kaudu

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

Kuidas see kliendi poolel välja näeb.

Kui VPN-ühendus on loodud, saab SIM-kaardiga Androidi/iOS-i telefon/tahvelarvuti järgmise SMS-i:

SMS
VPN-i kasutajate kahefaktoriline autentimine MikroTiku ja SMS-i kaudu

Kui ühendus luuakse otse telefonist / tahvelarvutist, saate 2FA-st läbi minna, klõpsates lihtsalt sõnumis olevat linki. See on mugav.

Kui VPN-ühendus luuakse arvutist, peab kasutaja sisestama minimaalse paroolivormi. VPN-i seadistamisel antakse kasutajale väike vorm HTML-faili kujul. Faili saab saata isegi posti teel, nii et kasutaja salvestab selle ja loob otsetee sobivasse kohta. See näeb välja selline:

Silt laual
VPN-i kasutajate kahefaktoriline autentimine MikroTiku ja SMS-i kaudu

Kasutaja klõpsab otseteele, avaneb lihtne koodi sisestamise vorm, mis kleebib koodi avatud URL-i:

Ekraani vorm
VPN-i kasutajate kahefaktoriline autentimine MikroTiku ja SMS-i kaudu

Näitena on toodud kõige primitiivsem vorm. Kes soovib, saab ise muuta.

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>

Kui autoriseerimine õnnestus, näeb kasutaja brauseris MikroTiku logo, mis peaks andma märku edukast autentimisest:

VPN-i kasutajate kahefaktoriline autentimine MikroTiku ja SMS-i kaudu

Pange tähele, et pilt tagastatakse sisseehitatud MikroTiku veebiserverist WebProxy Deny Redirect abil.

Arvan, et pilti saab kohandada "kuumala" tööriista abil, laadides sinna üles oma versiooni ja määrates sellele WebProxy abil ümbersuunamise keelamise URL-i.

Suur palve neile, kes üritavad osta 20 dollari eest odavaimat "mänguasja" Mikrotikut ja asendada sellega 500 dollarine ruuter – ärge seda tehke. Sellistel seadmetel nagu "hAP Lite" / "hAP mini" (kodu pöörduspunkt) on väga nõrk protsessor (smips) ja tõenäoliselt ei tule need ärisegmendi koormusega toime.

Hoiatus! Sellel lahendusel on üks puudus: klientide ühendamisel või lahtiühendamisel toimuvad konfiguratsioonimuudatused, mida ruuter üritab oma püsimällu salvestada. Suure arvu klientide ja sagedaste ühenduste ja katkestuste korral võib see kaasa tuua ruuteri sisemälu halvenemise.

PS: Koodi kliendile edastamise meetodeid saab laiendada ja täiendada, kui teie programmeerimisvõimalused on piisavad. Näiteks saate saata sõnumeid telegrammile või ... soovitada võimalusi!

Loodan, et artikkel on teile kasulik ja aitab muuta väikeste ja keskmise suurusega ettevõtete võrgustikke veidi turvalisemaks.

Allikas: www.habr.com