Dvojfaktorová autentifikácia používateľov VPN cez MikroTik a SMS

Ahojte kolegovia! Dnes, keď intenzita vášní okolo „práce na diaľku“ trochu opadla, väčšina adminov vyhrala úlohu vzdialeného prístupu zamestnancov do firemnej siete, je čas podeliť sa o svoje dlhoročné skúsenosti so zlepšovaním bezpečnosti VPN. Tento článok teraz nebude módny IPSec IKEv2 a xAuth. Ide o budovanie systému. dvojfaktorové overenie (2FA) Používatelia VPN, keď MikroTik funguje ako server VPN. Totiž, keď sa používajú „klasické“ protokoly ako PPP.

Dvojfaktorová autentifikácia používateľov VPN cez MikroTik a SMS

Dnes vám poviem, ako chrániť MikroTik PPP-VPN, aj keď je používateľský účet „unesený“. Keď bola táto schéma predstavená jednému z mojich zákazníkov, stručne ju opísal ako „no, teraz je to ako v banke!“.

Metóda nepoužíva externé autentifikačné služby. Úlohy vykonáva interne samotný router. Žiadne náklady na pripájajúceho sa klienta. Metóda funguje pre PC klientov aj mobilné zariadenia.

Všeobecná schéma ochrany je nasledovná:

  1. Interná IP adresa používateľa, ktorý sa úspešne pripojil k serveru VPN, sa automaticky zobrazí na „greyliste“.
  2. Udalosť pripojenia automaticky vygeneruje jednorazový kód, ktorý sa odošle používateľovi pomocou jednej z dostupných metód.
  3. Adresy v tomto zozname majú obmedzený prístup k zdrojom lokálnej siete, s výnimkou služby „autenticator“, ktorá čaká na prijatie jednorazového prístupového kódu.
  4. Po predložení kódu má používateľ prístup k interným zdrojom siete.

Prvé najmenší problém, ktorému som musel čeliť, bolo uloženie kontaktných informácií o používateľovi, aby som mu poslal kód 2FA. Keďže nie je možné vytvárať ľubovoľné dátové polia zodpovedajúce používateľom v Mikrotiku, bolo použité existujúce pole „komentár“:

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

Druhý problém sa ukázal byť vážnejší - výber cesty a spôsobu doručenia kódu. V súčasnosti sú implementované tri schémy: a) SMS cez USB modem b) e-mail c) SMS cez e-mail dostupné pre firemných klientov červeného mobilného operátora.

Áno, SMS schémy prinášajú náklady. Ale keď sa pozriete, "bezpečnosť je vždy o peniazoch" (c).
Mne osobne sa nepáči schéma s e-mailom. Nie preto, že vyžaduje, aby bol poštový server dostupný pre overovaného klienta – nie je problém rozdeliť prevádzku. Ak by si však klient neopatrne uložil do prehliadača heslá vpn aj e-mailu a následne stratil svoj laptop, útočník by z neho získal plný prístup do podnikovej siete.

Takže je rozhodnuté – jednorazový kód doručíme pomocou SMS správ.

Третья Problém bol kde ako vygenerovať pseudonáhodný kód pre 2FA v MikroTiku. V skriptovacom jazyku RouterOS neexistuje žiadna analógia funkcie random() a už som videl niekoľko generátorov pseudonáhodných čísel barličkových skriptov. Ani jeden sa mi z rôznych dôvodov nepáčil.

V skutočnosti je v MikroTiku generátor pseudonáhodných sekvencií! Je to skryté pred povrchným pohľadom v kontexte /certifikáty scep-server. Prvý spôsob získanie jednorazového hesla je jednoduché a jednoduché - pomocou príkazu /certifikáty scep-server otp vygenerovať. Ak vykonáme jednoduchú operáciu priradenia premenných, dostaneme hodnotu poľa, ktorú možno neskôr použiť v skriptoch.

Druhý spôsob získanie jednorazového hesla, ktoré je navyše jednoduché použiť – pomocou externej služby random.org na generovanie požadovaného druhu sekvencie pseudonáhodných čísel. Tu je zjednodušené nosný príklad získania údajov do premennej:

kód
: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

Požiadavka naformátovaná pre konzolu (v tele skriptu sa budú vyžadovať špeciálne znaky) dostane reťazec šiestich číslic do premennej $rnd1. Nasledujúci príkaz „put“ jednoducho zobrazí premennú v konzole MikroTik.

Štvrtý problém čo bolo treba rýchlo vyriešiť – takto a kam prenesie pripojený klient svoj jednorazový kód v druhej fáze autentifikácie.

Dvojfaktorová autentifikácia používateľov VPN cez MikroTik a SMS

Na routeri MikroTik musí byť služba, ktorá dokáže prijať kód a spárovať ho s konkrétnym klientom. Ak sa poskytnutý kód zhoduje s očakávaným, adresa klienta by mala byť zaradená do určitého „bieleho“ zoznamu, z ktorého je povolený prístup do internej siete spoločnosti.

Kvôli slabému výberu služieb bolo rozhodnuté akceptovať kódy cez http pomocou webproxy zabudovaného v Mikrotiku. A keďže firewall dokáže pracovať s dynamickými zoznamami IP adries, je to firewall, ktorý vykoná vyhľadávanie kódu, priradí ho k IP klienta a pridá ho do „bieleho“ zoznamu pomocou regulárneho výrazu Layer7. Samotnému smerovaču bol pridelený podmienený názov DNS „gw.local“, bol na ňom vytvorený statický záznam A na vydávanie klientom PPP:

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

Zachytenie prevádzky neoverených klientov na serveri 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

V tomto prípade má proxy dve funkcie.

1. Otvorte tcp spojenia s klientmi;

2. V prípade úspešnej autorizácie presmerujte klientsky prehliadač na stránku alebo obrázok informujúci o úspešnej autentifikácii:

Konfigurácia 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

Uvediem zoznam dôležitých prvkov konfigurácie:

  1. interface-list "2fa" - dynamický zoznam klientskych rozhraní, ktorých prevádzka vyžaduje spracovanie v rámci 2FA;
  2. address-list "2fa_jailed" - "sivý" zoznam tunelových IP adries klientov VPN;
  3. address_list "2fa_approved" - "biely" zoznam tunelových IP adries klientov VPN, ktorí úspešne prešli dvojfaktorovou autentifikáciou.
  4. firewall reťazec "input_2fa" - kontroluje tcp pakety na prítomnosť autorizačného kódu a porovnáva IP adresu odosielateľa kódu s požadovaným. Pravidlá v reťazci sa pridávajú a odstraňujú dynamicky.

Zjednodušený vývojový diagram spracovania paketov vyzerá takto:

Dvojfaktorová autentifikácia používateľov VPN cez MikroTik a SMS

Aby ste sa dostali do kontroly návštevnosti na vrstve 7 od klientov zo „sivého“ zoznamu, ktorí ešte neprešli druhou fázou autentifikácie, v štandardnom „vstupnom“ reťazci bolo vytvorené pravidlo:

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

Teraz začnime všetko toto bohatstvo spájať so službou PPP. MikroTik umožňuje použiť skripty v profiloch (ppp-profile) a priradiť ich k udalostiam nadviazania a prerušenia ppp spojenia. Nastavenia profilu ppp možno použiť na server PPP ako celok alebo na jednotlivých používateľov. Zároveň má prioritu profil priradený používateľovi, ktorý prepíše parametre profilu vybraného pre server ako celok svojimi špecifikovanými parametrami.

V dôsledku tohto prístupu môžeme vytvoriť špeciálny profil pre dvojfaktorovú autentifikáciu a priradiť ho nie všetkým používateľom, ale iba tým, ktorí to považujú za potrebné. To môže byť relevantné, ak služby PPP používate nielen na pripojenie koncových používateľov, ale zároveň na vytváranie pripojení medzi lokalitami.

V novovytvorenom špeciálnom profile využívame dynamické pridávanie adresy a rozhrania pripojeného používateľa do „sivých“ zoznamov adries a rozhraní:

winbox
Dvojfaktorová autentifikácia používateľov VPN cez MikroTik a SMS

kód
/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

Na detekciu a zachytenie prevádzky z nesekundárnych VPN klientov v reťazci dstnat (prerouting) je potrebné použiť zoznamy „zoznam adries“ aj zoznam „zoznam rozhraní“.

Po dokončení prípravy, vytvorení ďalších reťazcov firewallu a profilu napíšeme skript zodpovedný za automatické generovanie kódu 2FA a jednotlivých pravidiel firewallu.

