Autentificare în doi factori a utilizatorilor VPN prin MikroTik și SMS

Salut colegi! Astăzi, când intensitatea pasiunilor legate de „munca la distanță” a scăzut puțin, majoritatea administratorilor au câștigat sarcina de a accesa de la distanță angajații la rețeaua corporativă, este timpul să împărtășesc experiența mea de lungă durată în îmbunătățirea securității VPN. Acest articol nu va fi la modă acum IPSec IKEv2 și xAuth. Este vorba despre construirea unui sistem. autentificare cu doi factori (2FA) Utilizatorii VPN atunci când MikroTik acționează ca un server VPN. Și anume atunci când sunt folosite protocoale „clasice” precum PPP.

Autentificare în doi factori a utilizatorilor VPN prin MikroTik și SMS

Astăzi vă voi spune cum să protejați MikroTik PPP-VPN chiar și în cazul „deturării” contului de utilizator. Când această schemă a fost prezentată unuia dintre clienții mei, el a descris-o pe scurt ca „ei bine, acum este la fel ca într-o bancă!”.

Metoda nu folosește servicii de autentificare externe. Sarcinile sunt efectuate intern de către routerul însuși. Niciun cost pentru clientul care se conectează. Metoda funcționează atât pentru clienții PC, cât și pentru dispozitivele mobile.

Schema generală de protecție este următoarea:

  1. Adresa IP internă a unui utilizator care s-a conectat cu succes la serverul VPN este automat pe lista gri.
  2. Evenimentul de conectare generează automat un cod unic care este trimis utilizatorului folosind una dintre metodele disponibile.
  3. Adresele din această listă au acces limitat la resursele rețelei locale, cu excepția serviciului de „autentificare”, care așteaptă să primească o parolă unică.
  4. După prezentarea codului, utilizatorul are acces la resursele interne ale rețelei.

în primul rând cea mai mică problemă cu care a trebuit să mă confrunt a fost stocarea informațiilor de contact despre utilizator pentru a-i trimite codul 2FA. Deoarece este imposibil să se creeze câmpuri de date arbitrare corespunzătoare utilizatorilor în Mikrotik, a fost folosit câmpul „comentarii” existent:

/ppp secrets add name=parola Petrov=4M@ngr! comment="89876543210"

Al doilea problema s-a dovedit a fi mai gravă - alegerea căii și a metodei de livrare a codului. În prezent sunt implementate trei scheme: a) SMS prin modem USB b) e-mail c) SMS prin e-mail disponibil pentru clienții corporativi ai operatorului de telefonie mobilă roșie.

Da, schemele de SMS aduc costuri. Dar dacă te uiți, „securitatea este întotdeauna despre bani” (c).
Mie personal nu-mi place schema cu e-mail. Nu pentru că necesită ca serverul de e-mail să fie disponibil pentru clientul care este autentificat - nu este o problemă să împărțiți traficul. Cu toate acestea, dacă un client a salvat cu neglijență atât parolele vpn, cât și parolele de e-mail într-un browser și apoi și-ar pierde laptopul, atacatorul ar obține acces deplin la rețeaua corporativă de pe acesta.

Deci, s-a decis - livrăm un cod unic folosind mesaje SMS.

Al treilea Problema era unde cum se generează un cod pseudo-aleatoriu pentru 2FA în MikroTik. Nu există un analog al funcției random() în limbajul de scripting RouterOS și am mai văzut mai multe generatoare de numere pseudo-aleatoare cu scripturi Crutch. Nu mi-a plăcut niciunul din diverse motive.

De fapt, există un generator de secvențe pseudo-aleatoare în MikroTik! Este ascuns unei priviri superficiale în contextul /certificatelor scep-server. Prima cale obținerea unei parole unice este ușor și simplu - cu comanda /certificates scep-server otp generate. Dacă efectuăm o operație simplă de atribuire a variabilelor, vom obține o valoare de matrice care poate fi folosită mai târziu în scripturi.

A doua cale obținerea unei parole unice care este, de asemenea, ușor de aplicat - folosind un serviciu extern random.org pentru a genera tipul dorit de secvență de numere pseudoaleatoare. Iată un simplificat cantilevered exemplu de introducere a datelor într-o variabilă:

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

