Dvoufaktorová autentizace uživatelů VPN prostřednictvím MikroTik a SMS

Dobrý den, kolegové! Dnes, když vášně kolem "práce na dálku" trochu opadly, většina administrátorů úspěšně vyřešila úkol vzdáleného přístupu zaměstnanců do firemní sítě, nastal čas podělit se o mé dlouhodobé zkušenosti zvyšování bezpečnosti VPN. V tomto článku nebudou módní IPSec IKEv2 a xAuth. Řeč bude o vytvoření systému dvoufaktorové autentizace (2FA) uživatelů VPN, kdy MikroTik funguje jako VPN server. Přesněji, když se používají "klasické" protokoly typu PPP.

Dvoufaktorová autentizace uživatelů VPN prostřednictvím MikroTik a SMS

Dnes vám ukážu, jak chránit MikroTik PPP-VPN i v případě "únosu" uživatelského účtu. Když byla tato schéma implementována jednomu z mých klientů, charakterizoval to stručně: "no, teď to vypadá jako v bance!".

Metoda nepoužívá externí autentifikační služby. Úkoly se plní vnitřními prostředky samotného routeru. Bez nákladů pro připojeného klienta. Způsob funguje jak pro klienty PC, tak pro mobilní zařízení.

Celková schéma ochrany vypadá následujícím způsobem:

  1. Interní IP adresa uživatele, který se úspěšně připojil k VPN serveru, se automaticky dostane na "šedý" seznam.
  2. Událost připojení automaticky generuje jednorázový kód, který je uživateli zaslán jedním z dostupných způsobů.
  3. Adresám na tomto seznamu je omezen přístup k prostředkům místní sítě, kromě služby "autentifikátor", která očekává příjem jednorázového kódu-hesla.
  4. Po předložení kódu se uživateli otevře přístup k interním prostředkům sítě.

První Nejmenší problém, s nímž jsem se setkal, je uchování kontaktních informací o uživateli pro zaslání kódu 2FA. Ponožku, že nebylo možné vytvořit libovolná datová pole odpovídající uživatelům v Mikrotiku, bylo použito existující pole "poznámka":

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

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

Ano, schémata s SMS přinášejí náklady. Ale pokud se podíváte podrobněji, "bezpečnost je vždy o penězích" (c).
Schéma s e-mailem se mi osobně nelíbí. Ne proto, že vyžaduje dostupnost poštovního serveru pro autentizovatelného klienta — není problém rozdělit provoz. Nicméně, pokud klient neopatrně uchovával hesla jak na VPN, tak v e-mailu v prohlížeči a pak ztratil svůj notebook, útočník získá úplný přístup k firemní síti.

Takže, rozhodnuto — doručujeme jednorázový kód pomocí SMS zpráv.

Třetí problém byl v tom, kde a jak v MikroTik vygenerovat pseudonáhodný kód pro 2FA. Ve skriptovacím jazyce RouterOS neexistuje analog funkce random() a předtím jsem viděl několik zkratkových skriptovacích generátorů pseudonáhodných čísel. Žádný z nich se mi z různých důvodů nelíbil.

Ve skutečnosti generátor pseudonáhodných posloupností v MikroTik EXISTUJE! Je skrytý na povrchu v kontextu /certificates scep-server. První způsob získat jednorázové heslo je jednoduché a snadné — příkazem /certificates scep-server otp generate. Pokud provedeme jednoduchou operaci přiřazení proměnné, získáme hodnotu typu pole, kterou lze dále použít ve skriptech.

Druhý způsob získání jednorázového hesla, které také lze snadno aplikovat — použití externího servisu random.org k vygenerování požadovaného typu posloupnosti pseudonáhodných čísel. Zde je zjednodušený konzole příklad získá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

Dotaz formátovaný pro konzoli (v těle skriptu bude třeba escapovat speciální znaky) získá řetězec složený ze šesti znaků-čísel do proměnné $rnd1. Následující příkaz „put“ jednoduše zobrazí proměnnou v konzoli MikroTik.

Čtvrtý problém, který bylo nutné rychle vyřešit — jak a kam připojený klient předá svůj jednorázový kód ve druhé fázi autentizace.

Dvoufaktorová autentizace uživatelů VPN prostřednictvím MikroTik a SMS