Dokumentácia wiki.mikrotik.com on PPP-Profile nás obohacuje o informácie o premenných spojených s udalosťami pripojenia a odpojenia klienta PPP "Spustiť skript pri udalosti prihlásenia používateľa. Toto sú dostupné premenné, ktoré sú prístupné pre skript udalosti: user, local-address, remote-address, caller-id, call-id, interface“. Niektoré z nich sú pre nás veľmi užitočné.

Kód použitý v profile pre udalosť pripojenia 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

Najmä pre tých, ktorí radi bezhlavo kopírujú a prilepujú, upozorňujem - kód je prevzatý z testovacej verzie a môže obsahovať drobné preklepy. Pre chápajúceho človeka nebude ťažké zistiť, kde presne.

Keď sa používateľ odpojí, vygeneruje sa udalosť „On-Down“ a zavolá sa zodpovedajúci skript s parametrami. Úlohou tohto skriptu je vyčistiť pravidlá brány firewall vytvorené pre odpojeného používateľa.

Kód použitý v profile pre udalosť pripojenia 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]
Potom môžete vytvoriť používateľov a priradiť všetkých alebo niektorých z nich k profilu dvojfaktorovej autentifikácie.

winbox
Dvojfaktorová autentifikácia používateľov VPN cez MikroTik a SMS

kód
/ppp secrets set [find name=Petrov] profile=2FA

Ako to vyzerá na strane klienta.

Po vytvorení pripojenia VPN dostane telefón/tablet so systémom Android/iOS so SIM kartou takúto SMS:

SMS
Dvojfaktorová autentifikácia používateľov VPN cez MikroTik a SMS

Ak je spojenie nadviazané priamo z telefónu / tabletu, potom môžete prejsť cez 2FA jednoducho kliknutím na odkaz v správe. Je to pohodlné.

Ak je pripojenie VPN vytvorené z počítača, používateľ bude musieť zadať formulár minimálneho hesla. Malý formulár vo forme súboru HTML dostane používateľ pri nastavovaní VPN. Súbor možno dokonca poslať poštou, takže ho používateľ uloží a vytvorí odkaz na vhodnom mieste. Vyzerá to takto:

Štítok na stole
Dvojfaktorová autentifikácia používateľov VPN cez MikroTik a SMS

Používateľ klikne na skratku, otvorí sa jednoduchý formulár na zadanie kódu, ktorý vloží kód do otvorenej adresy URL:

Obrazovkový formulár
Dvojfaktorová autentifikácia používateľov VPN cez MikroTik a SMS

Ako príklad je uvedená najprimitívnejšia forma. Kto chce, môže si ho upraviť sám.

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>

Ak bola autorizácia úspešná, používateľovi sa v prehliadači zobrazí logo MikroTik, ktoré by malo signalizovať úspešné overenie:

Dvojfaktorová autentifikácia používateľov VPN cez MikroTik a SMS

Všimnite si, že obrázok sa vracia zo vstavaného webového servera MikroTik pomocou WebProxy Deny Redirect.

Predpokladám, že obrázok je možné prispôsobiť pomocou nástroja „hotspot“, nahrať si tam vlastnú verziu a nastaviť na ňu URL adresu Deny Redirect pomocou WebProxy.

Veľká prosba pre tých, ktorí sa snažia kúpiť najlacnejšiu „hračku“ Mikrotik za 20 dolárov a nahradiť ňou router za 500 dolárov – nerobte to. Zariadenia ako „hAP Lite“ / „hAP mini“ (domáci prístupový bod) majú veľmi slabý procesor (smips) a s najväčšou pravdepodobnosťou sa nevyrovnajú so záťažou v obchodnom segmente.

Varovanie! Toto riešenie má jednu nevýhodu: keď sa klienti pripájajú alebo odpájajú, dochádza ku konfiguračným zmenám, ktoré sa router snaží uložiť do svojej energeticky nezávislej pamäte. Pri veľkom počte klientov a častých pripojeniach a odpájaniach to môže viesť k znehodnoteniu interného úložiska v routeri.

PS: Metódy doručovania kódu klientovi je možné rozširovať a dopĺňať, pokiaľ sú vaše programovacie schopnosti dostatočné. Môžete napríklad posielať správy na telegram alebo ... navrhnúť možnosti!

Dúfam, že článok bude pre vás užitočný a pomôže trochu zabezpečiť siete malých a stredných podnikov.

Zdroj: hab.com