O solicitare formatată pentru consolă (va fi necesară evadarea caracterelor speciale în corpul scriptului) primește un șir de șase cifre în variabila $rnd1. Următoarea comandă „put” afișează pur și simplu variabila în consola MikroTik.

A patra problemă care trebuia rezolvat rapid - așa și unde clientul conectat își va transfera codul unic în a doua etapă de autentificare.

Autentificare în doi factori a utilizatorilor VPN prin MikroTik și SMS

Trebuie să existe un serviciu pe routerul MikroTik care să accepte codul și să-l potrivească cu un anumit client. Dacă codul furnizat se potrivește cu cel așteptat, adresa clientului ar trebui inclusă într-o anumită listă „albă”, adrese de la care este permis accesul la rețeaua internă a companiei.

Din cauza alegerii slabe a serviciilor, s-a decis să se accepte coduri prin http folosind webproxy-ul încorporat în Mikrotik. Și, deoarece firewall-ul poate funcționa cu liste dinamice de adrese IP, firewall-ul este cel care efectuează căutarea codului, potrivindu-l cu IP-ul clientului și adăugându-l la lista „albă” folosind expresia regulată Layer7. Router-ului însuși i s-a atribuit un nume DNS condiționat „gw.local”, a fost creată o înregistrare A statică pentru emiterea clienților PPP:

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

Captarea traficului clienților neverificați pe 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 acest caz, proxy-ul are două funcții.

1. Deschideți conexiuni tcp cu clienții;

2. În caz de autorizare reușită, redirecționați browserul client către o pagină sau o imagine care notifică despre autentificarea reușită:

Configurare proxy
/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

Voi enumera elementele importante de configurare:

  1. interface-list „2fa” - o listă dinamică de interfețe client, traficul din care necesită procesare în 2FA;
  2. list-adresă „2fa_jailed” - listă „gri” a adreselor IP de tunel ale clienților VPN;
  3. address_list „2fa_approved” - lista „albă” de adrese IP de tunel ale clienților VPN care au trecut cu succes autentificarea cu doi factori.
  4. lanțul firewall „input_2fa” - verifică pachetele tcp pentru prezența unui cod de autorizare și potrivește adresa IP a expeditorului codului cu cea necesară. Regulile din lanț sunt adăugate și eliminate dinamic.

O diagramă simplificată a procesării pachetelor arată astfel:

Autentificare în doi factori a utilizatorilor VPN prin MikroTik și SMS

Pentru a intra în verificarea Layer7 a traficului de la clienții din lista „gri” care nu au trecut încă de a doua etapă de autentificare, a fost creată o regulă în lanțul standard de „input”:

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

Acum să începem să fixăm toată această bogăție serviciului PPP. MikroTik vă permite să utilizați scripturi în profiluri (ppp-profile) și să le atribuiți evenimentelor de stabilire și întrerupere a unei conexiuni ppp. Setările de profil ppp pot fi aplicate serverului PPP ca întreg sau utilizatorilor individuali. În același timp, profilul atribuit utilizatorului are prioritate, suprascriind parametrii profilului selectat pentru server în ansamblu cu parametrii acestuia specificați.

Ca urmare a acestei abordări, putem crea un profil special pentru autentificarea cu doi factori și să-l atribuim nu tuturor utilizatorilor, ci doar celor care consideră că este necesar să facă acest lucru. Acest lucru poate fi relevant dacă utilizați serviciile PPP nu numai pentru a conecta utilizatorii finali, ci, în același timp, pentru a construi conexiuni de la site la site.

În profilul special nou creat, folosim adăugarea dinamică a adresei și interfeței utilizatorului conectat la listele „gri” de adrese și interfețe:

winbox
Autentificare în doi factori a utilizatorilor VPN prin MikroTik și SMS

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

Este necesar să folosiți atât listele „listă de adrese”, cât și listele „listă de interfețe” pentru a detecta și capta traficul de la clienții VPN non-secundari din lanțul dstnat (preroutare).

Când pregătirea este finalizată, sunt create lanțuri de firewall suplimentare și un profil, vom scrie un script responsabil pentru generarea automată a codului 2FA și a regulilor individuale de firewall.

Documentație wiki.mikrotik.com pe PPP-Profile ne îmbogățește cu informații despre variabilele asociate cu evenimentele de conectare-deconectare client PPP „Executați scriptul la evenimentul de conectare al utilizatorului. Acestea sunt variabile disponibile care sunt accesibile pentru scriptul evenimentului: utilizator, adresă locală, adresă la distanță, ID apelant, ID apelat, interfață". Unele dintre ele ne sunt foarte utile.

Codul utilizat în profil pentru evenimentul de conectare PPP on-up

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

Mai ales pentru cei cărora le place să copieze și lipiți fără minte, vă avertizez - codul este preluat din versiunea de testare și poate conține greșeli minore de scriere. Nu va fi dificil pentru o persoană înțelegătoare să-și dea seama exact unde.

Când un utilizator se deconectează, este generat un eveniment „On-Down” și este apelat scriptul corespunzător cu parametri. Scopul acestui script este de a curăța regulile firewall create pentru utilizatorul deconectat.

Cod folosit în profil pentru evenimentul de conectare PPP on-down

: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]
Apoi puteți crea utilizatori și aloca pe toți sau pe o parte dintre aceștia unui profil de autentificare cu doi factori.

winbox
Autentificare în doi factori a utilizatorilor VPN prin MikroTik și SMS

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

Cum arată pe partea clientului.

Când se stabilește o conexiune VPN, un telefon/tabletă Android/iOS cu o cartelă SIM primește un SMS ca acesta:

SMS
Autentificare în doi factori a utilizatorilor VPN prin MikroTik și SMS

Dacă conexiunea se stabilește direct de pe telefon/tabletă, atunci poți trece prin 2FA pur și simplu făcând clic pe linkul din mesaj. Este confortabil.

Dacă conexiunea VPN este stabilită de pe un computer, atunci utilizatorului i se va cere să introducă un formular de parolă minimă. Un mic formular sub forma unui fișier HTML este oferit utilizatorului la configurarea VPN-ului. Fișierul poate fi trimis chiar și prin poștă, astfel încât utilizatorul să îl salveze și să creeze o comandă rapidă într-un loc convenabil. Arata cam asa:

Etichetă pe masă
Autentificare în doi factori a utilizatorilor VPN prin MikroTik și SMS

Utilizatorul face clic pe comanda rapidă, se deschide un formular simplu de introducere a codului, care va lipi codul în adresa URL deschisă:

Formular de ecran
Autentificare în doi factori a utilizatorilor VPN prin MikroTik și SMS

Cea mai primitivă formă este dată ca exemplu. Cei care doresc se pot modifica singuri.

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>

Dacă autorizarea a avut succes, utilizatorul va vedea sigla MikroTik în browser, ceea ce ar trebui să semnaleze autentificarea reușită:

Autentificare în doi factori a utilizatorilor VPN prin MikroTik și SMS

Rețineți că imaginea este returnată de la serverul web MikroTik încorporat folosind WebProxy Deny Redirect.

Presupun că imaginea poate fi personalizată folosind instrumentul „hotspot”, încărcându-vă propria versiune acolo și setând adresa URL de redirecționare Deny cu WebProxy.

O cerere mare pentru cei care încearcă să cumpere cea mai ieftină „jucărie” Mikrotik pentru 20 de dolari și să înlocuiască un router de 500 de dolari cu el - nu face asta. Dispozitive precum „hAP Lite” / „hAP mini” (punct de acces acasă) au un procesor foarte slab (smips) și este probabil să nu facă față încărcăturii din segmentul de afaceri.

Atenție! Această soluție are un dezavantaj: atunci când clienții se conectează sau se deconectează, apar modificări de configurare, pe care routerul încearcă să le salveze în memoria sa nevolatilă. Cu un număr mare de clienți și conexiuni și deconectări frecvente, acest lucru poate duce la degradarea stocării interne a routerului.

PS: Metodele de livrare a codului către client pot fi extinse și completate în măsura în care capabilitățile dumneavoastră de programare sunt suficiente. De exemplu, puteți trimite mesaje către telegram sau... sugerați opțiuni!

Sper că articolul vă va fi de folos și vă va ajuta să faceți puțin mai sigure rețelele întreprinderilor mici și mijlocii.

Sursa: www.habr.com