Autentifikimi me dy faktorë për përdoruesit e VPN përmes MikroTik dhe SMS

Përshëndetje kolegë! Sot, kur pasioni për "punën e largët" është qetësuar pak, shumica e administratorëve e kanë zgjidhur problemin e qasjes së largët të punonjësve në rrjetin korporativ, ka ardhur koha për të ndarë një punim timin të gjatë mbi rritjen e sigurisë së VPN. Në këtë artikull nuk do të flas për IPSec IKEv2 dhe xAuth, të cilat janë aktualisht të modës. Do të flas për ndërtimin e një sistemi të autentifikimit të dyfishtë (2FA) për përdoruesit e VPN, kur MikroTik shërben si server VPN. Konkretisht, kur përdoren protokollet "klasike" si PPP.

Autentifikimi me dy faktorë për përdoruesit e VPN përmes MikroTik dhe SMS

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

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

Schema e përgjithshme e mbrojtjes duket si në vijim:

  1. Adresa IP e brendshme e përdoruesit që është lidhur me sukses me serverin VPN, automatikisht kalon në listën "e grisë".
  2. Ngjarja e lidhjes krijon automatikisht një kod një herësh, i cili dërgohet përdoruesit në njërin 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 'Autentifikuesi', i cili pret marrjen e kodit një herësh.
  4. Pas paraqitjes së kodit, përdoruesit i hapet akses në burimet e brendshme të rrjetit.

E para Problemi më i vogël me të cilin u përballa ishte ruajtja e informacionit kontaktues të përdoruesit për t'i dërguar atij kodin 2FA. Duke qenë se nuk mund të krijoheshin fusha të rastësishme të dhënash që i përkasin përdoruesve në Mikrotik, u përdor fusha ekzistuese 'koment':

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

E dyta Problemi u bë më serioz - zgjedhja e rrugës dhe mënyrës së dërgimit të kodit. Në momentin aktual janë realizuar tri skema: a) SMS përmes një modem USB b) e-mail c) SMS përmes e-maili i disponueshëm për klientët korporativë të operatorit celular të kuq.

Po, skemat me SMS sjellin shpenzime. Por nëse e kupton thellë, 'siguria gjithmonë ka të bëjë me paratë' (c).
Skema me e-mail nuk më pëlqen. Jo sepse kërkon disponueshmërinë e serverit të postës për klientin e autentikuar — nuk është një problem të ndajmë trafikun. Megjithatë, nëse klienti i ruan me kujdes fjalëkalimet për VPN dhe për postën në shfletues dhe më pas humbet laptopin e tij, një haker do të fitojë qasje të plote në rrjetin e korporatës.

Pra, është vendosur — do të dërgojmë një kod të vetmë përmes mesazheve SMS.

E treta problemi ishte se ku dhe si të gjenerohet një kod pseudotakësor për 2FA në MikroTik. Në gjuhën e skriptimit RouterOS nuk ka funksion të barabartë me random() dhe më parë kam parë disa skripte që përdorin tirazha për të gjeneruar numra pseudotakësorë. Asnjëra prej tyre nuk më pëlqeu për arsye të ndryshme.

Në të vërtetë, gjeneratori i sekuencave pseudotakësore në MikroTik ESH TEK! Ai është fshehur nga një vështrim të cekët në kontekstin e /certificates scep-server. Metoda e parë të marrësh një fjalëkalim të vetmë është lehtë dhe thjeshtë — me komandën /certificates scep-server otp generate. Nëse kryeni një operacion të thjeshtë për të caktuar një variabël, do të marrim një vlerë të tipit array, e cila mund të përdoret më tej në skripte.

Metoda e dytë marrjen e një kode të përkohshëm që gjithashtu është e lehtë për t'u aplikuar - përdorimi i një shërbimi të jashtëm random.org për të gjeneruar sekuencën e dëshiruar të numrave pseudo-rastësorë. Këtu është një shembull i thjeshtë konsolë 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ë kërkohet mbrojtja e simboleve speciale) merr një varg prej gjashtë simboleve-numra në variablën $rnd1. Komanda tjetër "put" thjesht shfaq variablin në konsolën MikroTik.

Problemi i katërt, të cilin duhej ta zgjidhja menjëherë - ë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ë autentifikimit.

Autentifikimi me dy faktorë për përdoruesit e VPN përmes MikroTik dhe SMS

Në routerin MikroTik duhet të ekzistojë një shërbim që është në gjendje të pranojë kodin dhe ta përputhë atë me klientin e caktuar. Në rast se kodi i ofruar përputhet me atë të pritur, adresa e klientit duhet të hyjë në një "listë të bardhë", adresat në të cilën i është lejuar të hyjnë në rrjetin e brendshëm të kompanisë.

Për shkak të zgjedhjes së kufizuar të shërbimeve, u mor vendimi të pranojmë kodet përmes http me anë të webproxy të integruar në mikrotik. Dhe pasi firewalli mund të punojë me lista dinamike të IP adresave, kërkimi i kodit, përputhja e tij me IP-në e klientit dhe futja në listën e "bardhë" realizohet posaçërisht nga firewalli përmes Layer7 regexp. Ruterit i është caktuar një emër kushtor DNS "gw.local", mbi të është krijuar një regjistrim statik A për dhënien e PPP-klientëve:

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

Kapja e trafikut në proxy nga klientët e pa verifikuar:
/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ë lidhje tcp me klientët;

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

Proxy config
/ip proxy
vendos enabled=yes port=3128
/ip proxy access
shto veprimin=ndohet i ndaluar disabled=no ridrepto në gw.local./mikrotik_logo.png src-address=0.0.0.0/0

Do të përmend disa elementë të rëndësishëm të konfigurimit:

  1. interface-list "2fa" — lista dinamike e interfazave të klientëve, trafik nga të cilat kërkon përpunim në kuadër të 2FA;
  2. address-list "2fa_jailed" — lista "e gjallë" e IP adresave tunel të klientëve VPN;
  3. address_list "2fa_approved" — lista "e bardhë" e IP adresave tunel të klientëve VPN, që kanë kaluar me sukses autentifikimin me dy faktorë.
  4. zinia e firewall-it "input_2fa" — në të ndodh kontrolli i pacjeve tcp për kodin e autorizimit dhe përputhjen e IP-së së dërguesit të kodit me atë të kërkuar. Rregullat në zinë shtohen dhe hiqen dinamikisht.

Një diagram i thjeshtë i përpunimit të pacjeve duket kështu:

Autentifikimi me dy faktorë për përdoruesit e VPN përmes MikroTik dhe SMS

Për t'u përfshirë në kontrollin nga Layer7 për trafikun e klientëve nga lista "e gjelbër" që ende nuk kanë kaluar fazën e dytë të autentikimit, në zininë standarde "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ë të lidhim të gjitha këto pasuri me shërbimin PPP. MikroTik lejon përdorimin e skripteve në profile (ppp-profile) dhe t'i caktojë ato për ngjarje të vendosjes dhe ndërprerjes së lidhjes ppp. Cilësimet e ppp-profile mund të aplikohen si për serverin PPP në përgjithësi, ashtu edhe për përdorues të veçantë. Në këtë rast, profili i caktuar për përdoruesin ka prioritet duke e mbuluar me parametrat e tij parametrat e profilit të caktuar për serverin në përgjithësi.

Si pasqyra e tillë, ne mund të krijojmë një profil të veçantë për autentifikimin me dy faktorë dhe ta caktuar atë jo për të gjithë përdoruesit, por vetëm për ata që ne e konsiderojmë të nevojshëm. Kjo mund të jetë relevante në rast se shërbimet PPP përdoren jo vetëm për lidhjen e përdoruesve të fundit, por njëkohësisht gjithashtu për ndërtimin e lidhjeve site-to-site.

Në profilin e ri të krijuar, ne përdorim shtimin dinamik të adresave dhe interfecave të përdoruesit të lidhur në listat e "listave të mëtutjeshme" të adresave dhe interfecave:

winbox
Autentifikimi me dy faktorë për përdoruesit e 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

Përdorimi i përbashkët i listave "address-list" dhe "interface-list" është i nevojshëm për të identifikuar dhe kapur trafikun nga klientët VPN që nuk kanë kaluar verifikimin e dytë në zinxhirin dstnat (prerouting).

Kur përgatitja përfundon, zinxhirët e tjerë të firewall-it dhe profili janë krijuar, do të shkruajmë një skript që merret me autogjenerimin e kodit 2FA dhe rregullave të veçanta të firewall-it.

Dokumentacioni wiki.mikrotik.com në PPP-Profile na pasuron me informacion mbi variablat e lidhura me ngjarjet e lidhjes-çflakjes së klientit PPP «Ekzekuto skriptin në ngjarjen e login-it të përdoruesit. Këto janë variablat e disponueshme që janë të aksesueshëm për skriptin e ngjarjes: përdorues, adresa-lokale, adresa-remote, identifikimi-i-thirrësit, identifikimi-i-thirrur, ndërfaqja». Disa prej tyre na duhen shumë.

Kodi i përdorur në profil për ngjarjen e lidhjes PPP on-up

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

"adresse-lokale")
:informacion log (

"adresse-e-remote")
:informacion log (

"id-caller")
:informacion log (

"id-i-quarqur")
:informacion log ([/int pptp-server merr (

"interface") emri])
#Объявляем свои локальные переменные
:lista lokale "2fa_jailed"
:lokal viamodem false
:lokal modemport "usb2"
#ищем автоматически созданную запись в адрес-листе "2fa_jailed"
:lokal recnum1 [/ip fi lista-adresash gjej adresë=(

"adresse-e-remote") lista=$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
:lokal vphone [/ppp sekret merr [gjej emrin=$user] koment]

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

# Отправляем SMS по выбранному каналу - USB-модем или email-to-sms
nëse $viamodem bëj={
/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
lokal vregexp ("otp\/".$comm1)
:lokal vcomment ("2fa_".

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

"vcomment") koment=(

"adresse-e-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-adresë=(

"adresse-e-remote") dst-limi=1,1,src-adresë/1m40s


Vëmendje për ata që e kopjojnë pa menduar – kodi është marrë nga versioni provues dhe mund të ketë disa gabime të vogla. Të kuptosh se ku janë saktësisht, nuk është problem për një person të kuptuar.

Kur përdoruesi shk disconnectohet, gjenerohet ngjarja «On-Down» dhe thirret skripti i duhur me parametrat. Detyra e këtij skripti është të pastrojë rregullat e firewall-it që janë krijuar për përdoruesin e shkëputur.

Kodi i përdorur në profil për ngjarjen e lidhjes PPP on-down

:lokal vcomment ("2fa_".

"adresse-e-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 atyre ose disa prej tyre një profil me autentifikim me dy faktorë.

winbox
Autentifikimi me dy faktorë për përdoruesit e VPN përmes MikroTik dhe SMS

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

Si duket nga ana e klientit.

Gjatë instalimit të lidhjes VPN, në telefon/tablet me Android/iOS me kartë SIM vjen një SMS i tillë:

SMS
Autentifikimi me dy faktorë për përdoruesit e VPN përmes MikroTik dhe SMS

Nëse lidhja është vendosur direkt 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, përdoruesi do të ketë nevojë për një formë minimale për futjen e fjalëkalimit. Një formë e vogël në formatin HTML i dërgohet përdoruesit gjatë konfigurimit të VPN. Skedari mund të dërgohet madje edhe me email, në mënyrë që përdoruesi ta ruajë atë dhe të krijojë një shkurtesë në një vend të përshtatshëm. Kështu duket:

Shkurtesa në desktop
Autentifikimi me dy faktorë për përdoruesit e VPN përmes MikroTik dhe SMS

Përdoruesi klikoni mbi shkurtesën, hapet një formë e thjeshtë për futjen e kodit, e cila do të insertojë kodin në URL-në e hapur:

Screenshot i formës
Autentifikimi me dy faktorë për përdoruesit e VPN përmes MikroTik dhe SMS

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

2fa_login_mini.html

<html>
<head> <title>Kyçja 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="Hÿnë" onclick="location.href='http://gw.local/otp/'+document.getElementById('text').value"/> 
</form>
</body>
</html>

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

Autentifikimi me dy faktorë për përdoruesit e VPN përmes MikroTik dhe SMS

Vërej se imazhi kthehet nga serveri web i integruar MikroTik nëpërmjet WebProxy Deny Redirect.

Mendoj se imazhi mund të personalizohet, duke përdorur mjetin "hotspot", duke ngarkuar variantin tuaj dhe duke caktuar URL-në Deny Redirect me WebProxy.

Një lutje e madhe për ata që përpiqen të zëvendësojnë routerin prej $500 me mikrotikun më të lirë 'lojërash' prej $20 — mos e bëni këtë. Pajisjet si 'hAP Lite'/'hAP mini' (pika e qasjes në shtëpi) kanë një CPU shumë të dobët (smips) dhe është mjaft e mundshme që të mos përballojnë ngarkesën në segmentin e biznesit.

Kujdes! Ky zgjidhje ka një mangësi: kur klientët lidhen ose shkëputen, ndodhin ndryshime në konfigurim, e cila routeri përpiqet ta ruajë në memorien e tij të energjisë së pavarur. Me një numër të madh klientësh dhe shpesh lidhje-shkëputje, kjo mund të çojë në degradimin e memorjes së brendshme në router.

P.S.: metodat e dorëzimit të kodit te klienti mund të zgjerohen dhe plotësohen sa do t'ju lejojnë aftësitë tuaja në programim. Për shembull, mund të dërgoni mesazhe në telegram ose… propozuar variante!

Shpresoj që artikulli t'ju jetë i dobishëm dhe t'ju ndihmojë të bëni rrjetet e biznesit të vogël dhe të mesëm edhe më të sigurta.

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster