Dviejų veiksnių VPN vartotojų autentifikavimas per MikroTik ir SMS

Sveiki kolegos! Šiandien, kai aistros apie „nuotolinį darbą“ po truputį atslūgo, dauguma adminų laimėjo užduotį dėl nuotolinės darbuotojų prieigos prie įmonės tinklo, metas pasidalinti savo ilgamete patirtimi gerinant VPN saugumą. Šis straipsnis dabar nebus madingas IPSec IKEv2 ir xAuth. Kalbama apie sistemos kūrimą. dviejų veiksnių autentifikavimas (2FA) VPN vartotojai, kai MikroTik veikia kaip VPN serveris. Būtent, kai naudojami „klasikiniai“ protokolai, tokie kaip PPP.

Dviejų veiksnių VPN vartotojų autentifikavimas per MikroTik ir SMS

Šiandien aš jums pasakysiu, kaip apsaugoti „MikroTik PPP-VPN“, net jei vartotojo abonementas yra „užgrobtas“. Kai ši schema buvo pristatyta vienam iš mano klientų, jis trumpai apibūdino ją taip: „na, dabar tai kaip banke!“.

Šis metodas nenaudoja išorinių autentifikavimo paslaugų. Užduotis viduje atlieka pats maršrutizatorius. Prisijungiančiam klientui nereikia mokėti. Metodas tinka tiek asmeniniams kompiuteriams, tiek mobiliesiems įrenginiams.

Bendra apsaugos schema yra tokia:

  1. Vartotojo, sėkmingai prisijungusio prie VPN serverio, vidinis IP adresas automatiškai įtraukiamas į pilkąjį sąrašą.
  2. Ryšio įvykis automatiškai sugeneruoja vienkartinį kodą, kuris siunčiamas vartotojui vienu iš galimų metodų.
  3. Šiame sąraše esantys adresai turi ribotą prieigą prie vietinio tinklo išteklių, išskyrus „autentifikatoriaus“ paslaugą, kuri laukia, kol gaus vienkartinį prieigos kodą.
  4. Pateikęs kodą, vartotojas turi prieigą prie vidinių tinklo išteklių.

pirmas mažiausia problema, su kuria teko susidurti, buvo kontaktinės informacijos apie vartotoją saugojimas, kad būtų galima išsiųsti jam 2FA kodą. Kadangi „Mikrotik“ neįmanoma sukurti savavališkų duomenų laukų, atitinkančių vartotojus, buvo naudojamas esamas „komentarų“ laukas:

/ppp paslaptys pridėti vardas=Petrovo slaptažodis=4M@ngr! comment="89876543210"

Antrasis problema pasirodė rimtesnė – kodo pristatymo kelio ir būdo pasirinkimas. Šiuo metu įgyvendinamos trys schemos: a) SMS per USB modemą b) el. paštu c) SMS žinute el. paštu, prieinama raudonojo korinio ryšio operatoriaus verslo klientams.

Taip, SMS schemos kainuoja. Bet jei pažvelgsite, „saugumas visada susijęs su pinigais“ (c).
Man asmeniškai nepatinka schema su el. Ne todėl, kad reikia, kad pašto serveris būtų pasiekiamas autentifikuojamam klientui – srauto skaidymas nėra problema. Tačiau jei klientas nerūpestingai naršyklėje išsaugojo VPN ir el. pašto slaptažodžius ir pametė nešiojamąjį kompiuterį, užpuolikas iš jo gautų visišką prieigą prie įmonės tinklo.

Taigi, nuspręsta – vienkartinį kodą pristatome SMS žinutėmis.

Третья Problema buvo kur kaip sugeneruoti pseudoatsitiktinį 2FA kodą MikroTik. RouterOS scenarijų kalboje nėra random() funkcijos analogo, be to, anksčiau mačiau keletą pseudoatsitiktinių skaičių generatorių. Nė vienas jų man nepatiko dėl įvairių priežasčių.

Tiesą sakant, „MikroTik“ yra pseudoatsitiktinės sekos generatorius! Jis yra paslėptas nuo paviršutiniško žvilgsnio /certificates scep-server kontekste. Pirmasis būdas gauti vienkartinį slaptažodį lengva ir paprasta – su komanda /certificates scep-server otp generuoti. Jei atliksime paprastą kintamųjų priskyrimo operaciją, gausime masyvo reikšmę, kurią vėliau bus galima panaudoti scenarijuose.

Antrasis būdas gauti vienkartinį slaptažodį, kurį taip pat lengva pritaikyti, naudojant išorinę paslaugą random.org kad būtų sukurta norimos rūšies pseudoatsitiktinių skaičių seka. Čia yra supaprastinta konsolė duomenų įvedimo į kintamąjį pavyzdys:

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

Užklausa, suformatuota konsolei (scenarijaus turinyje reikės atskirti specialiuosius simbolius), į $rnd1 kintamąjį patenka šešių skaitmenų eilutė. Ši komanda „įdėti“ tiesiog rodo kintamąjį „MikroTik“ pulte.

Ketvirta problema kurią reikėjo greitai išspręsti – štai kaip ir kur prisijungęs klientas perduos savo vienkartinį kodą antrajame autentifikavimo etape.

Dviejų veiksnių VPN vartotojų autentifikavimas per MikroTik ir SMS

MikroTik maršrutizatoriuje turi būti paslauga, galinti priimti kodą ir suderinti jį su konkrečiu klientu. Jeigu pateiktas kodas sutampa su laukiamu, kliento adresas turi būti įtrauktas į tam tikrą „baltąjį“ sąrašą, iš kurio adresais leidžiama prisijungti prie įmonės vidinio tinklo.

Dėl prasto paslaugų pasirinkimo, buvo nuspręsta kodus priimti per http naudojant Mikrotik įmontuotą webproxy. Ir kadangi ugniasienė gali dirbti su dinaminiais IP adresų sąrašais, būtent užkarda atlieka kodo paiešką, suderindama jį su kliento IP ir įtraukdama į „baltąjį“ sąrašą naudodama Layer7 regexp. Pačiam maršrutizatoriui buvo priskirtas sąlyginis DNS pavadinimas „gw.local“, jame buvo sukurtas statinis A įrašas, skirtas išduoti PPP klientams:

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

Nepatvirtintų klientų srauto fiksavimas tarpiniame serveryje:
/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

Šiuo atveju tarpinis serveris atlieka dvi funkcijas.

1. Atidaryti tcp ryšius su klientais;

2. Sėkmingo autorizavimo atveju nukreipkite kliento naršyklę į puslapį arba paveikslėlį, pranešantį apie sėkmingą autentifikavimą:

Tarpinio serverio konfigūracija
/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

Išvardinsiu svarbius konfigūracijos elementus:

  1. sąsajų sąrašas „2fa“ – dinaminis klientų sąsajų sąrašas, iš kurio srautą reikia apdoroti 2FA;
  2. adresų sąrašas "2fa_jaled" - "pilkas" VPN klientų tunelinių IP adresų sąrašas;
  3. address_list „2fa_approved“ – „baltas“ VPN klientų, sėkmingai praėjusių dviejų veiksnių autentifikavimą, tunelinių IP adresų sąrašas.
  4. ugniasienės grandinė "input_2fa" - ji patikrina tcp paketus, ar nėra autorizacijos kodo, ir suderina kodo siuntėjo IP adresą su reikiamu. Taisyklės grandinėje pridedamos ir pašalinamos dinamiškai.

Supaprastinta paketų apdorojimo schema atrodo taip:

Dviejų veiksnių VPN vartotojų autentifikavimas per MikroTik ir SMS

Norėdami patekti į „Layer7“ srauto patikrinimą iš klientų iš „pilkojo“ sąrašo, kurie dar nepraėjo antrojo autentifikavimo etapo, standartinėje „įvesties“ grandinėje buvo sukurta taisyklė:

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

Dabar pradėkime visus šiuos turtus pririšti prie PPP paslaugos. MikroTik leidžia naudoti scenarijus profiliuose (ppp-profilis) ir priskirti juos ppp ryšio užmezgimo ir nutraukimo įvykiams. Ppp profilio parametrai gali būti taikomi tiek visam PPP serveriui, tiek atskiriems vartotojams. Tuo pačiu metu vartotojui priskirtas profilis turi pirmenybę, nepaisydamas visam serveriui pasirinkto profilio parametrų nurodytais parametrais.

Dėl šio požiūrio galime sukurti specialų dviejų veiksnių autentifikavimo profilį ir priskirti jį ne visiems vartotojams, o tik tiems, kurie mano, kad tai būtina. Tai gali būti aktualu, jei PPP paslaugas naudojate ne tik galutiniams vartotojams sujungti, bet tuo pačiu ir ryšiams tarp svetainių kurti.

Naujai sukurtame specialiame profilyje naudojame dinamišką prisijungusio vartotojo adreso ir sąsajos papildymą „pilkuose“ adresų ir sąsajų sąrašuose:

winbox
Dviejų veiksnių VPN vartotojų autentifikavimas per MikroTik ir SMS

Kodas
/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

Norint aptikti ir užfiksuoti srautą iš ne antrinių VPN klientų dstnat (išankstinio maršruto parinkimo) grandinėje, būtina naudoti ir „adresų sąrašo“, ir „sąsajų sąrašo“ sąrašus.

Kai bus baigtas pasiruošimas, sukurtos papildomos ugniasienės grandinės ir profilis, parašysime scenarijų, atsakingą už automatinį 2FA kodo generavimą ir individualias ugniasienės taisykles.

Dokumentacija wiki.mikrotik.com PPP-Profile praturtina mus informacija apie kintamuosius, susijusius su PPP kliento prisijungimo-atjungimo įvykiais "Vykdyti scenarijų vartotojo prisijungimo įvykyje. Tai yra galimi kintamieji, kuriuos galima pasiekti renginio scenarijui: vartotojas, vietinis adresas, nuotolinis adresas, skambintojo ID, skambučio ID, sąsaja.. Kai kurie iš jų mums labai naudingi.

PPP prisijungimo įvykio profilyje naudojamas kodas

#Логируем для отладки полученные переменные 
: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

Ypač tiems, kurie mėgsta be proto kopijuoti-įklijuoti, perspėju – kodas paimtas iš bandomosios versijos ir gali turėti smulkių rašybos klaidų. Supratingam žmogui nebus sunku tiksliai išsiaiškinti, kur.

Kai vartotojas atsijungia, sugeneruojamas įvykis „On-Down“ ir iškviečiamas atitinkamas scenarijus su parametrais. Šio scenarijaus užduotis yra išvalyti užkardos taisykles, sukurtas atsijungusiam vartotojui.

Kodas, naudojamas profilyje PPP išjungimo įvykiui

: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]
Tada galite sukurti vartotojus ir visus arba kai kuriuos iš jų priskirti dviejų veiksnių autentifikavimo profiliui.

winbox
Dviejų veiksnių VPN vartotojų autentifikavimas per MikroTik ir SMS

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

Kaip tai atrodo iš kliento pusės.

Kai užmezgamas VPN ryšys, „Android“ / „iOS“ telefonas / planšetinis kompiuteris su SIM kortele gauna tokį SMS pranešimą:

trumpoji žinutė
Dviejų veiksnių VPN vartotojų autentifikavimas per MikroTik ir SMS

Jei ryšys užmegztas tiesiai iš telefono / planšetinio kompiuterio, galite pereiti per 2FA tiesiog spustelėdami pranešimo nuorodą. Tai patogu.

Jei VPN ryšys užmezgamas iš kompiuterio, vartotojas turės įvesti minimalų slaptažodžio formą. Nustatant VPN vartotojui suteikiama nedidelė HTML failo forma. Failas netgi gali būti siunčiamas paštu, kad vartotojas jį išsaugotų ir patogioje vietoje sukurtų nuorodą. Tai atrodo taip:

Etiketė ant stalo
Dviejų veiksnių VPN vartotojų autentifikavimas per MikroTik ir SMS

Vartotojas paspaudžia nuorodą, atsidaro paprasta kodo įvedimo forma, kuri įklijuos kodą į atidarytą URL:

Ekrano forma
Dviejų veiksnių VPN vartotojų autentifikavimas per MikroTik ir SMS

Kaip pavyzdys pateikiama primityviausia forma. Norintys gali keisti patys.

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>

Jei autorizacija buvo sėkminga, vartotojas naršyklėje matys MikroTik logotipą, kuris turėtų reikšti sėkmingą autentifikavimą:

Dviejų veiksnių VPN vartotojų autentifikavimas per MikroTik ir SMS

Atminkite, kad vaizdas grąžinamas iš integruoto MikroTik žiniatinklio serverio naudojant WebProxy Deny Redirect.

Manau, kad vaizdą galima tinkinti naudojant „hotspot“ įrankį, įkeliant ten savo versiją ir naudojant „WebProxy“ nustatant neleisti nukreipti URL.

Didelis prašymas tiems, kurie bando nusipirkti pigiausią „žaislą“ Mikrotik už 20 USD ir juo pakeisti 500 USD kainuojantį maršrutizatorių – nedarykite to. Tokie įrenginiai kaip „hAP Lite“ / „hAP mini“ (namų prieigos taškas) turi labai silpną procesorių (smips), todėl tikėtina, kad jie nesusidoros su verslo segmento apkrova.

Dėmesio! Šis sprendimas turi vieną trūkumą: kai klientai prisijungia arba atsijungia, įvyksta konfigūracijos pasikeitimai, kuriuos maršrutizatorius bando išsaugoti savo nepastovioje atmintyje. Esant dideliam klientų skaičiui ir dažniems prisijungimams bei atjungimams, tai gali pabloginti maršrutizatoriaus vidinę atmintį.

PS: Kodo pateikimo klientui metodus galima išplėsti ir papildyti, jei užtenka jūsų programavimo galimybių. Pavyzdžiui, galite siųsti žinutes į telegramą arba ... pasiūlyti parinktis!

Tikiuosi, kad straipsnis jums bus naudingas ir padės padaryti smulkaus ir vidutinio verslo tinklus šiek tiek saugesnius.

Šaltinis: www.habr.com