Dybyfaktorike autentifikimi i përdoruesve VPN përmes MikroTik dhe SMS

Përshëndetje kolegë! Sot, kur pasiguria rreth "punës në distancë" ka pak zbehur, shumica e administratorëve kanë zgjidhur problemin e aksesit në distancë të punonjësve në rrjetin korporativ, ka ardhur koha të ndaj përvojën time të vjetër për rritjen e sigurisë së VPN. Në këtë artikull nuk do të flas për IPSec IKEv2 dhe xAuth, të cilat janë aktualisht në modë. Bëhet fjalë për ndërtimin e një sistemi dypikëshe të autentifikimit (2FA) të përdoruesve VPN, kur MikroTik vepron si serveri VPN. Sidomos kur përdoren protokole "klasike" si PPP.

Dybyfaktorike autentifikimi i përdoruesve VPN përmes MikroTik dhe SMS

Sot do të tregoj si të mbroj MikroTik PPP-VPN edhe në rastin e "kidnapimit" të llogarisë së përdoruesit. Kur kjo skemë u implementua për një nga klientët e mi, ai e përshkroi shkurtimisht "tani është si në bankë!".

Metoda nuk përdor shërbime autentifikimi të jashtme. Detyrat kryhen nga mjetet e brendshme të router-it. Pa kosto për klientin e lidhur. Qasja funksionon si për klientët PC, ashtu edhe për pajisjet mobile.

Skema e përgjithshme e mbrojtjes duket kështu:

  1. Adresa IP e brendshme e përdoruesit që është lidhur me sukses në serverin VPN, automatikisht vendoset në "listën gri".
  2. Ngjarja e lidhjes automatikisht gjeneron një kod të vetëm, i cili dërgohet përdoruesit në një nga mënyrat e disponueshme.
  3. Adresat që ndodhen në këtë listë kanë akses të kufizuar në burimet e rrjetit lokal, me përjashtim të shërbimit "autentifikues", që pret marrjen e kodit të vetëm të fjalëkalimit.
  4. Pas paraqitjes së kodit, përdoruesit i hapet accessi në burimet e brendshme të rrjetit.

I pari problemi më i vogël me të cilin u përballa, ishte ruajtja e informacionit të kontaktit për përdoruesin për t'i dërguar atij kodin 2FA. Duke qenë se, nuk ishte e mundur të krijoheshin fusha të rastësishme të të dhënave përkatëse për përdoruesit në MikroTik, u përdor fusha ekzistuese "comment":

/ppp secrets add name=Petrov password=4M@ngr! comment=«89876543210»

I dyti problemi doli të ishte më serioz — zgjedhja e rrugës dhe mënyrës për të dërguar kodin. Aktualisht janë implementuar tri skema: a) SMS përmes modem USB b) e-mail c) SMS përmes e-mail për klientët korporativë të operatorit të kuq celular.

Po, skemat me SMS sjellin shpenzime. Por nëse e shqyrtojmë, "siguria gjithmonë është çështje parash" (c).
Mënyra me e-mail nuk më pëlqen personalisht. Jo sepse kërkon disponueshmëri të serverit të postës për klientin e autentikuar — kjo nuk është një problem për të ndarë trafikun. Megjithatë, nëse klienti ruan pa kujdes fjalëkalimet në vpn dhe në postë në shfletues, dhe pastaj humbet laptopin e tij, një sulmues do të ketë qasje të plotë në rrjetin korporativ.

Pra, u vendos — dërgojmë një kod njëherësh përmes SMS-ve.

I tretë problemi ishte se ku dhe si të gjenerosh një kod të rastit në MikroTik për 2FA. Në gjuhën e skripteve RouterOS nuk ka ekuivalent të funksionit random() dhe më parë kam parë disa skriptë të ndërlikuar për gjenerimin e numrave të rastit. Asnjë prej tyre nuk më pëlqeu për arsye të ndryshme.

