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.
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:
- Notranji naslov IP uporabnika, ki se je uspešno povezal s strežnikom VPN, je samodejno uvrščen na sivi seznam.
- Dogodek povezave samodejno ustvari enkratno kodo, ki je poslana uporabniku na enega od razpoložljivih načinov.
- Naslovi na tem seznamu imajo omejen dostop do virov lokalnega omrežja, z izjemo storitve »avtentifikator«, ki čaka na prejem enkratnega gesla.
- 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
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.
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:
- seznam vmesnikov "2fa" - dinamičen seznam odjemalskih vmesnikov, promet iz katerih zahteva obdelavo znotraj 2FA;
- seznam naslovov "2fa_jailed" - "siv" seznam naslovov IP tunela odjemalcev VPN;
- address_list "2fa_approved" - "bel" seznam tunelskih IP naslovov odjemalcev VPN, ki so uspešno prestali dvofaktorsko avtentikacijo.
- 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:
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:
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.
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
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
Č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
Uporabnik klikne na bližnjico, odpre se preprost obrazec za vnos kode, ki kodo prilepi na odprt URL:
Obrazec zaslona
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:
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