To-faktor autentificering af VPN-brugere via MikroTik og SMS

Hej kolleger! I dag, hvor intensiteten af ​​lidenskaber omkring "fjernarbejde" aftog lidt, vandt flertallet af administratorer opgaven med fjernadgang for medarbejdere til virksomhedens netværk, er det tid til at dele min mangeårige erfaring med at forbedre VPN-sikkerhed. Denne artikel vil ikke være på mode nu IPSec IKEv2 og xAuth. Det handler om at bygge et system. to-faktor autentificering (2FA) VPN-brugere, når MikroTik fungerer som en VPN-server. Nemlig når "klassiske" protokoller som PPP bruges.

To-faktor autentificering af VPN-brugere via MikroTik og SMS

I dag vil jeg fortælle dig, hvordan du beskytter MikroTik PPP-VPN, selv i tilfælde af "kapring" af brugerkontoen. Da denne ordning blev introduceret til en af ​​mine kunder, beskrev han den kort som "jamen, nu er det ligesom i en bank!".

Metoden bruger ikke eksterne autentificeringstjenester. Opgaverne udføres internt af routeren selv. Ingen omkostninger for den tilsluttede klient. Metoden virker til både pc-klienter og mobile enheder.

Den generelle beskyttelsesordning er som følger:

  1. Den interne IP-adresse på en bruger, der har oprettet forbindelse til VPN-serveren, vises automatisk på en gråliste.
  2. Forbindelseshændelsen genererer automatisk en engangskode, der sendes til brugeren ved hjælp af en af ​​de tilgængelige metoder.
  3. Adresser på denne liste har begrænset adgang til lokale netværksressourcer, med undtagelse af "autenticator"-tjenesten, som venter på at modtage en engangsadgangskode.
  4. Efter præsentation af koden har brugeren adgang til netværkets interne ressourcer.

første det mindste problem, jeg skulle stå over for, var at gemme kontaktoplysninger om brugeren for at sende ham 2FA-koden. Da det er umuligt at oprette vilkårlige datafelter svarende til brugere i Mikrotik, blev det eksisterende "kommentar" felt brugt:

/ppp-hemmeligheder tilføj navn=Petrov-adgangskode=4M@ngr! kommentar="89876543210"

Den anden problemet viste sig at være mere alvorligt - valget af stien og metoden til levering af koden. Tre ordninger er i øjeblikket implementeret: a) SMS via USB-modem b) e-mail c) SMS via e-mail tilgængelig for erhvervskunder hos den røde mobiloperatør.

Ja, sms-ordninger medfører omkostninger. Men hvis du ser, "sikkerhed handler altid om penge" (c).
Jeg kan personligt ikke lide ordningen med e-mail. Ikke fordi det kræver, at mailserveren er tilgængelig for den klient, der bliver autentificeret – det er ikke et problem at opdele trafikken. Men hvis en klient skødesløst gemte både vpn- og e-mail-adgangskoder i en browser og derefter mistede deres bærbare computer, ville angriberen få fuld adgang til virksomhedens netværk fra den.

Så det er besluttet - vi leverer en engangskode ved hjælp af SMS-beskeder.

tredje Problemet var hvor hvordan man genererer en pseudo-tilfældig kode til 2FA i MikroTik. Der er ingen analog til random()-funktionen i RouterOS-scriptsproget, og jeg har set adskillige crutch-script pseudo-tilfældige talgeneratorer før. Jeg kunne ikke lide nogen af ​​dem af forskellige årsager.

Faktisk er der en pseudo-tilfældig sekvensgenerator i MikroTik! Det er skjult for et overfladisk blik i sammenhæng med /certificates scep-server. Den første vej at få et engangskodeord er nemt og enkelt - med kommandoen /certifikater scep-server otp generere. Hvis vi udfører en simpel variabeltildelingsoperation, får vi en matrixværdi, som kan bruges senere i scripts.

Den anden vej opnåelse af et engangskodeord, som også er nemt at anvende - ved hjælp af en ekstern tjeneste random.org at generere den ønskede slags sekvens af pseudo-tilfældige tal. Her er en forenklet udkragede eksempel på at få data ind i en variabel:

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

En anmodning, der er formateret til konsollen (escapende specialtegn vil være påkrævet i scriptets brødtekst) modtager en streng på seks cifre i $rnd1-variablen. Den følgende "put"-kommando viser blot variablen i MikroTik-konsollen.

Det fjerde problem som skulle løses hurtigt - det er sådan og hvor den tilsluttede klient overfører sin engangskode i anden fase af godkendelsen.

To-faktor autentificering af VPN-brugere via MikroTik og SMS

Der skal være en tjeneste på MikroTik-routeren, der kan acceptere koden og matche den med en bestemt klient. Hvis den angivne kode stemmer overens med den forventede, bør klientens adresse medtages på en bestemt "hvid" liste, hvorfra adresser har adgang til virksomhedens interne netværk.

På grund af det dårlige udvalg af tjenester blev det besluttet at acceptere koder via http ved hjælp af den indbyggede webproxy i Mikrotik. Og da firewallen kan arbejde med dynamiske lister over IP-adresser, er det firewallen, der udfører søgningen efter koden, matcher den med klientens IP og tilføjer den til den "hvide" liste ved hjælp af Layer7 regexp. Selve routeren er blevet tildelt et betinget DNS-navn "gw.local", en statisk A-record er blevet oprettet på den til udstedelse til PPP-klienter:

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

Opsamling af trafik fra ubekræftede klienter på proxyen:
/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

I dette tilfælde har proxyen to funktioner.

1. Åbn tcp-forbindelser med klienter;

2. I tilfælde af vellykket godkendelse skal du omdirigere klientbrowseren til en side eller et billede, der giver besked om vellykket godkendelse:

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

Jeg vil liste de vigtige konfigurationselementer:

  1. interface-list "2fa" - en dynamisk liste over klientgrænseflader, hvorfra trafik kræver behandling inden for 2FA;
  2. adresseliste "2fa_jailed" - "grå" liste over tunnel-IP-adresser på VPN-klienter;
  3. address_list "2fa_approved" - "hvid" liste over tunnel-IP-adresser på VPN-klienter, der har bestået to-faktor-godkendelse.
  4. firewallkæde "input_2fa" - den kontrollerer tcp-pakker for tilstedeværelsen af ​​en autorisationskode og matcher kodeafsenderens IP-adresse med den påkrævede. Regler i kæden tilføjes og fjernes dynamisk.

Et forenklet rutediagram over pakkebehandling ser sådan ud:

To-faktor autentificering af VPN-brugere via MikroTik og SMS

For at komme ind i Layer7 check af trafik fra klienter fra den "grå" liste, der endnu ikke har bestået anden fase af godkendelse, er der oprettet en regel i standard "input" kæden:

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

Lad os nu begynde at fastgøre al denne rigdom til PPP-tjenesten. MikroTik giver dig mulighed for at bruge scripts i profiler (ppp-profil) og tildele dem til begivenheder med etablering og afbrydelse af en ppp-forbindelse. Ppp-profilindstillingerne kan anvendes på PPP-serveren som helhed eller til individuelle brugere. Samtidig har den profil, der er tildelt brugeren, prioritet og tilsidesætter parametrene for profilen, der er valgt for serveren som helhed med dens specificerede parametre.

Som et resultat af denne tilgang kan vi oprette en speciel profil til tofaktorautentificering og tildele den ikke til alle brugere, men kun til dem, der anser det for nødvendigt at gøre det. Dette kan være relevant, hvis du bruger PPP-tjenester ikke kun til at forbinde slutbrugere, men samtidig til at bygge site-to-site forbindelser.

I den nyoprettede specialprofil bruger vi den dynamiske tilføjelse af den tilsluttede brugers adresse og grænseflade til de "grå" lister over adresser og grænseflader:

winbox
To-faktor autentificering af VPN-brugere via MikroTik og SMS

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

Det er nødvendigt at bruge både "address-list" og "interface-list"-lister til at detektere og fange trafik fra ikke-sekundære VPN-klienter i dstnat-kæden (prerouting).

Når forberedelsen er gennemført, yderligere firewallkæder og en profil oprettes, vil vi skrive et script, der er ansvarligt for autogenerering af 2FA-koden og individuelle firewallregler.

Dokumentation wiki.mikrotik.com på PPP-Profil beriger os med information om variabler forbundet med PPP-klient connect-disconnect hændelser "Udfør script på brugerlogin-hændelse. Disse er tilgængelige variabler, der er tilgængelige for hændelsesscriptet: bruger, lokal-adresse, fjernadresse, opkalds-id, kaldet-id, interface". Nogle af dem er meget nyttige for os.

Kode brugt i profilen til PPP on-up forbindelse hændelse

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

Især for dem, der kan lide at kopiere-paste uden tanke, advarer jeg dig - koden er taget fra testversionen og kan indeholde mindre tastefejl. Det vil ikke være svært for en forstående person at finde ud af præcis hvor.

Når en bruger afbryder forbindelsen, genereres en "On-Down" hændelse, og det tilsvarende script med parametre kaldes. Opgaven med dette script er at rydde op i firewall-reglerne, der er oprettet for den afbrudte bruger.

Kode brugt i profilen til PPP on-down forbindelseshændelse

: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]
Du kan derefter oprette brugere og tildele alle eller nogle af dem til en to-faktor godkendelsesprofil.

winbox
To-faktor autentificering af VPN-brugere via MikroTik og SMS

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

Sådan ser det ud på klientsiden.

Når en VPN-forbindelse er etableret, modtager en Android/iOS telefon/tablet med et SIM-kort en SMS som denne:

SMS
To-faktor autentificering af VPN-brugere via MikroTik og SMS

Hvis forbindelsen oprettes direkte fra telefonen/tabletten, så kan du gå igennem 2FA blot ved at klikke på linket fra beskeden. Det er behageligt.

Hvis VPN-forbindelsen er etableret fra en pc, vil brugeren blive bedt om at indtaste en minimal adgangskodeformular. En lille formular i form af en HTML-fil gives til brugeren ved opsætning af VPN. Filen kan endda sendes med posten, så brugeren gemmer den og opretter en genvej et praktisk sted. Det ser sådan ud:

Etiket på bordet
To-faktor autentificering af VPN-brugere via MikroTik og SMS

Brugeren klikker på genvejen, en simpel kodeindtastningsformular åbnes, som indsætter koden i den åbnede URL:

Skærmformular
To-faktor autentificering af VPN-brugere via MikroTik og SMS

Den mest primitive form er givet som eksempel. De, der ønsker det, kan selv ændre.

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>

Hvis godkendelsen lykkedes, vil brugeren se MikroTik-logoet i browseren, hvilket skulle signalere vellykket godkendelse:

To-faktor autentificering af VPN-brugere via MikroTik og SMS

Bemærk, at billedet returneres fra den indbyggede MikroTik-webserver ved hjælp af WebProxy Deny Redirect.

Jeg formoder, at billedet kan tilpasses ved at bruge "hotspot"-værktøjet, uploade din egen version der og indstille Deny Redirect URL til det med WebProxy.

En stor anmodning til dem, der forsøger at købe det billigste "legetøj" Mikrotik for $20 og erstatte en $500 router med det - lad være med at gøre det. Enheder som "hAP Lite" / "hAP mini" (hjemmeadgangspunkt) har en meget svag CPU (smips), og det er sandsynligt, at de ikke vil klare belastningen i erhvervssegmentet.

Advarsel! Denne løsning har én ulempe: Når klienter tilslutter eller afbrydes, sker der konfigurationsændringer, som routeren forsøger at gemme i sin ikke-flygtige hukommelse. Med et stort antal klienter og hyppige til- og frakoblinger kan dette føre til forringelse af det interne lager i routeren.

PS: Metoder til levering af kode til klienten kan udvides og suppleres, så vidt dine programmeringsevner er tilstrækkelige. For eksempel kan du sende beskeder til telegram eller ... foreslå muligheder!

Jeg håber, at artiklen vil være nyttig for dig og vil være med til at gøre netværkene for små og mellemstore virksomheder lidt mere sikre.

Kilde: www.habr.com