Në të vërtetë, ka një gjenerator të sekuencave të rastësishme në MikroTik! Ai është fshehur nga një vështrim i sipërm në kontekstin /certificates scep-server. Mënyra e parë për të marrë një fjalëkalim të përkohshëm është e lehtë dhe e thjeshtë — me komandën /certificates scep-server otp generate. Nëse kryhen një operacion i thjeshtë i caktimit të një variabli, do të marrim një vlerë të tipit array, e cila mund të përdoret më tej në skriptet.

Mënyra e dytë për të marrë një fjalëkalim të përkohshëm që gjithashtu është e lehtë për t'u përdorur — përdorimi i një shërbimi të jashtëm random.org për të gjeneruar një sekuencë të dëshiruar të numrave të rastit. Këtu është një shembull i thjeshtuar ndërfaqe i marrjes së të dhënave në një variabël:

Kodi
: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ërkesa e formatuar për konsolë (në trupin e skriptit do të nevojitet përjashtimi i simboleve speciale) merr një varg prej gjashtë shenjash-numrash në variablën $rnd1. Komanda e ardhshme „put“ thjesht shfaq variablën në konsolën MikroTik.

Problemi i katërt, që duhet të zgjidhej në mënyrë оперативе — është se si dhe ku klienti i lidhur do të dërgojë kodin e tij të përkohshëm në fazën e dytë të autentikimit.

Dybyfaktorike autentifikimi i përdoruesve VPN përmes MikroTik dhe SMS

Në routerin MikroTik duhet të ekzistojë një shërbim që mund të pranojë kodin dhe ta përputhë atë me një klient të caktuar. Nëse kodi i dhënë përputhet me adresën e pritur, adresa e klientit duhet të kalojë në një farë 'liste të bardhë', nga e cila është e lejuar kyçja në rrjetin e brendshëm të kompanisë.

Duke pasur përzgjedhje të kufizuar shërbimesh, u mor vendimi për të pranuar kodet nëpërmjet http me ndihmën e webproxy-t të integruar në MikroTik. Dhe meqë firewall-i di të punojë me lista dinamike IP-adresesh, kërkimi i kodit, përputhja e tij me IP-në e klientit dhe shtimi në "listën e bardhë" realizohet pikërisht nga firewall-i nëpërmjet Layer7 regexp. Routerit i është caktuar një emër DNS të kushtëzuar "gw.local", dhe është krijuar një regjistër A statik për t'u dhënë klientëve PPP:

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

Kapja e trafikut për klientët e pabesuar në 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

Në këtë rast, proxy ka dy funksione.

1. Të hapë lidhjet tcp me klientët;

2. Në rast autorizimi të suksesshëm, të ridrejtojë shfletuesin e klientit në një faqe ose imazh që njofton për kalimin me sukses të autentifikimit:

Konfigurimi i proxy-t
/ip proxy
vendos i aktivizuar=po port=3128
/ip proxy access
shto veprimin=ndalo të çaktivizuar=jo ridrejto në=gw.local/mikrotik_logo.png adresat-src=0.0.0.0/0

Do të rendis elementet e rëndësishme të konfigurimit:

  1. interface-list "2fa" — lista dinamike e ndërfaqeve të klientëve, trafik nga të cilat kërkon përpunim në kuadër të 2FA;
  2. address-list "2fa_jailed" — lista "greyscale" e IP-ve të klientëve VPN;
  3. address_list "2fa_approved" — lista "e bardhë" e IP-ve të klientëve VPN, të cilët kanë kaluar me sukses autentifikimin me dy Faktorë.
  4. rrjedha e firewall-it "input_2fa" — në të ndodhen kontrolli i paketave tcp për praninë e kodit të autorizimit dhe përputhja e IP-së së dërguesit të kodit me atë të kërkuar. Rregullat në këtë rrjedhë shtohen dhe hiqen dinamikisht.

Një diagram i thjeshtuar i përpunimit të paketave duket kështu:

Dybyfaktorike autentifikimi i përdoruesve VPN përmes MikroTik dhe SMS

Për të përfituar në kontrollin e trafikut nga klientët në listën "greyscale" që ende nuk kanë kaluar fazën e dytë të autentifikimit, në rrjedhën standard "input" është krijuar një rregull:

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

Tani do të fillojmë ta lidhim gjithë këtë pasuri me shërbimin PPP. MikroTik lejon përdorimin e skripteve në profile (ppp-profile) dhe t'i caktojë ato për ngjarjet e vendosjes dhe prishjes së lidhjes ppp. Cilësimet e ppp-profile mund të aplikohen si për serverin PPP në tërësi, ashtu edhe për përdorues të veçantë. Ndërsa profili i caktuar për përdoruesin ka përparësi duke mbuluar parametrat e profilit të zgjedhur për serverin në tërësi.

Si përfundim i këtij qasja, mund të krijojmë një profil të veçantë për autentifikimin me dy faktorë dhe ta caktojmë atë jo për të gjithë përdoruesit, por vetëm për ata që mendojmë se është e nevojshme. Kjo mund të jetë e rëndësishme në rastin kur shërbimet PPP përdoren jo vetëm për lidhje përfundimtare, por njëkohësisht edhe për ndërtimin e lidhjeve site-to-site.

Në profilin e ri të krijuar, përdorim shtimin dinamik të adresës dhe ndërfaqes së përdoruesit të lidhur në "listat gri" të adresave dhe ndërfaqeve:

winbox
Dybyfaktorike autentifikimi i përdoruesve VPN përmes MikroTik dhe SMS

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

Duhet të përdoren së bashku listat "address-list" dhe "interface-list" për të përcaktuar dhe kapur trafikun nga klientët VPN që nuk kanë kaluar autorizimin e dytë në zinxhirin dstnat (prerouting).

Kur përgatitja të përfundojë, do të shkruajmë një skenar që përgjigjet për gjenerimin automatik të kodit 2FA dhe rregullave të veçanta të firewall-it.

Dokumentacioni wiki.mikrotik.com në PPP-Profile na pasuron me informacione mbi variablat që lidhen me ngjarjet e lidhjes dhe ç’ lidhjes së klientit PPP "Ekzekuto skenarin në ngjarjen e lidhjes të përdoruesit. Këto janë variablat e disponueshëm që janë të aksesueshëm për skenarin e ngjarjes: përdoruesi, adresa-lokale, adresa-rrjete, caller-id, called-id, ndërfaqja". Disa prej tyre do na nevojiten shumë.

Kodi që përdoret në profil për ngjarjen e lidhjes PPP on-up

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

"adresa-lokale")
:log info (

"adresa-remote")
:log info (

"caller-id")
:log info (

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

"interface") name])
#Объявляем свои локальные переменные
:listë lokale "2fa_jailed"
:lokale viamodem false
:porti i modemit "usb2"
#ищем автоматически созданную запись в адрес-листе "2fa_jailed"
:numri i regjistrimit [ /ip fi address-list find address=(

"adresa-remote") 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
:telefon vlocal [ /ppp secret get [find name=$user] comment]

#Готовим тело сообщения. Если клиент подключается к VPN прямо с телефона ему достаточно
#будет перейти прямо по ссылке из полученного сообщения
:mesazhi lokal ("Kodi juaj: ".$comm1."n Ose hapni linkun http://gw.local/otp/".$comm1."/")

# Отправляем SMS по выбранному каналу - USB-модем или email-to-sms
nese $viamodem bëni={
/tool sms send phone-number=$vphone message=$msgboby port=$modemport }
ndryshe={
/tool e-mail send server=a.b.c.d from=admin@mydomain.example to=mail2sms@mcommunicator.ru subject="@".$vphone body=$msgboby }

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

"adresa-remote"))
/ip firewall layer7-protocol add name=(

"vcomment") comment=(

"adresa-remote") 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-address=(

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


Për ata që e duan të kopjojnë pa mend, këtu është paralajmërimi — kodi është marrë nga një version testues dhe mund të ketë gabime të vogla. Një person që kupton nuk do të ketë vështirësi në të kuptuarit e saktë ku ndodhen.

Kur përdoruesi lidhet, krijohet një ngjarje "On-Down" dhe thirret skenari përkatës me parametrat. Detyra e këtij skenari është të pastroni rregullat e firewall-it, të krijuara për përdoruesin që u largua.

Kodi që përdoret në profil për ngjarjen e lidhjes PPP on-down

:komenti lokal ("2fa_".(

"adresa-remote"))
/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]


