To-faktor autentisering av VPN-brukere via MikroTik og SMS

Hei kollegaer! I dag, når lidenskapen rundt eksternt arbeid har avtatt litt, har de fleste administratorer erobret oppgaven med ekstern tilgang for ansatte til bedriftsnettverket, er det på tide å dele min langvarige erfaring med å forbedre VPN-sikkerheten. Denne artikkelen vil ikke være moteriktig nå IPSec IKEv2 og xAuth. Det handler om å bygge et system tofaktorautentisering (2FA) VPN-brukere når MikroTik fungerer som en VPN-server. Nemlig når «klassiske» protokoller som PPP brukes.

To-faktor autentisering av VPN-brukere via MikroTik og SMS

I dag vil jeg fortelle deg hvordan du beskytter MikroTik PPP-VPN selv om brukerkontoen din blir kapret. Da denne ordningen ble introdusert for en av kundene mine, beskrev han den kort som "vel, nå er det akkurat som i en bank!"

Metoden bruker ikke eksterne autentiseringstjenester. Oppgavene utføres internt av ruteren selv. Ingen kostnad for den tilkoblede klienten. Metoden fungerer for både PC-klienter og mobile enheter.

Den generelle beskyttelsesordningen er som følger:

  1. Den interne IP-adressen til en bruker som har koblet til VPN-serveren blir automatisk lagt til i den grå listen.
  2. Tilkoblingshendelsen genererer automatisk en engangskode som sendes til brukeren ved hjelp av en av de tilgjengelige metodene.
  3. Adresser i denne listen har begrenset tilgang til lokale nettverksressurser, med unntak av "autentiseringstjenesten", som forventer å motta en engangspassordkode.
  4. Etter å ha presentert koden har brukeren tilgang til interne nettverksressurser.

første det minste problemet jeg måtte møte var å lagre kontaktinformasjon om brukeren for å sende ham 2FA-koden. Siden det er umulig å lage vilkårlige datafelt som tilsvarer brukere i Mikrotik, ble det eksisterende "kommentar"-feltet brukt:

/ppp-hemmeligheter legg til navn=Petrov-passord=4M@ngr! comment="89876543210"

Den andre problemet viste seg å være mer alvorlig - valget av banen og metoden for å levere koden. For tiden er tre ordninger implementert: a) SMS via USB-modem b) e-post c) SMS via e-post tilgjengelig for bedriftskunder hos den røde mobiloperatøren.

Ja, SMS-ordninger gir kostnader. Men hvis du ser, "sikkerhet handler alltid om penger" (c).
Jeg personlig liker ikke opplegget med e-post. Ikke fordi det krever at e-postserveren er tilgjengelig for klienten som autentiseres – det er ikke noe problem å dele trafikken. Imidlertid, hvis en klient uforsiktig lagret både vpn- og e-postpassord i en nettleser og deretter mistet den bærbare datamaskinen, ville angriperen få full tilgang til bedriftsnettverket fra den.

Så det er bestemt - vi leverer en engangskode ved hjelp av SMS-meldinger.

tredje problemet var hvor og hvordan generere pseudo-tilfeldig kode for 2FA i MikroTik. Det er ingen ekvivalent til random()-funksjonen i RouterOS-skriptspråket, og jeg har sett flere crummy-skriptede pseudo-tilfeldige tallgeneratorer før. Jeg likte ikke noen av dem av forskjellige grunner.

Faktisk ER det en pseudo-tilfeldig sekvensgenerator i MikroTik! Den er skjult for et overfladisk blikk i sammenheng med /certificates scep-server. Den første måten å få et engangspassord er enkelt og enkelt - med kommandoen /sertifikater scep-server otp generere. Hvis vi utfører en enkel variabeltilordningsoperasjon, vil vi få en matriseverdi som kan brukes senere i skript.

Den andre måten skaffe et engangspassord, som også er enkelt å bruke - ved hjelp av en ekstern tjeneste random.org for å generere ønsket type sekvens av pseudotilfeldige tall. Her er en forenklet utkragede eksempel på mottak av data til 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 forespørsel formatert for konsollen (escapende spesialtegn vil være nødvendig i skriptets brødtekst) mottar en streng med seks numeriske tegn i $rnd1-variabelen. Følgende "put"-kommando viser ganske enkelt variabelen i MikroTik-konsollen.

