Dvoufaktorová autentizace uživatelů VPN přes MikroTik a SMS

Ahoj kolegové! Dnes, kdy intenzita vášní kolem „práce na dálku“ trochu opadla, většina adminů vyhrála úkol vzdáleného přístupu zaměstnanců do firemní sítě, je čas podělit se o své dlouholeté zkušenosti se zlepšováním zabezpečení VPN. Tento článek nyní nebude módní IPSec IKEv2 a xAuth. Jde o budování systému. dvoufaktorové ověřování (2FA) Uživatelé VPN, když MikroTik funguje jako server VPN. Totiž při použití „klasických“ protokolů jako je PPP.

Dvoufaktorová autentizace uživatelů VPN přes MikroTik a SMS

Dnes vám řeknu, jak ochránit MikroTik PPP-VPN i v případě „ukradení“ uživatelského účtu. Když bylo toto schéma představeno jednomu z mých zákazníků, stručně jej popsal jako „no, teď je to jako v bance!“.

Metoda nepoužívá externí autentizační služby. Úkoly provádí interně samotný router. Žádné náklady na připojení klienta. Metoda funguje jak pro PC klienty, tak pro mobilní zařízení.

Obecné schéma ochrany je následující:

  1. Interní IP adresa uživatele, který se úspěšně připojil k serveru VPN, je automaticky uvedena na šedé listině.
  2. Událost připojení automaticky vygeneruje jednorázový kód, který je odeslán uživateli pomocí jedné z dostupných metod.
  3. Adresy v tomto seznamu mají omezený přístup k místním síťovým zdrojům, s výjimkou služby „autenticator“, která čeká na přijetí jednorázového hesla.
  4. Po předložení kódu má uživatel přístup k vnitřním zdrojům sítě.

první nejmenší problém, kterému jsem musel čelit, bylo uložení kontaktních informací o uživateli, abych mu poslal kód 2FA. Protože v Mikrotiku nelze vytvářet libovolná datová pole odpovídající uživatelům, bylo použito stávající pole „komentář“:

/ppp secrets add name=Petrov heslo=4M@ngr! komentář="89876543210"

Druhý problém se ukázal být vážnější - volba cesty a způsobu doručení kódu. V současné době jsou implementována tři schémata: a) SMS přes USB modem b) e-mail c) SMS přes e-mail pro firemní klienty červeného mobilního operátora.

Ano, schémata SMS přinášejí náklady. Ale když se podíváte, "bezpečnost je vždy o penězích" (c).
Osobně se mi nelíbí schéma s e-mailem. Ne proto, že by to vyžadovalo, aby byl poštovní server dostupný pro ověřovaného klienta – není problém provoz rozdělit. Pokud by si však klient neopatrně uložil do prohlížeče hesla vpn i e-mailu a následně by ztratil svůj notebook, útočník by z něj získal plný přístup do podnikové sítě.

Je tedy rozhodnuto – doručujeme jednorázový kód pomocí SMS zpráv.

třetina Problém byl kde jak vygenerovat pseudonáhodný kód pro 2FA v MikroTiku. Ve skriptovacím jazyce RouterOS neexistuje žádná analogie funkce random() a již jsem viděl několik generátorů pseudonáhodných čísel s berličkovým skriptem. Žádný z nich se mi z různých důvodů nelíbil.

Ve skutečnosti je v MikroTiku generátor pseudonáhodné sekvence! Je skryto povrchnímu pohledu v kontextu /certifikáty scep-server. První cesta získání jednorázového hesla je snadné a jednoduché - pomocí příkazu /certificates scep-server otp generovat. Pokud provedeme jednoduchou operaci přiřazení proměnné, získáme hodnotu pole, kterou lze později použít ve skriptech.

Druhá cesta získání jednorázového hesla, které lze navíc snadno použít – pomocí externí služby random.org pro generování požadovaného druhu sekvence pseudonáhodných čísel. Zde je zjednodušené konzola příklad získávání dat do proměnné:

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žadavek naformátovaný pro konzoli (v těle skriptu budou vyžadovány speciální znaky) obdrží řetězec šesti číslic do proměnné $rnd1. Následující příkaz „put“ jednoduše zobrazí proměnnou v konzoli MikroTik.