Pas kësaj, mund të krijoni përdorues dhe t'u caktoni të gjithë ose disa prej tyre një profil me autentifikim me dy faktorë.

winbox
Dybyfaktorike autentifikimi i përdoruesve VPN përmes MikroTik dhe SMS

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

Si duket kjo nga ana e klientit.

Kur instalohet lidhja VPN, në telefonin/tabletin Android/iOS me kartë SIM vjen një SMS në formën e tillë:

SMS-ka
Dybyfaktorike autentifikimi i përdoruesve VPN përmes MikroTik dhe SMS

Nëse lidhja është vendosur drejtpërdrejt nga telefoni/tableti, mund të kaloni 2FA thjesht duke klikuar në lidhjen nga mesazhi. Kjo është e përshtatshme.

Nëse lidhja VPN vendoset me PC, atëherë përdoruesi do të ketë nevojë për një formë minimale për të futur fjalëkalimin. Një formë e vogël në format HTML i dërgohet përdoruesit gjatë konfigurimit të VPN. File mund të dërgohet edhe me email, për ta ruajtur atë dhe për të krijuar një shkurtore në një vend të përshtatshëm. Kështu duket:

Shkurtore në desktop
Dybyfaktorike autentifikimi i përdoruesve VPN përmes MikroTik dhe SMS

Përdoruesi klikon me miun mbi shkurtoren, hapet një formë e thjeshtë për të futur kodin, i cili do të vendosë kodin në URL-në e hapur:

Screenshot i formës
Dybyfaktorike autentifikimi i përdoruesve VPN përmes MikroTik dhe SMS

Forma është shumë primitive, e dhënë si shembull. Ata që dëshirojnë mund ta përmirësojnë për veten e tyre.

2fa_login_mini.html

<html>
<head> <title>Hyrja me SMS OTP</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head>
<body>
<form name="login" action="/sq/location.href=&#039;http://gw.local/otp/&#039;+document.getElementById(‘text&#039;).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="sq"/> 
<input type="button" value="Identifikohu" onclick="location.href='http://gw.local/otp/'+document.getElementById('text').value"/> 
</form>
</body>
</html>

Nëse autorizimi kalon me sukses, përdoruesi në shfletues do të shohë logon e MikroTik, që do të shërbejë si një sinjal për autentikimin e suksesshëm:

Dybyfaktorike autentifikimi i përdoruesve VPN përmes MikroTik dhe SMS

Dëgjoni, se imazhi kthehet nga serveri web i ndërtuar në MikroTik përmes WebProxy Deny Redirect.

Mendoj se imazhin mund ta personalizoni duke përdorur instrumentin "hotspot", duke ngarkuar variantin tuaj dhe caktuar URL-në Deny Redirect me WebProxy.

Kërkesë e madhe për ata që përpiqen të zëvendësojnë routerin e tyre të $500 me më të lirën "lojë" MikroTik për $20 — ju lutem, mos e bëni këtë. Pajisjet si "hAP Lite"/"hAP mini" (home access point) kanë CPU shumë të dobët (smips), dhe është shumë e mundur që nuk do të përballojnë ngarkesën në segmentin e biznesit.

Kujdes! Ky zgjidhje ka një të metë: gjatë lidhjes dhe shkëputjes së klientëve, ndodhin ndryshime në konfigurimin që routeri përpiqet t'i ruajë në memorien e tij të papërshkueshme nga energjia. Nëse ka shumë klientë dhe lidhje-shkëputje të shpeshta, kjo mund të çojë në degradata të memories së brendshme në router.

P.S.: metodat e dërgimit të kodit te klienti mund të zgjerohen dhe përmirësohen sa më shumë të keni mundësi në programim. Për shembull, mund të dërgoni mesazhe në telegram ose… sugjeroni mundësi!

Shpresoj që ky artikull të jetë i dobishëm dhe të ndihmojë në rritjen e sigurisë së rrjetit të biznesit të vogël dhe të mesëm.

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster