Autentificazione à dui fattori di l'utilizatori VPN via MikroTik è SMS

Salutami i culleghi ! Oghje, quandu l'intensità di passioni intornu à u "travagliu remotu" s'hè calatu un pocu, a maiuranza di l'amministratori hà vintu u compitu di l'accessu remotu di l'impiegati à a reta corporativa, hè ora di sparte a mo longa sperienza in a migliurà a sicurità VPN. Questu articulu ùn serà micca di moda avà IPSec IKEv2 è xAuth. Si tratta di custruisce un sistema. autentificazione à dui fattori (2FA) Utenti VPN quandu MikroTik agisce cum'è un servitore VPN. Vale à dì, quandu sò usati protokolli "classici" cum'è PPP.

Autentificazione à dui fattori di l'utilizatori VPN via MikroTik è SMS

Oghje vi dicu cumu prutegge MikroTik PPP-VPN ancu s'è u contu d'utilizatore hè "jacked". Quandu stu schema hè statu introduttu à unu di i mo clienti, hà descrittu brevemente cum'è "bene, avà hè cum'è in un bancu!".

U metudu ùn usa micca servizii di autentificazione esterni. I travaglii sò realizati internamente da u router stessu. Nisun costu per u cliente di cunnessione. U metudu funziona per i clienti di PC è i dispositi mobili.

U schema generale di prutezzione hè u seguente:

  1. L'indirizzu IP internu di un utilizatore chì hà cunnessu bè cù u servitore VPN hè automaticamente in lista grisa.
  2. L'avvenimentu di cunnessione genera automaticamente un codice una volta chì hè mandatu à l'utilizatore utilizendu unu di i metudi dispunibili.
  3. L'indirizzi in questa lista anu un accessu limitatu à e risorse di a rete locale, cù l'eccezzioni di u serviziu "autentificatore", chì aspetta per riceve un passcode unicu.
  4. Dopu avè prisentatu u codice, l'utilizatore hà accessu à e risorse internu di a reta.

Prima u prublema più chjuca ch'e aghju avutu à affruntà era l'almacenamiento di l'infurmazioni di cuntattu nantu à l'utilizatore per mandà u codice 2FA. Siccomu hè impussibile di creà campi di dati arbitrarii chì currispondenu à l'utilizatori in Mikrotik, u campu "cummentariu" esistente hè stata utilizata:

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

U sicondu u prublema hè diventatu più seriu - a scelta di a strada è u metudu di furnisce u codice. Trè schemi sò attualmente implementati: a) SMS via USB-modem b) e-mail c) SMS via e-mail dispunibuli per i clienti corporativi di l'operatore cellulare rossu.

Iè, i schemi SMS portanu costi. Ma s'è vo circate, "a sicurità hè sempre di soldi" (c).
Personalmente ùn mi piace micca u schema cù e-mail. Micca perchè esige chì u servitore di mail sia dispunibule per u cliente chì hè autentificatu - ùn hè micca un prublema per sparte u trafficu. In ogni casu, se un clientu hà salvatu cù trascuranza e password di vpn è email in un navigatore è poi perde u so laptop, l'attaccante uttene un accessu cumpletu à a reta corporativa da ellu.

Dunque, hè decisu - trasmettemu un codice una volta cù i missaghji SMS.

U terzu U prublema era induve cumu generà un codice pseudo-aleatoriu per 2FA in MikroTik. Ùn ci hè micca analogu di a funzione random () in a lingua di scripting RouterOS, è aghju vistu parechji generatori di numeri pseudo-aleatoriu di script crutch prima. Ùn mi piaceva alcunu di elli per diverse ragioni.

In fatti, ci hè un generatore di sequenza pseudo-aleatoriu in MikroTik! Hè oculatu da un sguardu superficiale in u cuntestu di /certificati scep-server. U primu modu ottene una password unica hè faciule è simplice - cù u cumandamentu /certificates scep-server otp generate. Se realicemu una operazione simplice di assignazione variabile, uttene un valore di array chì pò esse usatu più tardi in scripts.

A seconda manera ottene una password unica chì hè ancu faciule d'applicà - utilizendu un serviziu esternu random.org per generà u tipu desideratu di sequenza di numeri pseudo-aleatoriu. Eccu un simplificatu cantilevered esempiu di ottene dati in una variabile:

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

Una dumanda formattata per a cunsola (escapes characters specials will be required in the script body) riceve una stringa di sei cifre in a variabile $rnd1. U cumandimu "put" seguente mostra solu a variabile in a cunsola MikroTik.

U quartu prublema chì avia da esse risolta rapidamente - questu hè cumu è induve u cliente cunnessu trasfirerà u so codice una volta in a seconda tappa di l'autentificazione.

Autentificazione à dui fattori di l'utilizatori VPN via MikroTik è SMS

Ci deve esse un serviziu nantu à u router MikroTik chì pò accettà u codice è currisponde à un cliente specificu. Se u codice furnitu currisponde à l'aspettatu, l'indirizzu di u cliente deve esse inclusu in una certa lista "bianca", indirizzi da quale sò permessi l'accessu à a reta interna di a cumpagnia.

A causa di a scelta povira di servizii, hè statu decisu di accettà i codici via http utilizendu u webproxy integratu in Mikrotik. E postu chì u firewall pò travaglià cù listi dinamichi di l'indirizzi IP, hè u firewall chì eseguisce a ricerca di u codice, cumminendu cù l'IP di u cliente è aghjunghjendu à a lista "bianca" cù Layer7 regexp. U router stessu hè statu assignatu un nome DNS cundizionale "gw.local", un A-record staticu hè statu creatu nantu à ellu per emissione à i clienti PPP:

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

Catturà u trafficu di i clienti micca verificati nantu à u 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

In questu casu, u proxy hà duie funzioni.

1. Open tcp cunnessione cù i clienti;

2. In casu di l'autorizazione riescita, redirige u navigatore di u cliente à una pagina o una stampa chì informa di l'autentificazione successu:

Config 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

Elencu l'elementi impurtanti di cunfigurazione:

  1. interface-list "2fa" - una lista dinamica di interfacce di u cliente, u trafficu da quale hè bisognu di trasfurmazioni in 2FA;
  2. address-list "2fa_jailed" - lista "grisa" di l'indirizzi IP di u tunnel di i clienti VPN;
  3. address_list "2fa_approved" - Lista "bianca" di l'indirizzi IP di u tunnel di i clienti VPN chì anu passatu bè l'autentificazione à dui fattori.
  4. catena firewall "input_2fa" - verifica i pacchetti tcp per a presenza di un codice d'autorizazione è currisponde à l'indirizzu IP di u mittente di u codice cù quellu necessariu. E regule in a catena sò aghjunte è eliminate dinamicamente.

Un diagramma di flussu simplificatu di l'elaborazione di pacchetti s'assumiglia cusì:

Autentificazione à dui fattori di l'utilizatori VPN via MikroTik è SMS

Per entra in u cuntrollu Layer7 di u trafficu da i clienti da a lista "grisa" chì ùn anu micca passatu a seconda tappa di l'autentificazione, una regula hè stata creata in a catena standard "input":

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

Avà cuminciamu à appiccicà tutta sta ricchezza à u serviziu PPP. MikroTik permette di utilizà scripts in profili (ppp-profile) è assignalli à l'avvenimenti di stabilisce è rompe una cunnessione ppp. I paràmetri di u prufilu ppp ponu esse appiicati à u servitore PPP in tuttu o à l'utilizatori individuali. À u listessu tempu, u prufilu attribuitu à l'utilizatore hà a priorità, annunziendu i paràmetri di u prufilu sceltu per u servitore cum'è un sanu cù i so paràmetri specificati.

In u risultatu di questu approcciu, pudemu creà un prufilu speciale per l'autentificazione di dui fattori è l'assignà micca à tutti l'utilizatori, ma solu à quelli chì anu cunsideratu necessariu di fà. Questu pò esse pertinenti se utilizate servizii PPP micca solu per cunnetta l'utilizatori finali, ma à u stessu tempu per custruisce cunnessione di situ à situ.

In u prufilu speciale novu creatu, usemu l'aghjuntu dinamicu di l'indirizzu è l'interfaccia di l'utilizatore cunnessu à i listi "grigi" di indirizzi è interfacce:

winbox
Autentificazione à dui fattori di l'utilizatori VPN via MikroTik è SMS

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

Hè necessariu d'utilizà listi di "lista d'indirizzi" è "liste d'interfaccia" per detectà è catturà u trafficu da i clienti VPN non secundari in a catena dstnat (prerouting).

Quandu a preparazione hè finita, i catene di firewall supplementarii è un prufilu sò creati, scriveremu un script rispunsevuli di l'autogenerazione di u codice 2FA è e regule di firewall individuali.

Documentazione wiki.mikrotik.com nantu à u PPP-Profile ci arricchisce cù infurmazioni nantu à e variàbili assuciati cù l'avvenimenti di cunnessione-disconnect di u cliente PPP "Eseguite script nantu à l'avvenimentu di login d'utilizatore. Quessi sò variàbili dispunibuli chì sò accessibili per u script di l'avvenimentu: utilizatore, indirizzu locale, indirizzu remoto, identificatore di chjama, id chjamatu, interfaccia ". Certi di elli sò assai utili per noi.

Codice utilizatu in u prufilu per l'avvenimentu di cunnessione 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

In particulare per quelli chì piacenu à copià-incollà senza mente, vi avvistu - u codice hè pigliatu da a versione di prova è pò cuntene minuri typos. Ùn serà micca difficiule per una persona chì capisce esattamente induve.

Quandu un utilizatore disconnects, un avvenimentu "On-Down" hè generatu è u script currispondente cù parametri hè chjamatu. U scopu di stu script hè di pulizziari e regule di firewall create per l'utilizatore disconnected.

Codice utilizatu in u prufilu per l'avvenimentu di cunnessione 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]
Pudete tandu creà utilizatori è assignà tutti o alcuni di elli à un prufilu di autentificazione à dui fattori.

winbox
Autentificazione à dui fattori di l'utilizatori VPN via MikroTik è SMS

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

Cumu si vede da u latu di u cliente.

Quandu una cunnessione VPN hè stabilita, un telefunu / tableta Android / iOS cù una carta SIM riceve un SMS cum'è questu:

SMS
Autentificazione à dui fattori di l'utilizatori VPN via MikroTik è SMS

Se a cunnessione hè stabilita direttamente da u telefunu / tableta, allora pudete passà per 2FA semplicemente clicchendu nantu à u ligame da u messagiu. Hè còmode.

Se a cunnessione VPN hè stabilita da un PC, l'utilizatore serà dumandatu à inserisce una forma di password minima. Una forma chjuca in a forma di un schedariu HTML hè datu à l'utilizatore quandu stabilisce a VPN. U schedariu pò ancu esse mandatu per mail in modu chì l'utilizatore salva è crea una scurciata in un locu còmuda. Sembra cusì:

Etichetta nantu à a tavula
Autentificazione à dui fattori di l'utilizatori VPN via MikroTik è SMS

L'utilizatore clicche nantu à a scurciatoia, si apre una forma simplice di ingressu di codice, chì incollà u codice in l'URL apertu:

Forma di schermu
Autentificazione à dui fattori di l'utilizatori VPN via MikroTik è SMS

A forma più primitiva hè datu cum'è un esempiu. Quelli chì volenu ponu mudificà per elli stessi.

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>

Se l'autorizazione hè successu, l'utilizatore vede u logu MikroTik in u navigatore, chì deve signalà l'autentificazione successu:

Autentificazione à dui fattori di l'utilizatori VPN via MikroTik è SMS

Nota chì l'imaghjini hè tornatu da u servitore web integratu MikroTik cù WebProxy Deny Redirect.

Pensu chì l'imaghjina pò esse persunalizata cù l'uttellu "hotspot", carichendu a vostra propria versione quì è stabilisce l'URL di Deny Redirect cù WebProxy.

Una grande dumanda à quelli chì cercanu di cumprà u Mikrotik "jocellu" più prezzu per $ 20 è rimpiazzà un router di $ 500 cun ellu - ùn fate micca cusì. Dispositivi cum'è "hAP Lite" / "hAP mini" (puntu d'accessu di casa) anu un CPU assai debule (smips), è hè prubabile chì ùn anu micca affruntà a carica in u segmentu di l'affari.

Attenti! Sta suluzione hà un svantaghju: quandu i clienti si cunnettanu o disconnect, i cambiamenti di cunfigurazione si verificanu, chì u router prova di salvà in a so memoria non volatile. Cù un gran numaru di clienti è cunnessione frequenti è disconnessioni, questu pò purtà à a degradazione di l'almacenamiento internu in u router.

PS: I metudi per furnisce u codice à u cliente ponu esse allargati è supplementati finu à chì e vostre capacità di prugrammazione sò abbastanza. Per esempiu, pudete mandà missaghji à telegram o ... suggerisce opzioni!

Spergu chì l'articulu vi serà utile è vi aiuterà à fà e rete di picculi è mediani imprese un pocu più sicura.

Source: www.habr.com