Autentifikimi me dy faktorë të përdoruesve të VPN përmes MikroTik dhe SMS

Përshëndetje kolegë! Sot, kur pasioni rreth punës në distancë është ulur pak, shumica e administratorëve kanë pushtuar detyrën e aksesit në distancë të punonjësve në rrjetin e korporatës, është koha të ndaj përvojën time të gjatë në përmirësimin e sigurisë VPN. Ky artikull nuk do të mbulojë IPSec IKEv2 dhe xAuth aktualisht në modë. Bëhet fjalë për ndërtimin e një sistemi vërtetimi me dy faktorë (2FA) Përdoruesit e VPN kur MikroTik vepron si një server VPN. Domethënë, kur përdoren protokolle "klasike" si PPP.

Autentifikimi me dy faktorë të përdoruesve të VPN përmes MikroTik dhe SMS

Sot do t'ju tregoj se si të mbroni MikroTik PPP-VPN edhe nëse llogaria juaj e përdoruesit është rrëmbyer. Kur kjo skemë iu prezantua një prej klientëve të mi, ai e përshkroi shkurtimisht si "po, tani është njësoj si në një bankë!"

Metoda nuk përdor shërbime të autentifikimit të jashtëm. Detyrat kryhen nga brenda nga vetë ruteri. Nuk ka kosto për klientin e lidhur. Metoda funksionon si për klientët e PC ashtu edhe për pajisjet mobile.

Skema e përgjithshme e mbrojtjes është si më poshtë:

  1. Adresa e brendshme IP e një përdoruesi që është lidhur me sukses me serverin VPN shtohet automatikisht në listën gri.
  2. Ngjarja e lidhjes gjeneron automatikisht një kod një herë që i dërgohet përdoruesit duke përdorur një nga metodat e disponueshme.
  3. Adresat në këtë listë kanë qasje të kufizuar në burimet e rrjetit lokal, me përjashtim të shërbimit "authenticator", i cili pret të marrë një kod fjalëkalimi një herë.
  4. Pas paraqitjes së kodit, përdoruesi ka akses në burimet e brendshme të rrjetit.

Первая problemi më i vogël me të cilin duhej të përballeshim ishte ruajtja e informacionit të kontaktit rreth përdoruesit për t'i dërguar atij një kod 2FA. Meqenëse është e pamundur të krijohen fusha arbitrare të të dhënave që korrespondojnë me përdoruesit në Mikrotik, u përdor fusha ekzistuese "komenti":

/ppp secrets add name=Petrov password=4M@ngr! koment = "89876543210"

Dytë problemi doli të ishte më serioz - zgjedhja e rrugës dhe metodës së dërgimit të kodit. Aktualisht janë implementuar tre skema: a) SMS përmes modemit USB b) e-mail c) SMS përmes e-mail të disponueshëm për klientët korporata të operatorit celular red.

Po, skemat SMS shkaktojnë kosto. Por nëse e shikoni, "siguria ka të bëjë gjithmonë me paratë" (c).
Unë personalisht nuk më pëlqen skema e emailit. Jo sepse kërkon që serveri i postës të jetë i disponueshëm për klientin që vërtetohet - nuk është problem të ndash trafikun. Sidoqoftë, nëse klienti ruajti pa kujdes fjalëkalimet si për VPN ashtu edhe për emailin në shfletues, dhe më pas humbi laptopin e tij, sulmuesi do të fitojë akses të plotë në rrjetin e korporatës prej tij.

Pra, është vendosur - ne dorëzojmë një kod një herë duke përdorur mesazhe SMS.

Третья problemi ishte se ku dhe si të gjeneroni kodin pseudo të rastësishëm për 2FA në MikroTik. Nuk ka asnjë ekuivalent me funksionin random() në gjuhën e skriptimit RouterOS, dhe unë kam parë disa gjeneratorë të numrave pseudo të rastësishëm të skriptuar më parë. Nuk më pëlqeu asnjëri prej tyre për arsye të ndryshme.

Në fakt, ekziston një gjenerator i sekuencave pseudo të rastësishme në MikroTik! Ai fshihet nga një vështrim sipërfaqësor në kontekstin e /certificates scep-server. Mënyra e parë marrja e një fjalëkalimi një herë është e lehtë dhe e thjeshtë - me komandën /certifikatat scep-server otp gjenerojnë. Nëse kryejmë një operacion të thjeshtë të caktimit të ndryshoreve, do të marrim një vlerë të grupit që mund të përdoret më vonë në skriptet.

Mënyra e dytë marrja e një fjalëkalimi një herë, i cili është gjithashtu i lehtë për t'u përdorur - duke përdorur një shërbim të jashtëm random.org për të gjeneruar llojin e dëshiruar të sekuencës së numrave pseudorandom. Këtu është një e thjeshtuar konsol shembull i marrjes së të dhënave në një variabël:

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

