Autentificarea cu două factori pentru utilizatorii VPN prin MikroTik și SMS

Bună ziua, colegi! Astăzi, când intensitatea discuțiilor despre muncă la distanță s-a mai redus, majoritatea administratorilor au rezolvat problema accesului de la distanță al angajaților la rețeaua corporativă, a venit momentul să împărtășesc o metodă pe care o dezvolt de mult timp pentru a spori securitatea VPN-ului. În acest articol nu voi discuta despre IPSec IKEv2 și xAuth, care sunt la modă acum. Vorbim despre construirea unui sistem de autentificare cu două factori (2FA) pentru utilizatorii VPN, când MikroTik funcționează ca server VPN. Mai exact, când sunt utilizate protocoale „clasice” de tip PPP.

Autentificarea cu două factori pentru utilizatorii VPN prin MikroTik și SMS

Astăzi voi explica cum să protejezi MikroTik PPP-VPN chiar și în cazul „păcălirii” contului de utilizator. Când acest sistem a fost implementat pentru unul dintre clienții mei, acesta a caracterizat-o pe scurt „ei bine, acum este ca la bancă!”.

Metoda nu utilizează servicii externe de autentificare. Sarcinile sunt realizate cu ajutorul instrumentelor interne ale routerului. Fără costuri pentru clientul conectat. Metoda funcționează atât pentru clienții PC, cât și pentru dispozitive mobile.

Schema generală de protecție arată astfel:

  1. Adresa IP internă a utilizatorului care s-a conectat cu succes la serverul VPN intră automat în lista „gri”.
  2. Evenimentul de conectare generează automat un cod unic care este trimis utilizatorului prin una dintre metodele disponibile.
  3. Adreselor aflate în această listă le este restricționat accesul la resursele rețelei locale, cu excepția serviciului de „autentificare”, care așteaptă primirea codului de autentificare-într-unică folosit.
  4. După prezentarea codului, utilizatorului i se deschide accesul la resursele interne ale rețelei.

Primul cea mai mică problemă cu care m-am confruntat a fost stocarea informațiilor de contact ale utilizatorului pentru a-i trimite codul 2FA. Deoarece nu se pot crea câmpuri de date arbitrare corespunzătoare utilizatorilor în MikroTik, am utilizat câmpul existent „comentarii”:

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

Al doilea problema s-a dovedit a fi mai serioasă — alegerea modului și a căii de livrare a codului. În prezent, au fost implementate trei scheme: a) SMS prin modem USB b) e-mail c) SMS prin e-mail disponibil pentru clienții corporate ai operatorului de telefonie mobilă roșu.

Da, schemele cu SMS generează costuri. Dar, dacă stai bine pe gânduri, „securitatea este întotdeauna despre bani” (c).
Schema cu e-mail nu îmi place personal. Nu pentru că necesită accesibilitatea serverului de poștă pentru clientul autentificat — aceasta nu este o problemă în a împărți traficul. Totuși, dacă clientul a salvat imprudent parolele atât pe VPN, cât și pe poșta din browser și apoi și-a pierdut laptopul, un atacator va obține acces complet la rețeaua corporativă.

Așadar, s-a decis — livrăm codul unic prin intermediul mesajelor SMS.

Al treilea Problema a fost unde și cum să generezi un cod pseudorandom pentru 2FA în MikroTik.În limbajul de scripting RouterOS nu există o funcție echivalentă cu random() și am văzut anterior câteva scripturi improvizate care generează numere pseudorandom. Niciunul dintre ele nu mi-a plăcut din diverse motive.

De fapt, există un generator de secvențe pseudorandom în MikroTik! Este ascuns de o privire superficială în contextul /certificates scep-server. Prima metodă Obținerea unei parole unice este ușoară și simplă — prin comanda /certificates scep-server otp generate. Dacă executăm o operație simplă de atribuire a unei variabile, vom obține un tip de valoare array, care poate fi utilizată ulterior în scripturi.

A doua metodă obținerea unei parole unice care de asemenea este ușor de aplicat — utilizarea unui serviciu extern random.org pentru a genera secvența dorită de numere pseudorandom. Iată un exemplu simplificat interfață grafică de obținere 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

Request-ul formatat pentru consolă (în corpul scriptului va fi nevoie de escaparea caracterelor speciale) primește un șir de șase simboluri-numere în variabila $rnd1. Comanda următoare «put» pur și simplu afișează variabila în consola MikroTik.

A patra problemă, pe care a trebuit să o rezolv rapid — este cum și unde clientul conectat va transmite codul său unic în a doua etapă a autentificării.

Autentificarea cu două factori pentru utilizatorii VPN prin MikroTik și SMS

Pe routerul MikroTik trebuie să existe un serviciu capabil să primească codul și să-l coreleze cu clientul specific. Dacă codul furnizat se potrivește cu cel așteptat, adresa clientului ar trebui să fie introdusă într-o listă „albă”, de la care este permis accesul la rețeaua internă a companiei.

Având în vedere selecția limitată de servicii, s-a luat decizia de a accepta coduri prin http folosind webproxy-ul încorporat în MikroTik. Și deoarece firewall-ul poate lucra cu liste dinamice de adrese IP, căutarea codului, potrivirea acestuia cu IP-ul clientului și adăugarea în lista „albă” este realizată de firewall prin intermediul Layer7 regexp. Router-ul a fost atribuit un nume DNS convențional „gw.local”, pe care s-a creat un înregistrare A statică pentru a fi furnizată clienților PPP:

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

Capturarea traficului proxy de la clienți neverificați:
/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. A deschide conexiuni tcp cu clienții;

2. În cazul unei autorizări reușite, a redirecționa browserul clientului către o pagină sau o imagine care să informeze despre trecerea cu succes a autentificării:

Configurație proxy
/ip proxy
set enabled=da 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 ale configurației:

  1. interface-list „2fa” — lista dinamică de interfețe client, traficul de pe care necesită prelucrarea în cadrul 2FA;
  2. address-list „2fa_jailed” — lista „gri” de adrese IP tunelate ale clienților VPN;
  3. address_list „2fa_approved” — lista „albă” de adrese IP tunelate ale clienților VPN care au reușit autentificarea în doi pași.
  4. chain-ul firewall-ului „input_2fa” — aici se verifică pachetele tcp pentru prezența codului de autorizare și potrivirea adresei IP a expeditorului codului cu cerința. Regulile sunt adăugate și șterse din lanț dinamic.

Schema simplificată de procesare a pachetului arată astfel:

Autentificarea cu două factori pentru utilizatorii VPN prin MikroTik și SMS

Pentru a permite verificarea traficului de la clienții din lista „gri” care nu au trecut încă de a doua etapă a autentificării, s-a creat o regulă în lanțul standard „input”:

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

Acum să începem să atașăm toate aceste elemente la serviciul PPP. MikroTik permite utilizarea scripturilor în profiluri (ppp-profile) și atribuirea lor la evenimentele de stabilire și întrerupere a conexiunii ppp. Setările ppp-profile pot fi aplicate atât pentru serverul PPP în ansamblu, cât și pentru utilizatori individuali. În acest caz, profilul atribuit utilizatorului are prioritate, suprapunând parametrii săi peste parametrii profilului ales pentru serverul în ansamblu.

Prin acest mod, putem crea un profil special pentru autentificarea în doi pași și să îl atribuim nu tuturor utilizatorilor, ci doar celor pe care considerăm necesar. Acest lucru poate fi relevant în cazul în care serviciile PPP sunt folosite nu doar pentru conectarea utilizatorilor finali, ci și pentru stabilirea de conexiuni site-to-site.

În noul profil special creat, folosim adăugarea dinamică a adresei și a interfeței utilizatorului conectat în listele gri de adrese și interfețe:

winbox
Autentificarea cu două factori pentru utilizatorii 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ă utilizarea simultană a listelor «address-list» și «interface-list» pentru a determina și captura traficul de la clienții VPN care nu au trecut de a doua autentificare în lanțul dstnat (prerouting).

Când pregătirea este completă, lanțurile suplimentare de firewall și profilul sunt create, vom scrie un script responsabil pentru autogenerarea codului 2FA și a regulilor individuale de firewall.

Documentația wiki.mikrotik.com despre PPP-Profile ne îmbogățește cu informații despre variabilele legate de evenimentele de conectare-deconectare a clientului PPP «Execută script pe evenimentul de autentificare a utilizatorului. Acestea sunt variabilele disponibile accesibile pentru scriptul evenimentului: utilizator, adresă-locală, adresă-remote, caller-id, called-id, interfață». Unele dintre ele ne vor fi foarte utile.

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

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

"adresa-locală")
:log info (

"adresa-de-la-distanta")
:log info (

"id-caller")
:log info (

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

"interfață") name])
#Объявляем свои локальные переменные
:local listname "2fa_îngrădit"
:local viamodem false
:local modemport "usb2"
#ищем автоматически созданную запись в адрес-листе "2fa_jailed"
:local recnum1 [/ip fi address-list find address=(

"adresa-de-la-distanta") 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 ("Codul tău: ".$comm1."n Sau deschide linkul 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 from=admin@mydomain.example to=mail2sms@mcommunicator.ru subject="@".$vphone body=$msgboby }

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

"adresa-de-la-distanta"))
/ip firewall layer7-protocol add name=(

"vcomment") comment=(

"adresa-de-la-distanta") 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") protocol=tcp src-address=(

"adresa-de-la-distanta") dst-limit=1,1,src-address/1m40s


Special pentru cei care iubesc să copieze fără discernământ, avertizez — codul a fost preluat dintr-o versiune de test și poate conține erori minore. O persoană care înțelege nu va avea dificultăți în a identifica unde anume.

La deconectarea utilizatorului, se generează un eveniment «On-Down» și se apelează scriptul corespunzător cu parametrii respectivi. Sarcina acestui script este să curețe regulile firewall-ului create pentru utilizatorul deconectat.

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

:local vcomment ("2fa_".

"adresa-de-la-distanta"))
/ip firewall address-list remove [find address=(

"adresa-la-distanță") list=2fa_approved]
/ip firewall filter remove [find chain="input_2fa" src-address=(

"adresa-la-distanță") ]
/ip firewall layer7-protocol remove [find name=$vcomment]


După aceasta, se pot crea utilizatori și se poate atribui tuturor sau doar unora dintre ei un profil cu autentificare în doi pași.

winbox
Autentificarea cu două factori pentru utilizatorii VPN prin MikroTik și SMS

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

Cum arată aceasta din partea clientului.

Când se stabilește o conexiune VPN, pe telefon/tableta cu Android/iOS cu cartelă SIM, se primește un SMS de o asemenea factură:

SMS
Autentificarea cu două factori pentru utilizatorii VPN prin MikroTik și SMS

Dacă conexiunea este stabilită direct de pe telefon/tabletă, atunci se poate trece 2FA pur și simplu dând clic pe linkul din mesaj. Este convenabil.

Dacă conexiunea VPN este stabilită cu PC-ul, utilizatorul va avea nevoie de o formă minimă de introducere a parolei. O mică formă în format HTML este trimisă utilizatorului la configurarea VPN-ului. Fișierul poate fi trimis și prin poștă, astfel încât utilizatorul să-l salveze și să creeze un shortcut într-un loc convenabil. Cam așa arată:

Shortcut pe birou
Autentificarea cu două factori pentru utilizatorii VPN prin MikroTik și SMS

Utilizatorul face clic pe shortcut, se deschide un formular simplu de introducere a codului, care va insera codul în URL-ul deschis:

Screenshot al formularului
Autentificarea cu două factori pentru utilizatorii VPN prin MikroTik și SMS

Formularul este cel mai primitiv, oferit doar ca exemplu. Cei doritori pot să-l adapteze după preferințe.

2fa_login_mini.html

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

Dacă autentificarea a avut succes, utilizatorul va vedea logo-ul MikroTik în browser, ceea ce ar trebui să servească drept semnal pentru autentificarea reușită:

Autentificarea cu două factori pentru utilizatorii VPN prin MikroTik și SMS

Menționez că imaginea este returnată din serverul web încorporat MikroTik prin WebProxy Deny Redirect.

Cred că imaginea poate fi personalizată, folosind instrumentul „hotspot”, încărcându-ți propriul variant și stabilind Deny Redirect URL cu WebProxy.

O mare rugăminte pentru cei care încearcă să înlocuiască un router de $500 cu cel mai ieftin „jucărie” MikroTik de $20 — nu faceți așa. Dispozitivele precum „hAP Lite”/„hAP mini” (home access point) au un CPU foarte slab (smips) și este foarte probabil că nu vor face față cererii din segmentul de afaceri.

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

P.S.: metodele de livrare a codului către client pot fi extinse și completate cât durează abilitățile voastre de programare. De exemplu, se pot trimite mesaje în Telegram sau... propuneți alte variante!

Sper că articolul vă va fi de folos și va ajuta la îmbunătățirea securității rețelelor mici și mijlocii de afaceri.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster