Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Zdravo kolege! Danas, kada je intenzitet strasti oko “rada na daljinu” malo splasnuo, većina admina dobila je zadatak daljinskog pristupa zaposlenih korporativnoj mreži, vrijeme je da podijelim svoje dugogodišnje iskustvo u poboljšanju VPN sigurnosti. Ovaj članak sada neće biti moderan IPSec IKEv2 i xAuth. Radi se o izgradnji sistema. dvofaktorska autentifikacija (2FA) VPN korisnici kada MikroTik djeluje kao VPN server. Naime, kada se koriste "klasični" protokoli kao što je PPP.

Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Danas ću vam reći kako zaštititi MikroTik PPP-VPN čak i u slučaju „otmice“ korisničkog naloga. Kada je ovu šemu upoznao jedan od mojih klijenata, ukratko ju je opisao kao „pa, sad je kao u banci!“.

Metoda ne koristi usluge eksternog autentifikatora. Zadatke obavlja interno sam ruter. Bez troškova za klijenta koji se povezuje. Metoda radi 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 povezao na VPN server automatski se stavlja na sivu listu.
  2. Događaj povezivanja automatski generira jednokratni kod koji se šalje korisniku koristeći jedan od dostupnih metoda.
  3. Adrese na ovoj listi imaju ograničen pristup lokalnim mrežnim resursima, s izuzetkom usluge „autentikator“ koja čeka da primi jednokratnu lozinku.
  4. Nakon predstavljanja koda, korisnik ima pristup internim resursima mreže.

Prvi najmanji problem s kojim sam se morao suočiti je pohranjivanje kontakt informacija o korisniku da mu pošaljem 2FA kod. Budući da je nemoguće kreirati proizvoljna polja podataka koja odgovaraju korisnicima u Mikrotiku, korišteno je postojeće polje “komentar”:

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

Drugi Ispostavilo se da je problem ozbiljniji - izbor putanje i metode isporuke koda. Trenutno su implementirane tri šeme: a) SMS putem USB-modema b) e-mail c) SMS putem e-maila koji je dostupan korporativnim klijentima crvenog operatera mobilne telefonije.

Da, SMS šeme donose troškove. Ali ako pogledate, "sigurnost je uvijek u novcu" (c).
Meni se lično ne sviđa shema sa e-mailom. Ne zato što zahtijeva da mail server bude dostupan klijentu koji se autentifikuje - nije problem podijeliti promet. Međutim, ako je klijent neoprezno sačuvao i vpn i lozinke za e-poštu u pretraživaču, a zatim izgubio svoj laptop, napadač bi preko njega dobio pun pristup korporativnoj mreži.

Dakle, odlučeno je - isporučujemo jednokratni kod pomoću SMS poruka.

Treći Problem je bio gde kako generirati pseudo-slučajni kod za 2FA u MikroTik-u. Ne postoji analog funkcije random() u jeziku skriptiranja RouterOS, a vidio sam nekoliko generatora pseudo-slučajnih brojeva skripte. Nijedan mi se iz raznih razloga nije svidio.

U stvari, u MikroTik-u postoji generator pseudo-slučajnih sekvenci! Skriven je od površnog pogleda u kontekstu /certificates scep-server. Prvi put dobijanje jednokratne lozinke je lako i jednostavno - pomoću komande /certificates scep-server otp generiše. Ako izvršimo jednostavnu operaciju dodjeljivanja varijable, dobićemo vrijednost niza koja se kasnije može koristiti u skriptama.

Drugi način dobijanje jednokratne lozinke koja se takođe lako primenjuje - korišćenjem eksterne usluge random.org za generiranje željene vrste niza pseudoslučajnih brojeva. Ovdje je pojednostavljeno cantilever primjer unosa podataka u varijablu:

Kod
: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 će biti potrebni izbjeći specijalni znakovi) prima niz od šest cifara u varijablu $rnd1. Sljedeća naredba "put" jednostavno prikazuje varijablu u MikroTik konzoli.

Četvrti problem što je trebalo brzo riješiti - ovako i gdje će povezani klijent prenijeti svoj jednokratni kod u drugoj fazi autentifikacije.

Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Mora postojati servis na MikroTik ruteru koji može prihvatiti kod i uskladiti ga sa određenim klijentom. Ukoliko se navedeni kod poklapa sa očekivanim, adresu klijenta treba uvrstiti na određenu "bijelu" listu sa koje je dozvoljen pristup internoj mreži kompanije.

Zbog lošeg izbora servisa, odlučeno je da se kodovi prihvataju putem http koristeći webproxy ugrađen u Mikrotik. Pošto zaštitni zid može da radi sa dinamičkim listama IP adresa, zaštitni zid je taj koji traži kod, uparujući ga sa IP klijentom i dodaje ga na „belu” listu koristeći Layer7 regexp. Samom ruteru je dodeljeno uslovno DNS ime "gw.local", 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 neprovjerenih klijenata 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

U ovom slučaju, proxy ima dvije funkcije.

1. Otvorite tcp veze sa klijentima;

2. U slučaju uspješne autorizacije, preusmjerite klijentski pretraživač na stranicu ili sliku koja obavještava o uspješnoj autentifikaciji:

Proxy config
/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 konfiguracijske elemente:

  1. interfejs-list "2fa" - dinamička lista klijentskih interfejsa, saobraćaj sa kojih zahteva obradu u okviru 2FA;
  2. adresa-list "2fa_jailed" - "siva" lista tunelskih IP adresa VPN klijenata;
  3. address_list "2fa_approved" - "bijela" lista tunelskih IP adresa VPN klijenata koji su uspješno prošli dvofaktorsku autentifikaciju.
  4. lanac zaštitnog zida "input_2fa" - provjerava tcp pakete na prisustvo autorizacionog koda i poklapa IP adresu pošiljaoca koda sa potrebnom. Pravila u lancu se dodaju i uklanjaju dinamički.

Pojednostavljeni dijagram toka obrade paketa izgleda ovako:

Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Da biste ušli u Layer7 provjeru prometa od klijenata sa "sive" liste koji još nisu prošli drugu fazu autentifikacije, kreirano je pravilo u standardnom "ulaznom" lancu:

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

Sada počnimo da sve ovo bogatstvo vezujemo za uslugu JPP. MikroTik vam omogućava da koristite skripte u profilima (ppp-profile) i dodijelite ih događajima uspostavljanja i prekida ppp veze. Postavke ppp-profila mogu se primijeniti na PPP server u cjelini ili na pojedinačne korisnike. U isto vrijeme, profil koji je dodijeljen korisniku ima prioritet, nadjačavajući parametre profila odabranog za server u cjelini sa svojim specificiranim parametrima.

Kao rezultat ovakvog pristupa, možemo kreirati poseban profil za dvofaktorsku autentifikaciju i dodijeliti ga ne svim korisnicima, već samo onima koji smatraju da je to potrebno. Ovo može biti relevantno ako koristite PPP usluge ne samo za povezivanje krajnjih korisnika, već u isto vrijeme i za izgradnju veza od lokacije do lokacije.

U novostvorenom posebnom profilu koristimo dinamičko dodavanje adrese i interfejsa povezanog korisnika na "sive" liste adresa i interfejsa:

winbox
Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Kod
/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 i "address-list" i "interface-list" liste za otkrivanje i hvatanje saobraćaja od nesekundarnih VPN klijenata u dstnat (prerouting) lancu.

Kada se priprema završi, kreiraju se dodatni lanci zaštitnog zida i profil, napisaćemo skriptu odgovornu za automatsko generisanje 2FA koda i individualnih pravila zaštitnog zida.

Dokumentacija wiki.mikrotik.com na PPP-profilu nas obogaćuje informacijama o varijablama povezanim sa događajima povezivanja 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, Caller-id, interfejs". Neki od njih su nam veoma korisni.

Kôd koji se koristi u profilu za PPP događaj povezivanja

#Логируем для отладки полученные переменные 
: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 za one koji vole bezumno copy-paste, upozoravam - kod je preuzet iz probne verzije i može sadržavati manje greške u kucanju. Razumljivoj osobi neće biti teško da shvati gde tačno.

Kada se korisnik prekine, generira se događaj “On-Down” i poziva se odgovarajuća skripta s parametrima. Zadatak ove skripte je da očisti pravila zaštitnog zida kreirana za isključenog korisnika.

Kôd korišten u profilu za PPP on-down događaj 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 kreirati korisnike i dodijeliti sve ili neke od njih dvofaktorskom profilu autentifikacije.

winbox
Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

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

Kako to izgleda na strani klijenta.

Kada se uspostavi VPN veza, Android/iOS telefon/tablet sa SIM karticom prima SMS ovako:

SMS
Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Ako je veza uspostavljena direktno sa telefona/tableta, onda možete proći kroz 2FA jednostavnim klikom na link iz poruke. To je udobno.

Ako je VPN veza uspostavljena sa računara, tada će se od korisnika tražiti da unese minimalnu lozinku. Mali obrazac u obliku HTML datoteke se daje korisniku prilikom postavljanja VPN-a. Datoteka se čak može poslati poštom tako da je korisnik sačuva i kreira prečicu na pogodnom mestu. izgleda ovako:

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

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

Forma ekrana
Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Najprimitivniji oblik je dat kao primjer. Oni koji žele mogu sami modificirati.

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 pretraživaču, koji bi trebao signalizirati uspješnu autentifikaciju:

Dvofaktorska autentifikacija VPN korisnika putem MikroTika i SMS-a

Imajte na umu da se slika vraća sa ugrađenog MikroTik web servera koristeći WebProxy Deny Redirect.

Pretpostavljam da se slika može prilagoditi korištenjem alata "hotspot", učitavanjem vlastite verzije tamo i postavljanjem URL-a Deny Redirect na nju pomoću WebProxy-a.

Velika molba onima koji pokušavaju da kupe najjeftiniji "igračku" Mikrotik za 20$ i njime zamene ruter od 500$ - nemojte to da radite. Uređaji poput "hAP Lite" / "hAP mini" (kućna pristupna tačka) imaju vrlo slab CPU (smips), te je vjerovatno da se neće nositi sa opterećenjem u poslovnom segmentu.

Upozorenje! Ovo rješenje ima jedan nedostatak: kada se klijenti povežu ili prekinu vezu, dolazi do promjena konfiguracije, koje ruter pokušava spremiti u svoju nepromjenjivu memoriju. Uz veliki broj klijenata i česte veze i prekide, to može dovesti do degradacije interne memorije u ruteru.

PS: Metode za isporuku koda klijentu mogu se proširiti i dopuniti onoliko koliko su vaše programske mogućnosti dovoljne. Na primjer, možete slati poruke na telegram ili ... predložiti opcije!

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

izvor: www.habr.com