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
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:
- Interna IP adresa korisnika koji se uspješno spojio na VPN poslužitelj automatski se dodaje na sivu listu.
- Događaj povezivanja automatski generira jednokratni kod koji se šalje korisniku pomoću jedne od dostupnih metoda.
- Adrese na ovom popisu imaju ograničen pristup resursima lokalne mreže, s iznimkom usluge "autentifikatora", koja očekuje primanje jednokratne šifre zaporke.
- 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
Š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.
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:
- popis sučelja "2fa" - dinamički popis klijentskih sučelja čiji promet zahtijeva obradu u okviru 2FA;
- popis adresa “2fa_jailed” — “sivi” popis IP adresa tunela VPN klijenata;
- address_list "2fa_approved" - bijela lista IP adresa tunela VPN klijenata koji su uspješno prošli dvofaktorsku autentifikaciju.
- 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:
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:
Š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.
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
Š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
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
Korisnik klikne na prečac, otvara se jednostavan obrazac za unos koda koji će umetnuti kod u otvoreni URL:
Zaslon obrasca
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:
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