Zwee-Faktor Authentifikatioun vu VPN Benotzer iwwer MikroTik an SMS

Moien Kollegen! Haut, wann d'Passioun ronderëm Fernaarbecht e bëssen ofgeholl huet, hunn déi meescht Administrateuren d'Aufgab vum Fernzougang vun de Mataarbechter zum Firmennetz erobert, et ass Zäit meng laangjäreg Erfahrung an der Verbesserung vun der VPN Sécherheet ze deelen. Dësen Artikel wäert net déi aktuell moudesch IPSec IKEv2 an xAuth ofdecken. Et geet drëm e System ze bauen Zwee-Faktor Authentifikatioun (2FA) VPN Benotzer wann MikroTik als VPN Server handelt. Nämlech wann "klassesch" Protokoller wéi PPP benotzt ginn.

Zwee-Faktor Authentifikatioun vu VPN Benotzer iwwer MikroTik an SMS

Haut wäert ech Iech soen wéi Dir MikroTik PPP-VPN schützt och wann Äre Benotzerkont gekaaft gëtt. Wann dëse Schema fir ee vu menge Clienten agefouert gouf, huet hien et kuerz beschriwwen als "gutt, elo ass et wéi an enger Bank!"

D'Method benotzt keng extern Authentifizéierungsservicer. D'Aufgabe ginn intern vum Router selwer gemaach. Keng Käschten fir de verbonne Client. D'Methode funktionnéiert souwuel fir PC Clienten a mobilen Apparater.

Den allgemenge Schutzschema ass wéi follegt:

  1. Déi intern IP Adress vun engem Benotzer, deen erfollegräich mam VPN Server verbonnen ass, gëtt automatesch op déi gro Lëscht bäigefüügt.
  2. D'Verbindungsevent generéiert automatesch en eemolege Code deen un de Benotzer geschéckt gëtt mat enger vun de verfügbare Methoden.
  3. Adressen an dëser Lëscht hunn limitéiert Zougang zu lokalen Netzwierkressourcen, mat Ausnam vum "Authentifizéierer" Service, deen erwaart en eemolege Passwuertcode ze kréien.
  4. Nodeems de Code presentéiert huet, huet de Benotzer Zougang zu internen Netzwierkressourcen.

Déi éischt dee klengste Problem, dee mir konfrontéiert haten, war d'Kontaktinformatioun iwwer de Benotzer ze späicheren fir him en 2FA Code ze schécken. Well et onméiglech ass arbiträr Datefelder ze kreéieren, déi de Benotzer am Mikrotik entspriechen, gouf dat existent "Kommentar" Feld benotzt:

/ ppp Geheimnisser addéieren Numm = Petrov Passwuert = 4M@ngr! Commentaire = "89876543210"

Déi zweet de Problem huet sech méi sérieux erausgestallt - d'Wiel vum Wee an d'Method fir de Code ze liwweren. Momentan ginn dräi Schemaen ëmgesat: a) SMS iwwer USB Modem b) E-Mail c) SMS iwwer E-Mail verfügbar fir Firmecliente vum roude Mobiloperateur.

Jo, SMS Schemae maachen Käschten. Awer wann Dir et kuckt, "Sécherheet ass ëmmer ëm Suen" (c).
Ech perséinlech hunn d'E-Mail Schema net gär. Net well et erfuerdert datt de Mailserver verfügbar ass fir de Client deen authentifizéiert gëtt - et ass kee Problem fir de Traffic opzedeelen. Wéi och ëmmer, wann de Client suergfälteg Passwierder fir VPN an E-Mail am Browser gespäichert huet an duerno säi Laptop verluer huet, kritt den Ugräifer vollen Zougang zum Firmennetz dovun.

Also, et ass decidéiert - mir liwweren en eemolege Code mat SMSen.

Drëtt de Problem war wou an wéi een pseudo-zoufälleg Code fir 2FA am MikroTik generéiert. Et gëtt keen Äquivalent zu der zoufälleg () Funktioun an der RouterOS Skriptsprooch, an ech hunn e puer crummy scripted pseudo-zoufälleg Zuel Generatoren gesinn. Ech hunn all vun hinnen aus verschiddene Grënn net gär.

Tatsächlech gëtt et e pseudo-zoufälleg Sequenz Generator am MikroTik! Et ass verstoppt vun engem iwwerflächleche Bléck am Kontext vun / Certificates scep-Server. Déi éischt Manéier en eemolegt Passwuert ze kréien ass einfach an einfach - mam Kommando / Certificaten scep-Server otp generéieren. Wa mir eng einfach Variabel Astellungsoperatioun ausféieren, kréie mir en Array-Wäert dee spéider a Skripte benotzt ka ginn.

Déi zweet Manéier eng eemoleg Passwuert ze kréien, déi och einfach ze benotzen ass - mat engem externen Service random.org fir déi gewënscht Aart vun der Sequenz vu pseudorandom Zuelen ze generéieren. Hei ass eng vereinfacht Kant huet Beispill fir Daten an eng Variabel ze kréien:

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

Eng Ufro, déi fir d'Konsole formatéiert ass (Spezial Zeechen entkommen wäerten am Kierper vum Skript erfuerderlech sinn) kritt eng String vu sechs numeresch Zeechen an d'$rnd1 Variabel. De folgende "put" Kommando weist einfach d'Variabel an der MikroTik Konsole.

De véierte Problem wat séier geléist muss ginn, war wéi a wou de verbonne Client säin eemolege Code an der zweeter Etapp vun der Authentifikatioun iwwerdroe géif.

Zwee-Faktor Authentifikatioun vu VPN Benotzer iwwer MikroTik an SMS

Et muss e Service um MikroTik Router sinn, deen de Code akzeptéiere kann an et mat engem spezifesche Client passen. Wann de geliwwert Code mat dem erwaarten entsprécht, muss d'Adress vum Client an enger bestëmmter "wäiss" Lëscht abegraff sinn, Adressen aus deenen Zougang zum internen Netzwierk vun der Firma erlaabt ass.

Wéinst der limitéierter Auswiel u Servicer gouf decidéiert Coden iwwer http ze akzeptéieren mat der Webproxy a Mikrotik agebaut. A well d'Firewall kann mat dynamesche Lëschte vun IP Adressen funktionnéieren, ass et d'Firewall déi no de Code sicht, entsprécht dem Client IP a füügt se op d'wäiss Lëscht mat Layer7 regexp. De Router selwer gouf e bedingten DNS Numm "gw.local" zougewisen, an e statesche A Rekord gouf drop erstallt fir d'Emissioun un PPP Clienten:

DNS
/ ip dns statesch addéieren Numm = gw.local Adress = 172.31.1.1

Traffic erfaassen vun onverifizéierte Clienten duerch 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

An dësem Fall huet de Proxy zwou Funktiounen.

1. Open TCP Verbindunge mat Clienten;

2. Am Fall vun enger erfollegräicher Autorisatioun, redirect de Client Browser op eng Säit oder Bild iwwer eng erfollegräich Authentifikatioun:

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

Ech wäert déi wichteg Konfiguratiounselementer oplëschten:

  1. Interface-Lëscht "2fa" - eng dynamesch Lëscht vu Clientschnëttplazen, de Verkéier aus deem Veraarbechtung am Kader vun 2FA erfuerdert;
  2. Adresslëscht "2fa_jailed" - "gro" Lëscht vun Tunnel IP Adresse vu VPN Clienten;
  3. address_list "2fa_approved" - eng wäiss Lëscht vun Tunnel IP Adresse vu VPN Clienten déi erfollegräich Zwee-Faktor Authentifikatioun passéiert hunn.
  4. Firewall Kette "input_2fa" - et iwwerpréift TCP Pakete fir d'Präsenz vun engem Autorisatiounscode an ob d'IP Adress vum Code Sender déi erfuerderlech entsprécht. Regelen an der Kette ginn dynamesch bäigefüügt an ewechgeholl.

E vereinfachte Paketveraarbechtungsflowdiagramm gesäit esou aus:

Zwee-Faktor Authentifikatioun vu VPN Benotzer iwwer MikroTik an SMS

Fir de Traffic vu Clienten op der "groer" Lëscht ze enthalen, déi nach net déi zweet Stuf vun der Authentifikatioun an de Layer7 Scan passéiert hunn, ass eng Regel an der Standard "Input" Kette erstallt:

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

Loosst eis elo all dëse Räichtum mam PPP Service verbannen. MikroTik erlaabt Iech Scripten a Profiler (ppp-Profil) ze benotzen an hinnen un d'Evenementer ze setzen fir eng ppp Verbindung opzestellen an ze briechen. D'PPP-Profil-Astellunge kënne souwuel op den PPP-Server als Ganzt an op eenzel Benotzer applizéiert ginn. An dësem Fall huet de Profil, deen dem Benotzer zougewisen ass, Prioritéit, iwwerschreift mat senge spezifizéierte Parameteren d'Parameteren vum Profil ausgewielt fir de Server als Ganzt.

Als Resultat vun dëser Approche kënne mir e spezielle Profil fir Zwee-Faktor Authentifikatioun erstellen an et net all Benotzer zouginn, awer nëmmen un déi, déi mir als néideg betruechten. Dëst kann relevant sinn wann Dir PPP-Servicer benotzt net nëmmen fir Endbenotzer ze verbannen, awer gläichzäiteg fir Site-zu-Site Verbindungen ze bauen.

Am nei erstallt spezielle Profil benotze mir dynamesch Zousatz vun der Adress an der Interface vum verbonne Benotzer op déi "gro" Lëschte vun Adressen an Interfaces:

winbox
Zwee-Faktor Authentifikatioun vu VPN Benotzer iwwer MikroTik an SMS

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

Et ass noutwendeg d'"Adress-Lëscht" an "Interface-Lëscht" Lëschte zesummen ze benotzen fir Traffic vu VPN Clienten z'identifizéieren an z'erfaassen déi net sekundär Autorisatioun an der dstnat (Prerouting) Kette passéiert hunn.

Wann d'Virbereedung fäerdeg ass, zousätzlech Firewallketten an e Profil erstallt ginn, schreiwen mir e Skript verantwortlech fir d'Auto-Generatioun vum 2FA Code an eenzel Firewall Regelen.

Dokumentatioun wiki.mikrotik.com op PPP-Profil beräichert eis mat Informatiounen iwwer Verännerlechen verbonne mat PPP Client Verbindung an disconnection Evenementer "Skript ausféieren op Benotzer Login-Event. Dëst sinn verfügbar Variablen déi fir den Event Skript zougänglech sinn: Benotzer, lokal Adress, Remote-Adress, Caller-ID, Call-ID, Interface". E puer vun hinnen wäerten eis ganz nëtzlech sinn.

Code benotzt am Profil fir de PPP op-up Verbindung Event

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

Ech warnen Iech besonnesch fir déi, déi gär kopéieren-paste ouni Gedanken - de Code gouf aus enger Testversioun geholl a ka kleng Feeler enthalen. Et wäert net schwéier fir eng Versteesdemech Persoun erauszefannen wou genee.

Wann e Benotzer trennt, gëtt en "On-Down" Event generéiert an de entspriechende Skript mat Parameteren genannt. Den Zweck vun dësem Skript ass d'Firewall-Regelen ze botzen, déi fir den deconnectéierte Benotzer erstallt goufen.

Code benotzt am Profil fir de PPP on-down Verbindung Event

: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]
Dir kënnt dann Benotzer erstellen an e puer oder all vun hinnen un en Zwee-Faktor Authentifikatiounsprofil zouginn.

winbox
Zwee-Faktor Authentifikatioun vu VPN Benotzer iwwer MikroTik an SMS

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

Wéi gesäit et op der Client Säit aus.

Wann Dir eng VPN Verbindung opstellt, gëtt eng SMS ongeféier esou op Ären Android / iOS Telefon / Tablet mat enger SIM Kaart geschéckt:

SMS
Zwee-Faktor Authentifikatioun vu VPN Benotzer iwwer MikroTik an SMS

Wann d'Verbindung direkt vun Ärem Telefon / Tablet etabléiert ass, da kënnt Dir duerch 2FA goen einfach andeems Dir op de Link aus der Noriicht klickt. Et ass bequem.

Wann eng VPN Verbindung vun engem PC etabléiert ass, da muss de Benotzer eng minimal Form vu Passwuert aginn. Eng kleng Form a Form vun enger HTML-Datei gëtt un de Benotzer geschéckt wann Dir de VPN opstellt. De Fichier kann souguer per Mail geschéckt ginn, sou datt de Benotzer se späichere kann an eng Ofkiirzung op enger praktescher Plaz erstellen. Et gesäit sou eppes aus:

Label op den Dësch
Zwee-Faktor Authentifikatioun vu VPN Benotzer iwwer MikroTik an SMS

De Benotzer klickt op d'Ofkiirzung, en einfache Code-Entrée-Form mécht op, deen de Code an déi opgemaach URL setzt:

Form Écran
Zwee-Faktor Authentifikatioun vu VPN Benotzer iwwer MikroTik an SMS

D'Form ass déi primitivst, als Beispill uginn. Déi, déi wëllen, kënnen et änneren fir sech selwer ze passen.

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>

Wann d'Autorisatioun erfollegräich ass, gesäit de Benotzer de MikroTik Logo am Browser, deen als Signal vun enger erfollegräicher Authentifikatioun dénge soll:

Zwee-Faktor Authentifikatioun vu VPN Benotzer iwwer MikroTik an SMS

Notéiert datt d'Bild vum agebaute MikroTik Webserver mat WebProxy Deny Redirect zréckgeet.

Ech gleewen datt d'Bild mat dem "Hotspot" Tool personaliséiert ka ginn, Är eege Versioun do eropzelueden an eng Deny Redirect URL op et mat WebProxy setzen.

Eng grouss Ufro un déi, déi probéieren déi bëllegst "Spillsaachen" Mikrotik fir $ 20 ze kafen an et mat engem $ 500 Router ze ersetzen - maach dat net. Apparater wéi "hAP Lite"/"hAP mini" (Home Access Point) hunn eng ganz schwaach CPU (Smips), a si wahrscheinlech net mat der Laascht am Geschäftssegment eens.

Warnung! Dës Léisung huet een Nodeel: wann Clienten verbannen oder trennen, Konfiguratiounsännerungen geschéien, déi de Router probéiert a sengem net-flüchtege Gedächtnis ze späicheren. Mat enger grousser Zuel vu Clienten an heefeg Verbindungen an disconnections, dëst kann zu Degradatioun vun der intern Stockage am Router Féierung.

PS: Methoden fir Code un de Client ze liwweren kënnen ausgebaut an ergänzt ginn wat Är Programméierungsfäegkeeten ubelaangt. Zum Beispill kënnt Dir Messagen op Telegramm schécken oder ... Optiounen proposéieren!

Ech hoffen dësen Artikel wäert Iech nëtzlech sinn an hëlleft kleng a mëttelgrouss Geschäftsnetzwierker e bësse méi sécher ze maachen.

Source: will.com