Det fjerde problemet som måtte løses raskt var hvordan og hvor den tilkoblede klienten ville overføre sin engangskode i det andre stadiet av autentisering.

To-faktor autentisering av VPN-brukere via MikroTik og SMS

Det må være en tjeneste på MikroTik-ruteren som kan akseptere koden og matche den med en spesifikk klient. Hvis den oppgitte koden samsvarer med den forventede, må klientens adresse inkluderes i en viss "hvit" liste, adresser som har tilgang til selskapets interne nettverk.

På grunn av det begrensede utvalget av tjenester, ble det besluttet å akseptere koder via http ved å bruke webproxyen innebygd i Mikrotik. Og siden brannmuren kan fungere med dynamiske lister over IP-adresser, er det brannmuren som søker etter koden, matcher den med klientens IP og legger den til den "hvite" listen ved hjelp av Layer7 regexp. Selve ruteren har blitt tildelt et betinget DNS-navn "gw.local", og det er opprettet en statisk A-post på den for utstedelse til PPP-klienter:

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

Ta opp trafikk fra ubekreftede klienter med proxy:
/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 tilfellet har proxyen to funksjoner.

1. Åpne TCP-forbindelser med klienter;

2. I tilfelle vellykket godkjenning, omdiriger klientnettleseren til en side eller et bilde som varsler om vellykket autentisering:

Proxy konfig
/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 opp de viktige konfigurasjonselementene:

  1. interface-list "2fa" - en dynamisk liste over klientgrensesnitt, trafikk som krever behandling innen 2FA;
  2. adresseliste "2fa_jailed" - "grå" liste over tunnel-IP-adresser til VPN-klienter;
  3. address_list "2fa_approved" - en hvit liste over tunnel-IP-adresser til VPN-klienter som har bestått tofaktorautentisering.
  4. brannmurkjede "input_2fa" - den sjekker TCP-pakker for tilstedeværelsen av en autorisasjonskode og om kodeavsenderens IP-adresse samsvarer med den nødvendige. Regler i kjeden legges til og fjernes dynamisk.

Et forenklet flytskjema over pakkebehandling ser slik ut:

To-faktor autentisering av VPN-brukere via MikroTik og SMS

For å komme inn i Layer7-sjekken av trafikk fra klienter fra den "grå" listen som ennå ikke har bestått det andre stadiet av autentisering, er det opprettet en regel i standard "input"-kjeden:

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

La oss nå begynne å feste all denne rikdommen til PPP-tjenesten. MikroTik lar deg bruke skript i profiler (ppp-profil) og tilordne dem til hendelsene med å sette opp og bryte en ppp-forbindelse. PPP-profilinnstillingene kan brukes både på PPP-serveren som helhet og på individuelle brukere. I dette tilfellet har profilen som er tildelt brukeren prioritet, og overstyrer med de spesifiserte parameterne parametrene til profilen som er valgt for serveren som helhet.

Som et resultat av denne tilnærmingen kan vi opprette en spesiell profil for tofaktorautentisering og tildele den ikke til alle brukere, men bare til de som vi anser som nødvendige for å gjøre det. Dette kan være aktuelt hvis du bruker PPP-tjenester ikke bare for å koble sammen sluttbrukere, men samtidig bygge sted-til-sted-forbindelser.

I den nyopprettede spesialprofilen bruker vi det dynamiske tillegget av adressen og grensesnittet til den tilkoblede brukeren til de "grå" listene over adresser og grensesnitt:

winbox
To-faktor autentisering av VPN-brukere 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ødvendig å bruke "adresseliste" og "grensesnittliste" sammen for å identifisere og fange opp trafikk fra VPN-klienter som ikke har bestått sekundær autorisasjon i dstnat (prerouting)-kjeden.

Når forberedelsen er fullført, ytterligere brannmurkjeder og en profil er opprettet, vil vi skrive et script som er ansvarlig for autogenerering av 2FA-koden og individuelle brannmurregler.

Dokumentasjon wiki.mikrotik.com på PPP-Profil beriker oss med informasjon om variabler knyttet til PPP-klienttilkobling og frakoblingshendelser "Kjør skript på brukerinnloggingshendelse. Dette er tilgjengelige variabler som er tilgjengelige for hendelsesskriptet: bruker, lokal-adresse, ekstern-adresse, anrops-id, kalt-id, grensesnitt". Noen av dem vil være svært nyttige for oss.

Kode brukt i profilen for PPP on-up tilkoblingshendelse

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

Jeg advarer deg spesielt for de som liker å kopiere og lime inn - koden er hentet fra en testversjon og kan inneholde mindre feil. Det vil ikke være vanskelig for en forståelsesfull person å finne ut hvor nøyaktig.

Når en bruker kobler fra, genereres en "On-Down"-hendelse og det tilsvarende skriptet med parametere kalles. Formålet med dette skriptet er å rydde opp i brannmurreglene som er opprettet for den frakoblede brukeren.

Kode brukt i profilen for PPP on-down tilkoblingshendelsen

: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 deretter opprette brukere og tilordne noen eller alle av dem til en tofaktorautentiseringsprofil.

winbox
To-faktor autentisering av VPN-brukere via MikroTik og SMS

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

Hvordan det ser ut på klientsiden.

Når du oppretter en VPN-tilkobling, sendes en SMS omtrent som dette til din Android/iOS-telefon/nettbrett med et SIM-kort:

tekstmelding
To-faktor autentisering av VPN-brukere via MikroTik og SMS

Hvis tilkoblingen opprettes direkte fra din telefon/nettbrett, kan du gå gjennom 2FA ved å klikke på lenken fra meldingen. Det er behagelig.

Hvis en VPN-tilkobling opprettes fra en PC, vil brukeren bli bedt om å angi en minimal form for passord. Et lite skjema i form av en HTML-fil sendes til brukeren ved oppsett av VPN. Filen kan til og med sendes med post slik at brukeren kan lagre den og lage en snarvei på et praktisk sted. Det ser omtrent slik ut:

Etikett på bordet
To-faktor autentisering av VPN-brukere via MikroTik og SMS

Brukeren klikker på snarveien, et enkelt koderegistreringsskjema åpnes, som vil sette inn koden i den åpnede URLen:

Skjermskjema
To-faktor autentisering av VPN-brukere via MikroTik og SMS

Formen er den mest primitive, gitt som eksempel. De som ønsker kan modifisere det slik at det passer dem selv.

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 autorisasjonen er vellykket, vil brukeren se MikroTik-logoen i nettleseren, som skal tjene som et signal om vellykket autentisering:

To-faktor autentisering av VPN-brukere via MikroTik og SMS

Merk at bildet returneres fra den innebygde MikroTik-webserveren ved bruk av WebProxy Deny Redirect.

Jeg tror at bildet kan tilpasses ved å bruke "hotspot"-verktøyet, laste opp din egen versjon der og angi en Deny Redirect URL til det med WebProxy.

En stor forespørsel til de som prøver å kjøpe det billigste "leketøyet" Mikrotik for $20 og erstatte det med en $500-ruter - ikke gjør det. Enheter som "hAP Lite"/"hAP mini" (hjemmetilgangspunkt) har en veldig svak CPU (smips), og vil sannsynligvis ikke takle belastningen i forretningssegmentet.

Advarsel! Denne løsningen har én ulempe: når klienter kobler til eller fra, skjer det konfigurasjonsendringer, som ruteren prøver å lagre i sitt ikke-flyktige minne. Med et stort antall klienter og hyppige til- og frakoblinger kan dette føre til forringelse av den interne lagringen i ruteren.

PS: metoder for å levere kode til klienten kan utvides og suppleres når det gjelder dine programmeringsevner. For eksempel kan du sende meldinger til telegram eller ... foreslå alternativer!

Jeg håper denne artikkelen vil være nyttig for deg og bidra til å gjøre små og mellomstore bedriftsnettverk litt sikrere.

Kilde: www.habr.com