Na routeru MikroTik by měla existovat služba schopná přijmout kód a přiřadit ho konkrétnímu klientovi. Při shodě zadaného kódu s očekávaným by měl adresu klienta zařadit do jakéhosi „bílého“ seznamu, adresám z něhož je povolený přístup do vnitřní sítě společnosti.

Vzhledem k omezenému výběru služeb bylo rozhodnuto přijímat kódy přes http pomocí webproxy integrováného v MikroTiku. A protože firewall umí pracovat s dynamickými seznamy IP adres, vyhledává kód, porovnává ho s klientskou IP a zařazuje jej do "bílého" seznamu právě firewall pomocí Layer7 regexp. Samotnému routeru bylo přiřazeno podmínkové DNS jméno „gw.local“, na něm byla vytvořena statická A-záznam pro poskytování PPP klientům:

. Vytvořte A-záznam blog a určete pro něj nějakou fiktivní IP (to je oficiální
/ip dns static add name=gw.local address=172.31.1.1

Zachycení proxy provozu neověřených klientů:
/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írat tcp spojení s klienty;

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

Konfigurace proxy
/ip proxy
nastavit povolený=yes port=3128
/ip proxy access
přidat akci=zamítnout zakázáno=ne přesměrovat-na=gw.local./mikrotik_logo.png src-adresa=0.0.0.0/0

Uvedu důležité prvky konfigurace:

  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 klientů VPN;
  3. address_list „2fa_approved“ — „bílý“ seznam tunelových IP adres klientů VPN, kteří úspěšně prošli dvoufaktorovou autentizací.
  4. řetězec firewallu „input_2fa“ — v něm probíhá kontrola tcp paketů na přítomnost autorizačního kódu a shodu IP adresy odesílatele kódu s požadovanou. Pravidla v řetězci se přidávají a odstraňují dynamicky.

Zjednodušený blokový diagram zpracování paketu vypadá takto:

Dvoufaktorová autentizace uživatelů VPN prostřednictvím MikroTik a SMS

Aby se provoz klientů ze "šedého" seznamu, kteří ještě neprošli druhým fázím autentizace, dostal do kontroly podle Layer7, bylo ve standardním řetězci „input“ vytvořeno pravidlo:

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

Teď začneme propojit všechny tyto prvky se službou PPP. MikroTik umožňuje používat skripty v profilech (ppp-profile) a přiřazovat je k událostem vzniku a ukončení ppp spojení. Nastavení ppp-profile může být aplikováno jak na PPP server jako celek, tak pro jednotlivé uživatele. Přitom přiřazený profil uživateli má prioritu, přičemž jeho nastavené parametry přepisují parametry profilu vybraného pro server jako celek.

Díky takovému přístupu můžeme vytvořit speciální profil pro dvoufaktorovou autentizaci a přiřadit ho nikoli všem uživatelům, ale pouze těm, které považujeme za potřebné. To může být relevantní v případě, že služby PPP používáte nejen pro připojení koncových uživatelů, ale také pro vytváření site-to-site spojení.

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

winbox
Dvoufaktorová autentizace uživatelů VPN prostřednictvím 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

Je nezbytné společně používat „address-list“ a „interface-list“, abychom určovali a zachycovali provoz od VPN klientů, kteří neprošli sekundární autorizací, v řetězci dstnat (prerouting).

Jakmile je příprava dokončena, vytváříme další řetězce firewallu a profil, napíšeme skript, který odpovídá za automatizaci generování kódu 2FA a jednotlivých pravidel firewallu.

Dokumentace wiki.mikrotik.com na PPP-Profile nás obohacuje informacemi o proměnných spojených s událostmi připojení-odpojení PPP klienta „Spustit skript při události přihlášení uživatele. Tyto proměnné jsou dostupné pro skript události: uživatel, lokální-adresa, vzdálená-adresa, caller-id, called-id, rozhraní“. Některé z nich nám budou velmi užitečné.

Kód použitý v profilu pro událost připojení PPP on-up

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

"místní-adresa")
:log info (

"vzdálená-adresa")
:log info (

"volající-id")
:log info (

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

"rozhraní") název])
#Объявляем свои локальные переменные
:místní seznam "2fa_jailed"
:místní viamodem false
:místní modemport "usb2"
#ищем автоматически созданную запись в адрес-листе "2fa_jailed"
:místní recnum1 [/ip fi address-list find address=(

"vzdálená-adresa") 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
:místní vphone [/ppp secret get [find name=$user] comment]

#Готовим тело сообщения. Если клиент подключается к VPN прямо с телефона ему достаточно
#будет перейти прямо по ссылке из полученного сообщения
:místní msgboby ("Váš kód: ".$comm1."n Nebo otevřete odkaz 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)
:místní vcomment ("2fa_".(

"vzdálená-adresa"))
/ip firewall layer7-protocol add name=(

"vcomment") comment=(

"vzdálená-adresa") 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") protokol=tcp src-address=(

"vzdálená-adresa") dst-limit=1,1,src-address/1m40s


Speciálně pro ty, kteří rádi bezmyšlenkovitě kopírují, varuji — kód je převzat z testovací verze a může obsahovat drobné překlepy. Zjistit, kde přesně, pro chápajícího člověka nebude obtížné.

Při odpojení uživatele je generována událost „On-Down“ a vyvolán odpovídající skript s parametry. Úkolem tohoto skriptu je vyčistit pravidla firewallu, která byla vytvořena pro odpojeného uživatele.

Kód použitý v profilu pro událost připojení PPP on-down

:místní vcomment ("2fa_".(

"vzdálená-adresa"))
/ip firewall address-list remove [find address=(

"remote-address") list=2fa_approved]
/ip firewall filter remove [find chain="input_2fa" src-address=(

"remote-address") ]
/ip firewall layer7-protocol remove [find name=$vcomment]


Po tom můžete vytvářet uživatele a přiřazovat všem nebo některým z nich profil s dvoufaktorovou autentizací.

winbox
Dvoufaktorová autentizace uživatelů VPN prostřednictvím MikroTik a SMS

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

Jak to vypadá na straně klienta.

Při navazování VPN připojení přijde na telefon/tablet s Androidem/iOS se SIM kartou SMS přibližně takového znění:

SMSka
Dvoufaktorová autentizace uživatelů VPN prostřednictvím MikroTik a SMS

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

Pokud je VPN připojení nastaveno z PC, uživateli stačí minimální forma zadání hesla. Malá forma ve formátu HTML je uživateli předána při nastavování VPN. Tento soubor lze dokonce poslat e-mailem, aby si ho uživatel uložil a vytvořil zkratku na vhodném místě. Přibližně takto to vypadá:

Zkratka na ploše
Dvoufaktorová autentizace uživatelů VPN prostřednictvím MikroTik a SMS

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

Snímek formuláře
Dvoufaktorová autentizace uživatelů VPN prostřednictvím MikroTik a SMS

Formulář je nejprimitivnější, je dán jako příklad. Zájemci mohou upravit podle svých potřeb.

2fa_login_mini.html

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

Pokud autorizace proběhla úspěšně, uživatel v prohlížeči uvidí logo MikroTik, což by mělo být signálem úspěšného ověření:

Dvoufaktorová autentizace uživatelů VPN prostřednictvím MikroTik a SMS

Pozoruji, že obrázek se vrací z integrovaného webového serveru MikroTik pomocí WebProxy Deny Redirect.

Myslím, že obrázek lze přizpůsobit pomocí nástroje "hotspot", nahráním svého vlastního variantu a nastavením na něj Deny Redirect URL s WebProxy.

Velká prosba k těm, kteří se snaží nahradit nejlevnější "hračkový" MikroTik za 20 USD router za 500 USD — nedělejte to. Zařízení typu "hAP Lite"/"hAP mini" (home access point) mají velmi slabý CPU (smips) a pravděpodobně neunesou zátěž v podnikatelském segmentu.

Upozornění! Toto řešení má jednu nevýhodu: při připojování a odpojování klientů dochází ke změnám v konfiguraci, kterou se router snaží uchovat v své energeticky nezávislé paměti. Při velkém množství klientů a častých připojeních a odpojeních to může vést k degradaci interního úložiště v routeru.

P.S.: Metody doručení kódu klientovi mohou být rozšířeny a doplněny podle vašich programátorských možností. Například můžete posílat zprávy do Telegramu nebo… navrhněte možnosti!

Doufám, že článek bude pro vás užitečný a pomůže učinit sítě malých a středních podniků o něco bezpečnějšími.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster