Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Pozdrav kolege! Danas, kada se strast oko rada na daljinu malo stišala, većina administratora savladala zadatak udaljenog pristupa zaposlenika korporativnoj mreži, vrijeme je da podijelim svoje dugogodišnje iskustvo u poboljšanju VPN sigurnosti. Ovaj članak neće pokrivati ​​trenutno moderne IPSec IKEv2 i xAuth. Radi se o izgradnji sustava autentifikacija u dva faktora (2FA) VPN korisnici kada MikroTik djeluje kao VPN poslužitelj. Naime, kada se koriste “klasični” protokoli poput PPP-a.

Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Danas ću vam reći kako zaštititi MikroTik PPP-VPN čak i ako je vaš korisnički račun otet. Kada je ova shema predstavljena jednom od mojih klijenata, on ju je ukratko opisao kao "pa, sad je kao u banci!"

Metoda ne koristi vanjske usluge autentifikatora. Zadatke interno obavlja sam usmjerivač. Nema troškova za povezanog klijenta. Metoda funkcionira i za PC klijente i za mobilne uređaje.

Opća shema zaštite je sljedeća:

  1. Interna IP adresa korisnika koji se uspješno spojio na VPN poslužitelj automatski se dodaje na sivu listu.
  2. Događaj povezivanja automatski generira jednokratni kod koji se šalje korisniku pomoću jedne od dostupnih metoda.
  3. Adrese na ovom popisu imaju ograničen pristup resursima lokalne mreže, s iznimkom usluge "autentifikatora", koja očekuje primanje jednokratne šifre zaporke.
  4. Nakon predstavljanja koda, korisnik ima pristup internim mrežnim resursima.

Prvi najmanji problem s kojim smo se morali suočiti je pohranjivanje kontakt podataka o korisniku kako bismo mu poslali 2FA kod. Kako je u Mikrotiku nemoguće kreirati proizvoljna podatkovna polja koja odgovaraju korisnicima, korišteno je postojeće polje “komentar”:

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

Drugi problem se pokazao ozbiljnijim - izbor puta i načina dostave koda. Trenutno su implementirane tri sheme: a) SMS putem USB modema b) e-mail c) SMS putem e-maila dostupne za korporativne klijente crvenog mobilnog operatera.

Da, SMS sheme stvaraju troškove. Ali ako pogledate to, "sigurnost je uvijek u novcu" (c).
Meni se osobno ne sviđa shema e-pošte. Ne zato što zahtijeva da poslužitelj pošte bude dostupan klijentu koji se autentificira - nije problem podijeliti promet. Međutim, ako je klijent nemarno spremio lozinke za VPN i e-poštu u preglednik, a zatim izgubio svoje prijenosno računalo, napadač će s njega dobiti potpuni pristup korporativnoj mreži.

Dakle, odlučeno je - isporučujemo jednokratni kod putem SMS poruka.

Treći problem je bio gdje i kako generirati pseudo-nasumični kod za 2FA u MikroTiku. Ne postoji ekvivalent funkciji random() u skriptnom jeziku RouterOS, a prije sam vidio nekoliko gadnih skriptiranih generatora pseudoslučajnih brojeva. Nije mi se sviđao ni jedan ni drugi iz raznih razloga.

Zapravo, u MikroTiku POSTOJI generator pseudoslučajnih sekvenci! Skriven je od površnog pogleda u kontekstu /certificates scep-server. Prvi način dobivanje jednokratne lozinke lako je i jednostavno - naredbom /certifikati scep-poslužitelj otp generirati. Ako izvršimo jednostavnu operaciju dodjele varijabli, dobit ćemo vrijednost niza koja se kasnije može koristiti u skriptama.

Drugi način dobivanje jednokratne lozinke, koja je također jednostavna za korištenje - korištenjem vanjske usluge random.org za generiranje željene vrste niza pseudoslučajnih brojeva. Evo jednog pojednostavljenog konzolni primjer primanja podataka u varijablu:

Šifra
: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