Një kërkesë e formatuar për konsolën (në trupin e skriptit do të kërkohet ikja e karaktereve speciale) merr një varg prej gjashtë karakteresh numerike në ndryshoren $rnd1. Komanda e mëposhtme "put" thjesht shfaq variablin në tastierën MikroTik.

Problemi i katërt e cila duhej të zgjidhej shpejt ishte se si dhe ku klienti i lidhur do të transmetonte kodin e tij një herë në fazën e dytë të vërtetimit.

Autentifikimi me dy faktorë të përdoruesve të VPN përmes MikroTik dhe SMS

Duhet të ketë një shërbim në ruterin MikroTik që mund të pranojë kodin dhe ta përputhet me një klient specifik. Nëse kodi i dhënë përputhet me atë të pritur, adresa e klientit duhet të përfshihet në një listë të caktuar "të bardhë", adresa nga e cila lejohet qasja në rrjetin e brendshëm të kompanisë.

Për shkak të zgjedhjes së kufizuar të shërbimeve, u vendos që të pranohen kodet nëpërmjet http duke përdorur webproxy-in e integruar në Mikrotik. Dhe meqenëse muri i zjarrit mund të punojë me lista dinamike të adresave IP, është muri i zjarrit ai që kërkon kodin, e përputh atë me IP-në e klientit dhe e shton atë në listën "e bardhë" duke përdorur Layer7 regexp. Vetë ruterit i është caktuar një emër i kushtëzuar DNS "gw.local" dhe në të është krijuar një rekord statik për t'u lëshuar klientëve PPP:

DNS
/ip dns static add name=gw.adresa lokale=172.31.1.1

Kapja e trafikut nga klientët e paverifikuar me përfaqësues:
/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, përfaqësuesi ka dy funksione.

1. Hapni lidhjet TCP me klientët;

2. Në rast të autorizimit të suksesshëm, ridrejtoni shfletuesin e klientit në një faqe ose imazh që njofton për vërtetimin e suksesshëm:

Konfigurimi i përfaqësuesit
/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

Unë do të listoj elementët e rëndësishëm të konfigurimit:

  1. ndërfaqe-lista "2fa" - një listë dinamike e ndërfaqeve të klientit, trafiku nga i cili kërkon përpunim brenda kornizës së 2FA;
  2. Lista e adresave “2fa_jailed” — lista “gri” e adresave IP të tunelit të klientëve VPN;
  3. adresa_lista "2fa_approved" - një listë e bardhë e adresave IP të tunelit të klientëve VPN që kanë kaluar me sukses vërtetimin me dy faktorë.
  4. Zinxhiri i murit të zjarrit "input_2fa" - kontrollon paketat TCP për praninë e një kodi autorizimi dhe nëse adresa IP e dërguesit të kodit përputhet me atë të kërkuar. Rregullat në zinxhir shtohen dhe hiqen në mënyrë dinamike.

Një diagram i thjeshtuar i rrjedhës së përpunimit të paketave duket si ky:

Autentifikimi me dy faktorë të përdoruesve të VPN përmes MikroTik dhe SMS

Për të përfshirë trafikun nga klientët në listën "gri" të cilët nuk e kanë kaluar ende fazën e dytë të vërtetimit në skanimin e Layer7, është krijuar një rregull në zinxhirin standard "input":

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

Tani le të fillojmë të lidhim gjithë këtë pasuri me shërbimin PPP. MikroTik ju lejon të përdorni skriptet në profile (ppp-profile) dhe t'i caktoni ato në ngjarjet e konfigurimit dhe prishjes së një lidhjeje ppp. Cilësimet e profilit ppp mund të aplikohen si për serverin PPP në tërësi ashtu edhe për përdoruesit individualë. Në këtë rast, profili i caktuar për përdoruesit ka përparësi, duke tejkaluar me parametrat e tij të specifikuar parametrat e profilit të zgjedhur për serverin në tërësi.

Si rezultat i kësaj qasjeje, ne mund të krijojmë një profil të veçantë për vërtetimin me dy faktorë dhe t'ua caktojmë atë jo të gjithë përdoruesve, por vetëm atyre që ne i konsiderojmë të nevojshëm për ta bërë këtë. Kjo mund të jetë e rëndësishme nëse përdorni shërbimet PPP jo vetëm për të lidhur përdoruesit fundorë, por në të njëjtën kohë për të krijuar lidhje nga faqe në vend.

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

winbox
Autentifikimi me dy faktorë të përdoruesve të VPN përmes MikroTik dhe SMS

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

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

Kur të përfundojë përgatitja, të krijohen zinxhirë shtesë të murit të zjarrit dhe një profil, ne do të shkruajmë një skript përgjegjës për gjenerimin automatik të kodit 2FA dhe rregullat individuale të murit të zjarrit.

Dokumentacioni wiki.mikrotik.com në PPP-Profile na pasuron me informacione në lidhje me variablat që lidhen me lidhjen e klientit PPP dhe ngjarjet e shkëputjes "Ekzekutoni skriptin në ngjarjen e hyrjes së përdoruesit. Këto janë variabla të disponueshme që janë të aksesueshme për skriptin e ngjarjes: përdoruesi, adresa lokale, adresa në distancë, ID-ja e thirrësit, ID-ja e thirrur, ndërfaqja". Disa prej tyre do të jenë shumë të dobishme për ne.

Kodi i përdorur në profil për ngjarjen e lidhjes në lidhje me PPP

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

Ju paralajmëroj veçanërisht për ata që duan të kopjojnë-ngjisin pa mendje - kodi është marrë nga një version testues dhe mund të përmbajë gabime të vogla. Nuk do të jetë e vështirë për një person të kuptueshëm të kuptojë se ku saktësisht.

Kur një përdorues shkëputet, krijohet një ngjarje "On-Down" dhe thirret skripti përkatës me parametra. Qëllimi i këtij skripti është të pastrojë rregullat e murit të zjarrit të krijuara për përdoruesin e shkëputur.

Kodi i përdorur në profil për ngjarjen e lidhjes PPP poshtë

: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]
Më pas mund të krijoni përdorues dhe t'i caktoni disa ose të gjithë në një profil vërtetimi me dy faktorë.

winbox
Autentifikimi me dy faktorë të përdoruesve të VPN përmes MikroTik dhe SMS

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

Si duket nga ana e klientit.

Kur krijoni një lidhje VPN, një SMS përafërsisht si kjo dërgohet në telefonin/tabletin tuaj Android/iOS me një kartë SIM:

SMS
Autentifikimi me dy faktorë të përdoruesve të VPN përmes MikroTik dhe SMS

Nëse lidhja është krijuar direkt nga telefoni/tableti juaj, atëherë mund të kaloni përmes 2FA thjesht duke klikuar në lidhjen nga mesazhi. Është komode.

Nëse krijohet një lidhje VPN nga një PC, atëherë përdoruesi do t'i kërkohet të vendosë një formë minimale të fjalëkalimit. Një formë e vogël në formën e një skedari HTML i dërgohet përdoruesit kur konfiguron VPN-në. Skedari madje mund të dërgohet me postë në mënyrë që përdoruesi ta ruajë atë dhe të krijojë një shkurtore në një vend të përshtatshëm. Duket diçka si kjo:

Etiketa në tavolinë
Autentifikimi me dy faktorë të përdoruesve të VPN përmes MikroTik dhe SMS

Përdoruesi klikon në shkurtore, hapet një formë e thjeshtë e hyrjes së kodit, e cila do të futë kodin në URL-në e hapur:

Ekrani i formës
Autentifikimi me dy faktorë të përdoruesve të VPN përmes MikroTik dhe SMS

Forma është më primitive, e dhënë si shembull. Ata që dëshirojnë mund ta modifikojnë për t'iu përshtatur vetes.

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>

Nëse autorizimi është i suksesshëm, përdoruesi do të shohë logon MikroTik në shfletues, i cili duhet të shërbejë si një sinjal i vërtetimit të suksesshëm:

Autentifikimi me dy faktorë të përdoruesve të VPN përmes MikroTik dhe SMS

Vini re se imazhi kthehet nga serveri i integruar i uebit MikroTik duke përdorur WebProxy Deny Redirect.

Unë besoj se imazhi mund të personalizohet duke përdorur veglën "hotspot", duke ngarkuar versionin tuaj atje dhe duke vendosur një URL Redirect Redirect në të me WebProxy.

Një kërkesë e madhe për ata që po përpiqen të blejnë "lodrën" më të lirë Mikrotik për 20 dollarë dhe ta zëvendësojnë atë me një ruter prej 500 dollarësh - mos e bëni këtë. Pajisjet si "hAP Lite"/"hAP mini" (pika e hyrjes në shtëpi) kanë një CPU shumë të dobët (smips) dhe ka të ngjarë të mos përballojnë ngarkesën në segmentin e biznesit.

Warning! Kjo zgjidhje ka një pengesë: kur klientët lidhen ose shkëputen, ndodhin ndryshime të konfigurimit, të cilat ruteri përpiqet t'i ruajë në memorien e tij jo të paqëndrueshme. Me një numër të madh klientësh dhe lidhje dhe shkëputje të shpeshta, kjo mund të çojë në degradimin e ruajtjes së brendshme në ruter.

PS: metodat për dërgimin e kodit te klienti mund të zgjerohen dhe plotësohen për sa i përket aftësive tuaja programuese. Për shembull, mund të dërgoni mesazhe në telegram ose... sugjeroni opsione!

Shpresoj se ky artikull do të jetë i dobishëm për ju dhe do t'ju ndihmojë t'i bëni rrjetet e biznesit të vogël dhe të mesëm pak më të sigurt.

Burimi: www.habr.com