Čtvrtý problém což bylo nutné rychle vyřešit - takto a kam si připojený klient přenese svůj jednorázový kód ve druhé fázi autentizace.

Dvoufaktorová autentizace uživatelů VPN přes MikroTik a SMS

Na routeru MikroTik musí být služba, která dokáže přijmout kód a spárovat jej s konkrétním klientem. Pokud se poskytnutý kód shoduje s očekávaným, měla by být adresa klienta zařazena na určitý „bílý“ seznam, adresy, ze kterých je povolen přístup do vnitřní sítě společnosti.

Kvůli špatnému výběru služeb bylo rozhodnuto přijímat kódy přes http pomocí webproxy zabudovaného v Mikrotiku. A protože firewall může pracovat s dynamickými seznamy IP adres, je to firewall, kdo provádí vyhledávání kódu, přiřazuje jej k IP klienta a přidává jej na „bílý“ seznam pomocí Layer7 regexp. Samotnému routeru bylo přiděleno podmíněné jméno DNS „gw.local“, byl na něm vytvořen statický záznam A pro vydávání klientům PPP:

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

Zachycení provozu neověřených klientů na 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 případě má proxy dvě funkce.

1. Otevřete TCP spojení s klienty;

2. V případě úspěšné autorizace přesměrujte klientský prohlížeč na stránku nebo obrázek informující o úspěšné autentizaci:

Konfigurace 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

Uvedu důležité konfigurační prvky:

  1. interface-list "2fa" - dynamický seznam klientských rozhraní, jejichž provoz vyžaduje zpracování v rámci 2FA;
  2. address-list "2fa_jailed" - "šedý" seznam tunelových IP adres VPN klientů;
  3. address_list "2fa_approved" - "bílý" seznam tunelových IP adres VPN klientů, kteří úspěšně prošli dvoufaktorovou autentizací.
  4. firewallový řetězec "input_2fa" - kontroluje tcp pakety na přítomnost autorizačního kódu a shoduje se IP adresa odesílatele kódu s požadovanou. Pravidla v řetězci se přidávají a odebírají dynamicky.

Zjednodušený vývojový diagram zpracování paketů vypadá takto:

Dvoufaktorová autentizace uživatelů VPN přes MikroTik a SMS

Pro vstup do Layer7 kontroly provozu od klientů z „šedého“ seznamu, kteří ještě neprošli druhou fází autentizace, bylo vytvořeno pravidlo ve standardním „vstupním“ řetězci:

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

Nyní začněme připevňovat všechno toto bohatství do služby PPP. MikroTik umožňuje používat skripty v profilech (ppp-profile) a přiřazovat je k událostem navazování a přerušení ppp spojení. Nastavení profilu ppp lze aplikovat na PPP server jako celek nebo na jednotlivé uživatele. Zároveň má prioritu profil přiřazený uživateli, který svými zadanými parametry přepíše parametry profilu vybraného pro server jako celek.

V důsledku tohoto přístupu můžeme vytvořit speciální profil pro dvoufaktorovou autentizaci a přiřadit jej ne všem uživatelům, ale pouze těm, kteří to považují za nutné. To může být relevantní, pokud služby PPP nepoužíváte pouze k připojení koncových uživatelů, ale zároveň k vytváření spojení mezi lokalitami.

V nově vytvořeném speciálním profilu využíváme dynamické přidávání adresy a rozhraní připojeného uživatele do „šedých“ seznamů adres a rozhraní:

winbox
Dvoufaktorová autentizace uživatelů VPN přes 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

Pro detekci a zachycení provozu z nesekundárních VPN klientů v řetězci dstnat (prerouting) je nutné používat seznamy „adres-list“ i „interface-list“.

Po dokončení přípravy, vytvoření dalších řetězců firewallu a profilu napíšeme skript zodpovědný za automatické generování kódu 2FA a jednotlivých pravidel firewallu.

Dokumentace wiki.mikrotik.com on PPP-Profile nás obohacuje o informace o proměnných spojených s událostmi připojení-odpojení klienta PPP "Spustit skript při události přihlášení uživatele. Toto jsou dostupné proměnné, které jsou přístupné pro skript události: user, local-address, remote-address, caller-id, call-id, interface". Některé z nich jsou pro nás velmi užitečné.

Kód použitý v profilu pro událost připojení 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

Zejména pro ty, kteří rádi bezmyšlenkovitě kopírují a vkládají, varuji - kód je převzat z testovací verze a může obsahovat drobné překlepy. Pro chápajícího člověka nebude těžké přijít na to, kde přesně.

Když se uživatel odpojí, vygeneruje se událost „On-Down“ a zavolá se odpovídající skript s parametry. Účelem tohoto skriptu je vyčistit pravidla brány firewall vytvořená pro odpojeného uživatele.

Kód použitý v profilu pro událost připojení 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]
Poté můžete vytvořit uživatele a všechny nebo některé z nich přiřadit k profilu dvoufaktorového ověřování.

winbox
Dvoufaktorová autentizace uživatelů VPN přes MikroTik a SMS

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

Jak to vypadá na straně klienta.

Když je navázáno připojení VPN, telefon/tablet se systémem Android/iOS se SIM kartou obdrží SMS, jako je tato:

SMS
Dvoufaktorová autentizace uživatelů VPN přes MikroTik a SMS

Pokud je spojení navázáno přímo z telefonu / tabletu, můžete projít 2FA jednoduše kliknutím na odkaz ve zprávě. Je to pohodlné.

Pokud je připojení VPN navázáno z PC, bude uživatel požádán o zadání minimálního formuláře hesla. Malý formulář ve formě souboru HTML dostane uživatel při nastavování VPN. Soubor lze dokonce odeslat poštou, takže jej uživatel uloží a vytvoří zástupce na vhodném místě. Vypadá to takto:

Štítek na stole
Dvoufaktorová autentizace uživatelů VPN přes MikroTik a SMS

Uživatel klikne na zástupce, otevře se jednoduchý formulář pro zadání kódu, který vloží kód do otevřené adresy URL:

Obrazovka
Dvoufaktorová autentizace uživatelů VPN přes MikroTik a SMS

Jako příklad je uvedena nejprimitivnější forma. Kdo chce, může si ho upravit 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>

Pokud byla autorizace úspěšná, uživatel uvidí v prohlížeči logo MikroTik, které by mělo signalizovat úspěšné ověření:

Dvoufaktorová autentizace uživatelů VPN přes MikroTik a SMS

Všimněte si, že obrázek je vrácen z vestavěného webového serveru MikroTik pomocí WebProxy Deny Redirect.

Předpokládám, že obrázek lze upravit pomocí nástroje „hotspot“, nahrát tam svou vlastní verzi a nastavit na něj adresu URL Deny Redirect pomocí WebProxy.

Velká prosba pro ty, kteří se snaží koupit nejlevnější "hračku" Mikrotik za 20 $ a nahradit jím router za 500 $ - nedělejte to. Zařízení jako "hAP Lite" / "hAP mini" (domácí přístupový bod) mají velmi slabý CPU (smips) a je pravděpodobné, že nebudou zvládat zátěž v obchodním segmentu.

Varování! Toto řešení má jednu nevýhodu: při připojení nebo odpojení klientů dochází ke změnám konfigurace, které se router snaží uložit do své energeticky nezávislé paměti. Při velkém počtu klientů a častém připojování a odpojování to může vést k degradaci vnitřního úložiště v routeru.

PS: Metody pro doručování kódu klientovi lze rozšiřovat a doplňovat, pokud jsou vaše programovací schopnosti dostatečné. Můžete například posílat zprávy na telegram nebo ... navrhnout možnosti!

Doufám, že vám článek bude užitečný a pomůže trochu zabezpečit sítě malých a středních firem.

Zdroj: www.habr.com