Tere, kolleegid! Täna, kui „kaug-töö” ümber tõusnud kirg on pisut raugenud, on enamus administraatoreid lahendanud töötajate kaugjuurdepääsu ettevõtte võrgule, on aeg jagada oma pikaajalist kogemust VPNi turvalisuse tõstmiseks. Käesolevas artiklis ei käsitleta praegu moes olevaid IPSec IKEv2 ja xAuth. Me räägime süsteemi ülesehitamisest, VPNi kasutajatele, kui MikroTik toimib VPN-serverina. Ja nimelt, kui kasutatakse „klassikalisi” protokolle nagu PPP.

Täna räägin, kuidas kaitsta MikroTik PPP-VPN-i isegi kasutajakonto „kaaperdamise” korral. Kui see skeem implementeeriti ühele minu kliendile, iseloomustas ta seda lühidalt: „Noh, nüüd on see just nagu pangas!”
Meetod ei kasuta väliseid autentimisserve. Ülesandeid täidetakse ruuteri enda sisemiste vahenditega. Ilma kuludeta ühendatud kliendile. See meetod toimib nii PC klientide kui ka mobiilsete seadmete jaoks.
Kaitse üldine skeem näeb välja järgmine:
- Kasutaja, kes on VPN-serveriga edukalt ühendatud, sisemine IP-aadress satub automaatselt „hallidesse” nimekirjadesse.
- Ühenduse loomise sündmus genereerib automaatselt ühekordse koodi, mis saadetakse kasutajale ühe olemasoleva meetodi kaudu.
- Selle loendi adresseritel on piiratud juurdepääs kohaliku võrgu ressurssidele, välja arvatud "autentikaatori" teenusele, mis ootab ühekordse parooli koodi saamist.
- Pärast koodi esitamist avatakse kasutajale juurdepääs sisemistele võrgu ressurssidele.
Esimene Väikseim probleem, millega silmitsi seista tuli, oli kasutaja kontaktteabe säilitamine 2FA koodi edastamiseks. Kuna Mikrotikes ei saa luua vabasid andmevälju, mis vastavad kasutajatele, kasutasime olemasolevat "kommentaari" välja:
/ppp secrets add name=Petrov password=4M@ngr! comment=«89876543210»
Teine Probleem osutus tõsisemaks — koodi edastamise teekonna ja meetodi valik. Praegu on ellu viidud kolm skeemi: a) SMS läbi USB-modemi b) e-mail c) SMS e-posti kaudu, mis on saadaval punase mobiilioperaatori ettevõtte klientidele.
Jah, SMS skeemid toovad kaasa kulutusi. Kuid kui järele mõelda, on "turvalisus alati seotud rahaga" (c).
E-kirja skeem mulle ei meeldi. Mitte sellepärast, et see nõuab autentimiseks e-posti serveri kergesti kätte saamist — liikluse jagamine ei ole probleem. Kuid kui klient on üleolevalt salvestanud paroole nii VPN-ile kui ka e-postile brauserisse ja seejärel kaotanud oma sülearvuti, saab kurjategija täieliku juurdepääsu ettevõtte võrgule.
Nii et on otsustatud — saatame ühekordse koodi SMS-sõnumite abil.
Kolmas Probleem oli selles, kus ja kuidas MikroTikis genereerida pseudojuhuslik kood 2FA jaoks. RouterOS-i skriptikeeles ei ole funktsiooni random() analooge ja olen enne näinud mitmeid vigaseid skripte pseudojuhuslike numbrite genereerimiseks. Ükski neist ei meeldinud mulle erinevatel põhjustel.
Tegelikult on MikroTikis pseudojuhuslike jada generaator olemas! See on varjatud pinnapealsest pilgust konteksti /certificates scep-server. Esimene meetod Ühekordse parooli saamine on lihtne ja kerge — kasutades käsku /certificates scep-server otp generate. Kui me teeme lihtsa määramisoperatsiooni muutuja jaoks, saame array tüüpi väärtuse, mida saame hiljem skriptides kasutada.
Teine meetod ühekorraliku parooli saamine, mida on lihtne kasutada — väline teenus soovitava kujuga pseudo-juhuslike arvude genereerimiseks. Siin on lihtsustatud konsoolipõhine 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
Käsk, mis on vormindatud konsoolile (scripti kehas tuleb erimärkide eest kaitsta), saab kuue märgi-numbriga stringi muutujasse $rnd1. Järgmine käsk «put» lihtsalt kuvab muutuja konsoolis.
Neljas probleem, millele tuli kiiresti vastata — kuidas ja kuhu ühendatud klient oma ühekordse koode teise autentimise etapi käigus edastab.

MikroTik ruuteris peaks olema teenus, mis suudab koodi vastu võtta ja see kindla kliendiga seostada. Kui esitatud kood kattub oodatava koodiga, peab kliendi aadress pääsema mingisse «valgesse» nimekirja, mille aadressidele on lubatud juurdepääs ettevõtte sisevõrgule.
Kuna teenuste valik on piiratud, otsustati kasutada MikroTik'iga integreeritud webproxy kaudu koode HTTP kaudu. Kuna tulemüüri on võimalik kasutada dünaamiliste IP-aadresside loenditega, teostab tulemüür koodi otsingu, vastavuse kliendi IP-ga ja lisamise 'valgesse' nimekirja Layer7 regexp'i abil. Marsruuterile on määratud tinglik DNS-nimi 'gw.local', millele on loodud staatiline A-kirje PPP-klientide väljastamiseks:
DNS
/ip dns static add name=gw.local address=172.31.1.1
Proxysse mitteautentifitseeritud klientide liikluse püük:
/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 proxy-l kaks funktsiooni.
1. Avada TCP-ühendused klientidega;
2. Eduka autentimise korral suunata kliendi brauser edukast autentimisest teavitavale lehele või pildile:
Proxy konfigureerimine
/ip proxy
määra lubatud=jah port=3128
/ip proxy access
lisa tegevus=keelata keelatud=ei suunata=gw.local/mikrotik_logo.png allika-aadress=0.0.0.0/0
Loetlen olulisi konfiguratsiooni elemente:
- interface-list '2fa' — dünaamiline nimekiri klientide liidestest, mille liiklus vajab 2FA raames töötlemist;
- address-list '2fa_jailed' — 'hall' nimekiri VPN-klientide tunnelite IP-aadressidest;
- address_list '2fa_approved' — 'valge' nimekiri VPN-klientide tunnelite IP-aadressidest, kes on edukalt läbinud kahefaktorilise autentimise.
- tulem 'input_2fa' tulemõrk, kus kontrollitakse tcp-pakettide autoriseerimiskoodi olemasolu ja saadetud koodiga IP-aadressi vastavust. Reeglid lisatakse ja eemaldatakse dünaamiliselt.
Lihtsustatud pakettide töötlemise diagramm näeb välja järgmine:
Kliendi liikluse kontrollimine Layer7 kaudu 'hallis' nimekirjas, mis ei ole veel teist autentimise etappi läbinud, toimub standardse 'input' ahela kaudu loodud reegli alusel:
Kood
/ip firewall filter add chain=input !src-address-list=2fa_kinnitatud action=jump jump-target=input_2fa
Nüüd hakkame kogu seda rikkust PPP teenusele külge panema. MikroTik võimaldab kasutada skripte profiilides (ppp-profile) ja määrata need ppp-ühenduse loomise ja katkestamise sündmustele. PPP-profiili seadeid saab rakendada nii PPP-serveri kui ka üksikute kasutajate jaoks. Samal ajal omab kasutajale määratud profiil prioriteeti, ületades serveri jaoks valitud profiili määratud parameetreid.
Selle lähenemisviisi tõttu saame luua erilise profiili kahefaktorilise autentimise jaoks ja määrata selle mitte kõikidele kasutajatele, vaid ainult neile, kellele me seda vajalikuks peame. See võib olla asjakohane juhul, kui PPP teenuseid kasutatakse mitte ainult lõppkasutajate ühendamiseks, vaid samal ajal ka site-to-site ühenduste loomiseks.
Uus loodud eriline profiil kasutab dünaamilist aadressi ja ühenduse liidese lisamist „hallidesse” aadressi- ja liidese loetellu:
winbox
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
On vajalik koos kasutada «address-list» ja «interface-list» loetelusid, et määrata ja haarata liiklust VPN-klientidelt, kes pole läbinud teist autentimist, dstnat (prerouting) ahelas.
Kui ettevalmistamine on lõpetatud, loodud täiendavad tulemüüriahelad ja profiil, kirjutame skripti, mis vastutab 2FA koodi automaatse genereerimise ja eraldi tulemüüri reeglite eest.
PPP-Profiili dokumentatsioon rikastab meid teabega PPP-kliendi ühendamise ja lahutamise sündmustega seotud muutujatest. „Käivita skript kasutaja sisselogimise sündmuse ajal. Need on saadaval muutujad, mis on sündmuse skripti jaoks juurdepääsetavad: kasutaja, kohalik-aadress, eemal-aadress, helistaja-id, kutsutud-id, liides“. Mõned neist on meile väga kasulikud.
Kood, mida kasutatakse profiilis PPP sisselogimise sündmuse jaoks
#Логируем для отладки полученные переменные :log info ("kohalik-aadress")
:log info ("kaug-aadress")
:log info ("kõne-id")
:log info ("kõneldi-id")
:log info ([/int pptp-server get ("liidese") nimi])
#Объявляем свои локальные переменные
:local listname "2fa_kinni"
:local viamodem vale
:local modemport "usb2"
#ищем автоматически созданную запись в адрес-листе "2fa_jailed"
:local recnum1 [/ip fi adressi-loend leia aadress=("kaug-aadress") nimekirjas=$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 salajane get [leia nimi=$user] kommentaar]#Готовим тело сообщения. Если клиент подключается к VPN прямо с телефона ему достаточно
#будет перейти прямо по ссылке из полученного сообщения
:local msgboby ("Teie kood: ".$comm1."n Või avage link http://gw.local/otp/".$comm1."/")# Отправляем SMS по выбранному каналу - USB-модем или email-to-sms
kui $viamodem do={
/tool sms send phone-number=$vphone message=$msgboby port=$modemport }
muidu={
/tool e-mail send server=a.b.c.d from=admin@mydomain.example to=mail2sms@mcommunicator.ru subject="@".$vphone body=$msgboby }#Генерируем Layer7 regexp
local vregexp ("otp\/".$comm1)
:local vcomment ("2fa_".("kaug-aadress"))
/ip firewall layer7-protocol add name=("vcomment") kommentaar=(
"kaug-aadress") regexp=(
"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=("vcomment") protokoll=tcp src-aadress=(
"kaug-aadress") dst-limit=1,1,src-aadress/1m40s
Eriti neile, kes armastavad mõtlemata kopeerida ja kleepida, teen ettepaneku — kood on võetud testversioonist ja võib sisaldada väikeseid trükivigu. Täiendavate detailide mõistmine ei valmista küsija jaoks raskusi.Kasutaja väljalülitamisel genereeritakse sündmus „On-Down“ ja kutsutakse vastava skripti parametreid. Selle skripti ülesanne on puhastada tulemüüri reeglid, mis on loodud väljalülitatud kasutaja jaoks.
Kood, mida kasutatakse profiilis PPP väljalülitamise sündmuse jaoks
:local vcomment ("2fa_".("kaug-aadress"))
/ip firewall address-list remove [find address=("remote-address") list=2fa_approved]
/ip firewall filter remove [find chain="input_2fa" src-address=("remote-address") ]
/ip firewall layer7-protocol remove [find name=$vcomment]
Pärast seda saab luua kasutajaid ja määrata igale või mõnele neist profiil, millel on kahefaktoriline autentimine.winbox
Kood
/ppp secrets set [find name=Petrov] profile=2FAKuidas see näeb välja kliendi poolel.
VPN-ühenduse loomisel saadetakse Android/iOS telefonile/ tahvelarvutile SIM-kaardiga kindlasti SMS sellise sisuga:
SMS
Kui ühendus on loodud otse telefonist/tahvelarvutist, siis saab kahefaasilise autentimise (2FA) läbida lihtsalt klikates sõnumis olevale lingile. See on mugav.
Kui VPN-ühendus luuakse PC-ga, vajab kasutaja minimaalset paroolivormingut. Väike HTML-fail edastatakse kasutajale VPN-i seadistamisel. Faili saab isegi e-posti teel saata, et kasutaja saaks selle endale salvestada ja luua mugavas kohas otsetee. Umbes nii see välja näeb:
Otsetee töölaual
Kasutaja klikkib otseteed, avaneb lihtne koodisisestamise vorm, mis sisestab koodi avatud URL-i:
Vormi ekraanipilt
Vorm on kõige primitiivsem, antud näitena. Soovijad saavad selle enda vajadustele kohandada.
2fa_login_mini.html
<html> <head> <title>SMS OTP sisselogimine</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form name="login" action="/et/location.href='http://gw.local/otp/'+document.getElementById(‘text').value/" method="post" <input id="text" type="text" data-trp-original-action="location.href='http://gw.local/otp/'+document.getElementById(‘text').value"/><input type="hidden" name="trp-form-language" value="et"/> <input type="button" value="Logi sisse" onclick="location.href='http://gw.local/otp/'+document.getElementById('text').value"/> </form> </body> </html>Kui autentimine on edukalt läinud, näeb kasutaja brauseris MikroTiki logo, mis peaks andma märku, et autentimine on õnnestunud:
Mainin, et pilt saadetakse tagasi MikroTiki sisseehitatud veebiserverist kasutades WebProxy Deny Redirect'i.
Arvan, et pilti saab kohandada, kasutades tööriista "hotspot", laadides sinna oma variandi ja määrates selle Deny Redirect URL WebProxy-ga.
Palun, ärge proovige asendada 500-dollarist ruuteri 20-dollarise "mänguasi" Mikrotikiga. Seadmed nagu "hAP Lite"/"hAP mini" (kodused juurdepääsupunktid) omavad väga nõrka protsessorit (smips) ja võivad äri segmendis koormusega toime tulemata jääda.
Hoiatame! Sellel lahendusel on üks puudus: kui seadmed ühinevad või lahkuvad, toimuvad ruuteri konfiguratsiooni muudatused, mida ta püüab hoida oma energiat sõltumatus mälus. Suure klientide arvu ja sagedate ühenduste-lahkumiste korral võib see põhjustada ruuteri sisemise mälu degradeerumist.
P.S.: Koodide saatmise meetodeid kliendile saab laiendada ja täiustatud vastavalt teie programmeerimisvõimekusele. Näiteks võib saata sõnumeid Telegramis või… pakkuda välja variante!
Loodan, et artikkel osutub teile kasulikuks ja aitab muuta väikeste ja keskmiste ettevõtete võrke veelgi turvalisemaks.
Allikas: habr.com




