Dvostopenjska avtentikacija VPN uporabnikov preko MikroTik in SMS

Pozdravljeni kolegi! Danes, ko so se strasti okoli "dela na daljavo" nekoliko polegle, večina skrbnikov je dobila nalogo oddaljenega dostopa zaposlenih do omrežja podjetja, je čas, da delim svoje dolgoletne izkušnje pri izboljšanju varnosti VPN. Ta članek zdaj ne bo moden IPSec IKEv2 in xAuth. Gre za izgradnjo sistema. dvofaktorska avtentikacija (2FA) Uporabniki VPN, ko MikroTik deluje kot strežnik VPN. Namreč pri uporabi "klasičnih" protokolov, kot je PPP.

Dvostopenjska avtentikacija VPN uporabnikov preko MikroTik in SMS

Danes vam bom povedal, kako zaščititi MikroTik PPP-VPN tudi v primeru "ugrabitve" uporabniškega računa. Ko je bila ta shema predstavljena eni od mojih strank, jo je na kratko opisal kot "no, zdaj je kot v banki!".

Metoda ne uporablja zunanjih storitev preverjanja pristnosti. Naloge interno izvaja sam usmerjevalnik. Brez stroškov za povezovalnega odjemalca. Metoda deluje tako za osebne odjemalce kot za mobilne naprave.

Splošna zaščitna shema je naslednja:

  1. Notranji naslov IP uporabnika, ki se je uspešno povezal s strežnikom VPN, je samodejno uvrščen na sivi seznam.
  2. Dogodek povezave samodejno ustvari enkratno kodo, ki je poslana uporabniku na enega od razpoložljivih načinov.
  3. Naslovi na tem seznamu imajo omejen dostop do virov lokalnega omrežja, z izjemo storitve »avtentifikator«, ki čaka na prejem enkratnega gesla.
  4. Po predstavitvi kode ima uporabnik dostop do notranjih virov omrežja.

Prvič najmanjši problem, s katerim sem se moral soočiti, je bilo shranjevanje kontaktnih podatkov o uporabniku, da bi mu poslal kodo 2FA. Ker v Mikrotiku ni mogoče ustvariti poljubnih podatkovnih polj, ki ustrezajo uporabnikom, je bilo uporabljeno obstoječe polje »komentar«:

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

2. problem se je izkazal za resnejšega - izbira poti in načina dostave kode. Trenutno se izvajajo tri sheme: a) SMS prek USB-modema b) e-pošta c) SMS prek e-pošte, ki je na voljo pravnim osebam mobilnega operaterja.

Da, SMS sheme prinašajo stroške. Toda če pogledate, je "varnost vedno povezana z denarjem" (c).
Meni osebno shema z e-pošto ni všeč. Pa ne zato, ker zahteva, da je poštni strežnik na voljo odjemalcu, ki se preverja pristnosti - promet ni problem razdeliti. Če pa bi odjemalec malomarno shranil gesla za vpn in e-pošto v brskalnik in nato izgubil svoj prenosnik, bi napadalec z njega pridobil popoln dostop do omrežja podjetja.

Tako je odločeno - enkratno kodo dostavimo s pomočjo SMS sporočil.

Tretji Problem je bil kje kako ustvariti psevdonaključno kodo za 2FA v MikroTiku. V skriptnem jeziku RouterOS ni analoga funkcije random() in prej sem videl več generatorjev psevdonaključnih števil skriptov. Nobena mi ni bila všeč iz različnih razlogov.

Pravzaprav je v MikroTiku generator psevdonaključnega zaporedja! Površnemu pogledu je skrito v kontekstu /certificates scep-strežnika. Prvi način pridobitev enkratnega gesla je enostavna in preprosta – z ukazom /certificates scep-strežnik otp generiraj. Če izvedemo preprosto operacijo dodelitve spremenljivke, bomo dobili vrednost polja, ki jo lahko kasneje uporabimo v skriptih.

Drugi način pridobitev enkratnega gesla, ki ga je tudi enostavno uporabiti – z uporabo zunanje storitve random.org za generiranje želene vrste zaporedja psevdonaključnih števil. Tukaj je poenostavljeno konzola primer pridobivanja podatkov v spremenljivki:

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

Zahteva, oblikovana za konzolo (v telesu skripta bodo potrebni ubežni posebni znaki), prejme niz šestih števk v spremenljivko $rnd1. Naslednji ukaz "put" preprosto prikaže spremenljivko v konzoli MikroTik.

Četrti problem kar je bilo treba hitro rešiti - tako in kam bo povezani odjemalec prenesel svojo enkratno kodo na drugi stopnji avtentikacije.

Dvostopenjska avtentikacija VPN uporabnikov preko MikroTik in SMS

Na usmerjevalniku MikroTik mora obstajati storitev, ki lahko sprejme kodo in jo poveže z določenim odjemalcem. Če se podana koda ujema s pričakovano, je treba naslov naročnika uvrstiti na določeno »belo« listo, naslovi s katerih je dovoljen dostop do internega omrežja podjetja.

Zaradi slabe izbire storitev smo se odločili za sprejemanje kod preko http preko webproxyja, vgrajenega v Mikrotik. In ker lahko požarni zid deluje z dinamičnimi seznami naslovov IP, je požarni zid tisti, ki išče kodo, jo ujema z IP-jem odjemalca in jo doda na »beli« seznam z uporabo regularnega izraza Layer7. Usmerjevalniku samemu je bilo dodeljeno pogojno ime DNS "gw.local", na njem je bil ustvarjen statični A-zapis za izdajo odjemalcem PPP:

DNS
/ip dns static add ime=gw.lokalni naslov=172.31.1.1

Zajem prometa nepreverjenih strank na proxyju:
/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 tem primeru ima proxy dve funkciji.

1. Odprite tcp povezave z odjemalci;

2. V primeru uspešne avtorizacije preusmerite brskalnik odjemalca na stran ali sliko z obvestilom o uspešni avtentikaciji:

Konfiguracija proxyja
/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

Naštel bom pomembne konfiguracijske elemente:

  1. seznam vmesnikov "2fa" - dinamičen seznam odjemalskih vmesnikov, promet iz katerih zahteva obdelavo znotraj 2FA;
  2. seznam naslovov "2fa_jailed" - "siv" seznam naslovov IP tunela odjemalcev VPN;
  3. address_list "2fa_approved" - "bel" seznam tunelskih IP naslovov odjemalcev VPN, ki so uspešno prestali dvofaktorsko avtentikacijo.
  4. veriga požarnega zidu "input_2fa" - preverja pakete tcp za prisotnost avtorizacijske kode in ujema naslov IP pošiljatelja kode z zahtevanim. Pravila v verigi se dodajajo in odstranjujejo dinamično.

Poenostavljen diagram poteka obdelave paketov izgleda takole:

Dvostopenjska avtentikacija VPN uporabnikov preko MikroTik in SMS

Za vstop v preverjanje Layer7 prometa od strank s "sivega" seznama, ki še niso opravili druge stopnje avtentikacije, je bilo ustvarjeno pravilo v standardni "vhodni" verigi:

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

Zdaj pa začnimo vse to bogastvo pritrditi na storitev JPP. MikroTik omogoča uporabo skript v profilih (ppp-profil) in njihovo dodelitev dogodkom vzpostavljanja in prekinitve ppp povezave. Nastavitve profila ppp lahko uporabite tako za strežnik PPP kot celoto kot za posamezne uporabnike. Hkrati ima profil, dodeljen uporabniku, prednost, ki preglasi parametre profila, izbranega za strežnik kot celoto, s svojimi navedenimi parametri.

Kot rezultat tega pristopa lahko ustvarimo poseben profil za dvostopenjsko avtentikacijo in ga ne dodelimo vsem uporabnikom, ampak samo tistim, ki menijo, da je to potrebno. To je lahko pomembno, če ne uporabljate storitev PPP samo za povezovanje končnih uporabnikov, ampak hkrati tudi za izgradnjo povezav od mesta do mesta.

V novo ustvarjenem posebnem profilu uporabljamo dinamično dodajanje naslova in vmesnika povezanega uporabnika na »sive« sezname naslovov in vmesnikov:

winbox
Dvostopenjska avtentikacija VPN uporabnikov preko MikroTik in SMS

Koda:
/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

Za odkrivanje in zajemanje prometa od ne-sekundarnih odjemalcev VPN v verigi dstnat (predusmerjanje) je treba uporabiti seznama "seznam naslovov" in "seznam vmesnika".

Ko bo priprava končana, bodo ustvarjene dodatne verige požarnega zidu in profil, bomo napisali skripto za samodejno generiranje kode 2FA in posameznih pravil požarnega zidu.

Dokumentacija wiki.mikrotik.com na PPP-profilu nas obogati z informacijami o spremenljivkah, povezanih z dogodki povezave-prekinitve odjemalca PPP "Izvedi skript ob dogodku prijave uporabnika. To so razpoložljive spremenljivke, do katerih lahko dostopa skript dogodka: uporabnik, lokalni naslov, oddaljeni naslov, ID klicatelja, ID klicanega, vmesnik". Nekateri od njih so nam zelo uporabni.

Koda, uporabljena v profilu za dogodek ob vzpostavitvi povezave 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

Še posebej za tiste, ki radi brezglavo kopirate in prilepite, opozarjam - koda je vzeta iz testne različice in lahko vsebuje manjše tipkarske napake. Razumevajočemu človeku ne bo težko ugotoviti, kje točno.

Ko uporabnik prekine povezavo, se ustvari dogodek »On-Down« in pokliče ustrezen skript s parametri. Naloga tega skripta je počistiti pravila požarnega zidu, ustvarjena za odklopljenega uporabnika.

Koda, uporabljena v profilu za dogodek PPP on-down povezave

: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]
Nato lahko ustvarite uporabnike in jih vse ali nekatere dodelite profilu dvofaktorske avtentikacije.

winbox
Dvostopenjska avtentikacija VPN uporabnikov preko MikroTik in SMS

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

Kako to izgleda na strani naročnika.

Ko je vzpostavljena povezava VPN, telefon/tablica Android/iOS s kartico SIM prejme takšno sporočilo SMS:

SMS
Dvostopenjska avtentikacija VPN uporabnikov preko MikroTik in SMS

Če je povezava vzpostavljena neposredno iz telefona / tablice, lahko greste skozi 2FA preprosto s klikom na povezavo v sporočilu. Udobno je.

Če je povezava VPN vzpostavljena iz osebnega računalnika, bo uporabnik moral vnesti minimalno geslo. Majhen obrazec v obliki datoteke HTML prejme uporabnik ob nastavitvi VPN. Datoteko lahko pošljete celo po pošti, tako da jo uporabnik shrani in ustvari bližnjico na priročnem mestu. Videti je takole:

Etiketa na mizi
Dvostopenjska avtentikacija VPN uporabnikov preko MikroTik in SMS

Uporabnik klikne na bližnjico, odpre se preprost obrazec za vnos kode, ki kodo prilepi na odprt URL:

Obrazec zaslona
Dvostopenjska avtentikacija VPN uporabnikov preko MikroTik in SMS

Kot primer je navedena najbolj primitivna oblika. Kdor želi, ga lahko prilagodi zase.

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>

Če je bila avtorizacija uspešna, bo uporabnik v brskalniku videl logotip MikroTik, kar naj bi signaliziralo uspešno avtentikacijo:

Dvostopenjska avtentikacija VPN uporabnikov preko MikroTik in SMS

Upoštevajte, da je slika vrnjena iz vgrajenega spletnega strežnika MikroTik z uporabo WebProxy Deny Redirect.

Predvidevam, da je sliko mogoče prilagoditi z orodjem "hotspot", tja naložite svojo različico in ji nastavite URL za zavrnitev preusmeritve z WebProxy.

Velika prošnja tistim, ki poskušate kupiti najcenejšo "igračko" Mikrotik za 20$ in z njo zamenjati 500$ vreden router - nikar ne počnite tega. Naprave, kot je "hAP Lite" / "hAP mini" (domača dostopna točka), imajo zelo šibek CPU (smips) in verjetno ne bodo kos obremenitvi v poslovnem segmentu.

Opozorilo! Ta rešitev ima eno pomanjkljivost: ko se odjemalci povežejo ali prekinejo, pride do sprememb konfiguracije, ki jih usmerjevalnik poskuša shraniti v svoj obstojni pomnilnik. Pri velikem številu odjemalcev ter pogostih povezavah in prekinitvah lahko to povzroči degradacijo notranjega pomnilnika v usmerjevalniku.

PS: Metode za dostavo kode odjemalcu lahko razširite in dopolnite, kolikor zadoščajo vaše programerske sposobnosti. Na primer, lahko pošljete sporočila telegramu ali ... predlagate možnosti!

Upam, da vam bo članek koristen in bo pripomogel k večji varnosti omrežij malih in srednje velikih podjetij.

Vir: www.habr.com