Zahtjev formatiran za konzolu (u tijelu skripte bit će potrebni posebni znakovi za izbjegavanje) prima niz od šest numeričkih znakova u varijablu $rnd1. Sljedeća naredba "put" jednostavno prikazuje varijablu u MikroTik konzoli.

Četvrti problem što je trebalo brzo riješiti bilo je kako i gdje će povezani klijent prenijeti svoj jednokratni kod u drugoj fazi provjere autentičnosti.

Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Na MikroTik routeru mora postojati servis koji može prihvatiti kod i spojiti ga s određenim klijentom. Ako navedeni kod odgovara očekivanom, adresa klijenta mora biti uključena u određenu "bijelu" listu, adresama s kojih je dopušten pristup internoj mreži tvrtke.

Zbog ograničenog izbora servisa odlučeno je da se kodovi prihvaćaju putem http-a putem webproxyja ugrađenog u Mikrotik. A budući da vatrozid može raditi s dinamičkim popisima IP adresa, vatrozid je taj koji traži kod, uspoređuje ga s IP-om klijenta i dodaje ga na "bijelu" listu koristeći Layer7 regexp. Samom usmjerivaču dodijeljen je uvjetni DNS naziv "gw.local", a na njemu je kreiran statički A zapis za izdavanje PPP klijentima:

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

Hvatanje prometa od neprovjerenih klijenata putem proxyja:
/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

U ovom slučaju, proxy ima dvije funkcije.

1. Otvorite TCP veze s klijentima;

2. U slučaju uspješne autorizacije, preusmjerite preglednik klijenta na stranicu ili sliku koja obavještava o uspješnoj autentifikaciji:

Proxy konfiguracija
/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

Navest ću važne elemente konfiguracije:

  1. popis sučelja "2fa" - dinamički popis klijentskih sučelja čiji promet zahtijeva obradu u okviru 2FA;
  2. popis adresa “2fa_jailed” — “sivi” popis IP adresa tunela VPN klijenata;
  3. address_list "2fa_approved" - bijela lista IP adresa tunela VPN klijenata koji su uspješno prošli dvofaktorsku autentifikaciju.
  4. lanac vatrozida “input_2fa” - provjerava TCP pakete na prisutnost autorizacijskog koda i odgovara li IP adresa pošiljatelja koda potrebnoj. Pravila u lancu dodaju se i uklanjaju dinamički.

Pojednostavljeni dijagram toka obrade paketa izgleda ovako:

Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Kako bi se promet od klijenata na “sivoj” listi koji još nisu prošli drugu fazu autentifikacije uključio u Layer7 skeniranje, kreirano je pravilo u standardnom lancu “input”:

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

Sada počnimo sve ovo bogatstvo povezivati ​​s PPP uslugom. MikroTik omogućuje korištenje skripti u profilima (ppp-profil) i njihovo dodjeljivanje događajima postavljanja i prekida ppp veze. Postavke ppp-profila mogu se primijeniti i na PPP poslužitelj kao cjelinu i na pojedinačne korisnike. U ovom slučaju, profil dodijeljen korisniku ima prioritet, nadjačavajući svojim navedenim parametrima parametre profila odabranog za poslužitelj kao cjelinu.

Kao rezultat ovakvog pristupa možemo kreirati poseban profil za dvofaktorsku autentifikaciju i dodijeliti ga ne svim korisnicima, već samo onima za koje smatramo da su to potrebni. Ovo može biti relevantno ako koristite PPP usluge ne samo za povezivanje krajnjih korisnika, već u isto vrijeme za izgradnju veza između stranica.

U novostvorenom posebnom profilu koristimo dinamičko dodavanje adrese i sučelja povezanog korisnika na “sive” liste adresa i sučelja:

winbox
Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Šifra
/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

Neophodno je koristiti popise "address-list" i "interface-list" zajedno za identifikaciju i snimanje prometa od VPN klijenata koji nisu prošli sekundarnu autorizaciju u lancu dstnat (preusmjeravanje).

Kada priprema bude gotova, dodatni firewall lanci i profil su kreirani, mi ćemo napisati skriptu odgovornu za automatsko generiranje 2FA koda i pojedinačnih firewall pravila.

Dokumentacija wiki.mikrotik.com na PPP-profilu obogaćuje nas informacijama o varijablama povezanim s događajima spajanja i prekida veze PPP klijenta "Izvrši skriptu na događaju prijave korisnika. Ovo su dostupne varijable koje su dostupne za skriptu događaja: korisnik, lokalna adresa, udaljena adresa, ID pozivatelja, ID pozivatelja, sučelje". Neki od njih bit će nam vrlo korisni.

Kod koji se koristi u profilu za događaj PPP veze

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

Posebno upozoravam za one koji vole bezumno copy-paste - kod je preuzet iz testne verzije i može sadržavati manje pogreške. Osobi koja ima razumijevanja neće biti teško shvatiti gdje točno.

Kada korisnik prekine vezu, generira se događaj "On-Down" i poziva se odgovarajuća skripta s parametrima. Svrha ove skripte je očistiti pravila vatrozida stvorena za odspojenog korisnika.

Kôd koji se koristi u profilu za događaj PPP on-down veze

: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]
Zatim možete stvoriti korisnike i dodijeliti neke ili sve od njih dvofaktorskom autentifikacijskom profilu.

winbox
Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

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

Kako to izgleda na strani klijenta.

Kada uspostavite VPN vezu, otprilike ovakav SMS šalje se na vaš Android/iOS telefon/tablet sa SIM karticom:

SMS
Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Ako je veza uspostavljena izravno s vašeg telefona/tableta, tada možete proći kroz 2FA jednostavnim klikom na poveznicu iz poruke. Udobno je.

Ako se VPN veza uspostavi s osobnog računala, od korisnika će se tražiti da unese minimalni oblik lozinke. Prilikom postavljanja VPN-a korisniku se šalje mali obrazac u obliku HTML datoteke. Datoteka se čak može poslati poštom kako bi je korisnik mogao spremiti i stvoriti prečac na prikladnom mjestu. Ovako to otprilike izgleda:

Etiketa na stolu
Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Korisnik klikne na prečac, otvara se jednostavan obrazac za unos koda koji će umetnuti kod u otvoreni URL:

Zaslon obrasca
Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Forma je najprimitivnija, navedena kao primjer. Tko želi može ga modificirati po svojoj mjeri.

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>

Ako je autorizacija uspješna, korisnik će vidjeti MikroTik logo u pregledniku, što bi trebalo poslužiti kao signal uspješne autentifikacije:

Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Imajte na umu da se slika vraća s ugrađenog MikroTik web poslužitelja pomoću WebProxy Deny Redirect.

Vjerujem da se slika može prilagoditi pomoću alata "vruće točke", učitavanjem vlastite verzije tamo i postavljanjem URL-a zabrani preusmjeravanje na nju pomoću WebProxyja.

Velika molba onima koji pokušavaju kupiti najjeftiniju “igračku” Mikrotik za 20 dolara i zamijeniti ga ruterom od 500 dolara – nemojte to činiti. Uređaji poput "hAP Lite"/"hAP mini" (kućna pristupna točka) imaju vrlo slab CPU (smips) i vjerojatno se neće nositi s opterećenjem u poslovnom segmentu.

Upozorenje! Ovo rješenje ima jedan nedostatak: kada se klijenti spajaju ili odspajaju, dolazi do promjena konfiguracije koje usmjerivač pokušava spremiti u svoju trajnu memoriju. S velikim brojem klijenata i čestim spajanjima i odspajanjima, to može dovesti do degradacije interne pohrane u usmjerivaču.

PS: metode za isporuku koda klijentu mogu se proširivati ​​i nadopunjavati što se tiče vaših programskih mogućnosti. Na primjer, možete slati poruke na telegramu ili... predložiti opcije!

Nadam se da će vam ovaj članak biti koristan i pomoći da mreže malih i srednjih poduzeća budu malo sigurnije.

Izvor: www.habr.com