Guten Tag, Kollegen! Heute, nachdem sich die Aufregung um das Homeoffice etwas gelegt hat und die meisten Administratoren die Herausforderung des Remote-Zugangs zur Unternehmensnetzwerk gemeistert haben, ist es an der Zeit, meine langjährige Erfahrung zur Erhöhung der Sicherheit von VPN zu teilen. In diesem Artikel werden keine modernen IPSec IKEv2 und xAuth behandelt. Es geht um den Aufbau eines Systems von VPN-Nutzern, bei dem MikroTik als VPN-Server fungiert. Genauer gesagt, wenn „klassische“ Protokolle wie PPP verwendet werden.

Heute werde ich Ihnen zeigen, wie Sie MikroTik PPP-VPN selbst im Fall eines „Übergriffs“ auf ein Benutzerkonto schützen können. Als dieses Schema bei einem meiner Kunden implementiert wurde, beschrieb er es kurz mit den Worten: „Nun, jetzt ist es wie in einer Bank!“
Die Methode verwendet keine externen Authentifizierungsdienste. Die Aufgaben werden mit den internen Mitteln des Routers selbst erledigt. Ohne Kosten für den anschließenden Klienten. Die Methode funktioniert sowohl für PC-Kunden als auch für mobile Geräte.
Das allgemeine Schutzschema sieht folgendermaßen aus:
- Die interne IP-Adresse des Benutzers, der sich erfolgreich mit dem VPN-Server verbunden hat, wird automatisch auf die „graue“ Liste gesetzt.
- Das Verbindungsereignis generiert automatisch einen Einmalcode, der dem Benutzer auf einem der verfügbaren Wege übermittelt wird.
- Adressen, die sich in dieser Liste befinden, haben eingeschränkten Zugriff auf die Ressourcen des lokalen Netzwerks, mit Ausnahme des „Authentifizierungsdienstes“, der auf den Erhalt des Einmalcode-Passworts wartet.
- Nach Vorlage des Codes erhält der Benutzer Zugang zu den internen Ressourcen des Netzwerks.
Erster Das kleinste Problem, mit dem ich konfrontiert wurde, war die Speicherung der Kontaktdaten des Benutzers zur Übermittlung des 2FA-Codes. Da es im MikroTik keine willkürlich benennbaren Felder für Benutzer gibt, wurde das bestehende Feld „Kommentar“ verwendet:
/ppp secrets add name=Petrov password=4M@ngr! comment=«89876543210»
Die zweite Das Problem war gravierender – die Wahl des Weges und der Methode zur Zustellung des Codes. Derzeit sind drei Schemen implementiert: a) SMS über ein USB-Modem b) E-Mail c) SMS über E-Mail, verfügbar für Unternehmensklienten des roten Mobilfunkanbieters.
Ja, die SMS-Optionen verursachen Kosten. Aber wenn man es genau betrachtet, ist „Sicherheit immer auch eine Kostenfrage“ (c).
Das E-Mail-System gefällt mir persönlich nicht. Nicht, weil es die Erreichbarkeit des Mailservers für den authentifizierbaren Client erfordert – das ist kein Problem, den Datenverkehr zu trennen. Wenn der Client jedoch nachlässig seine Passwörter sowohl für VPN als auch für die Mail im Browser gespeichert hat und dann seinen Laptop verliert, erhält der Angreifer vollen Zugriff auf das Unternehmensnetzwerk.
Also, entschieden – wir liefern den Einmalcode per SMS.
Dritte Das Problem war, wo und wie man in MikroTik einen pseudorandomisierten Code für 2FA generiert.In der Skriptsprache von RouterOS gibt es kein Äquivalent zur Funktion random(), und ich habe zuvor mehrere Workaround-Skripte zur Generierung von pseudorandomisierten Zahlen gesehen. Keines davon hat mir aus verschiedenen Gründen gefallen.
Tatsächlich gibt es einen Pseudorandom-Zahlen-Generator in MikroTik! Er ist vor oberflächlichen Blicken im Kontext /certificates scep-server versteckt. Erste Methode Es ist einfach und unkompliziert, ein Einmalpasswort zu erhalten – durch den Befehl. /certificates scep-server otp generateWenn wir eine einfache Zuweisungsoperation für eine Variable durchführen, erhalten wir einen Array-Wert, der später in den Skripten verwendet werden kann.
Die zweite Methode Empfang einer Einmalpasswort, das ebenfalls einfach anzuwenden ist – Nutzung eines externen Dienstes zur Generierung der gewünschten Art von sekvensiellen Pseudo-Zufallszahlen. Hier ist ein vereinfachtes Konsolen- Beispiel zur Übertragung von Daten in eine Variable:
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
Die Anfrage, die für die Konsole formatiert wurde (im Scriptkörper müssen Sonderzeichen escaped werden), erhält eine Zeichenkette aus sechs Ziffern in der Variable $rnd1. Der nächste Befehl „put“ zeigt einfach die Variable in der MikroTik-Konsole an.
Das vierte Problem, das schnell gelöst werden musste, war, wie und wo der verbundene Kunde seinen Einmalcode in der zweiten Authentifizierungsstufe überträgt.

Auf dem MikroTik-Router sollte ein Dienst existieren, der in der Lage ist, den Code zu empfangen und ihn einem bestimmten Kunden zuzuordnen. Bei Übereinstimmung des bereitgestellten Codes mit dem erwarteten, sollte die Adresse des Kunden in eine Art „Whitelist“ aufgenommen werden, für die der Zugang zum internen Netzwerk des Unternehmens erlaubt ist.
Angesichts der begrenzten Auswahl an Diensten wurde beschlossen, die Codes über HTTP mithilfe des in MikroTik integrierten Webproxies zu akzeptieren. Da die Firewall mit dynamischen IP-Adresslisten arbeiten kann, führt sie die Suche nach dem Code, den Abgleich mit der Client-IP und die Aufnahme in die "Whitelist" über Layer7-Regulärexpressionen aus. Dem Router wurde der DNS-Name "gw.local" zugewiesen, und es wurde ein statischer A-Record für die Bereitstellung an PPP-Clients erstellt:
DNS
/ip dns static add name=gw.local address=172.31.1.1
Traffic-Überwachung von nicht überprüften Clients über den 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
In diesem Fall hat der Proxy zwei Funktionen.
1. TCP-Verbindungen zu Clients herstellen;
2. Im Falle einer erfolgreichen Authentifizierung den Browser des Clients auf eine Seite oder ein Bild weiterleiten, das über den erfolgreichen Abschluss der Authentifizierung informiert:
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
Ich werde die wichtigen Konfigurationselemente auflisten:
- interface-list "2fa" — dynamische Liste der Client-Schnittstellen, deren Traffic im Rahmen von 2FA verarbeitet werden muss;
- address-list "2fa_jailed" — "graue" Liste der Tunnel-IP-Adressen von VPN-Clients;
- address_list "2fa_approved" — "weiße" Liste der Tunnel-IP-Adressen von VPN-Clients, die die Zwei-Faktor-Authentifizierung erfolgreich durchlaufen haben.
- Die Firewall-Kette „input_2fa“ überprüft TCP-Pakete auf das Vorhandensein eines Authentifizierungscodes und darauf, ob die IP-Adresse des sendenden Codes mit der erforderlichen übereinstimmt. Regeln werden dynamisch zur Kette hinzugefügt und entfernt.
Das vereinfachte Flussdiagramm zur Paketverarbeitung sieht folgendermaßen aus:
Um die Überprüfung des Layer 7 für Kundenverkehr aus der „Grauen“ Liste, die die zweite Authentifizierungsstufe noch nicht durchlaufen haben, zu ermöglichen, wurde in der Standardkette „input“ eine Regel erstellt:
Code
/ip firewall filter add chain=input !src-address-list=2fa_genehmigt action=jump jump-target=input_2fa
Nun beginnen wir, all diese Funktionen mit dem PPP-Service zu verknüpfen. MikroTik erlaubt die Verwendung von Skripten in Profilen (ppp-profile) und deren Zuweisung zu Ereignissen beim Aufbau und Abbruch von PPP-Verbindungen. Die Einstellungen des ppp-profiles können sowohl für den gesamten PPP-Server als auch für einzelne Benutzer angewendet werden. Dabei hat das dem Benutzer zugewiesene Profil Vorrang und überschreibt die Einstellungen des für den Server insgesamt gewählten Profils.
Durch diesen Ansatz können wir ein spezielles Profil für die Zwei-Faktor-Authentifizierung erstellen und es nicht für alle Benutzer, sondern nur für diejenigen zuweisen, die wir für erforderlich halten. Dies kann insbesondere relevant sein, wenn die PPP-Dienste nicht nur zur Verbindung von Endbenutzern, sondern gleichzeitig auch zum Aufbau von Site-to-Site-Verbindungen verwendet werden.
Im neu erstellten speziellen Profil verwenden wir die dynamische Hinzufügung der Adresse und des Interfaces des sich verbindenden Benutzers in die „grauen“ Adress- und Interface-Listen:
winbox
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
Die gleichzeitige Nutzung der Listen „address-list“ und „interface-list“ ist erforderlich, um den Verkehr von VPN-Clients, die keine sekundäre Autorisierung durchlaufen haben, im dstnat-Ketten (prerouting) zu identifizieren und zu erfassen.
Wenn die Vorbereitung abgeschlossen ist, werden zusätzliche Firewall-Ketten und das Profil erstellt. Lassen Sie uns ein Skript schreiben, das für die Autogenerierung von 2FA-Code und einzelnen Firewall-Regeln verantwortlich ist.
über PPP-Profile bereichert uns mit Informationen zu Variablen, die mit den Verbindungs- und Trennereignissen des PPP-Clients verbunden sind. „Skript bei Benutzeranmeldung ausführen. Dies sind die verfügbaren Variablen, die für das Ereignisskript zugänglich sind: user, local-address, remote-address, caller-id, called-id, interface“. Einige davon werden uns sehr nützlich sein.
Der im Profil verwendete Code für das PPP on-up Verbindungsereignis.
#Логируем для отладки полученные переменные :log info ("lokale-Adresse")
:log info ("Remote-Adresse")
:log info ("Anrufer-ID")
:log info ("Rufnummer")
:log info ([/int pptp-server get ("Schnittstelle") name])
#Объявляем свои локальные переменные
:local listname "2fa_jailed"
:local viamodem false
:local modemport "usb2"
#ищем автоматически созданную запись в адрес-листе "2fa_jailed"
:local recnum1 [/ip fi address-list find address=("Remote-Adresse") 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 ("Ihr Code: ".$comm1."n Oder öffnen Sie den 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 from=admin@mydomain.example to=mail2sms@mcommunicator.ru subject="@".$vphone body=$msgboby }#Генерируем Layer7 regexp
local vregexp ("otp\/".$comm1)
:local vcomment ("2fa_".("Remote-Adresse"))
/ip firewall layer7-protocol add name=("vcomment") comment=(
"Remote-Adresse") regexp=(
"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=("vcomment") protocol=tcp src-address=(
"Remote-Adresse") dst-limit=1,1,src-address/1m40s
Für alle, die gerne gedankenlos kopieren und einfügen, ein Hinweis: Der Code stammt aus einer Testversion und könnte kleinere Tippfehler enthalten. Es ist für jemanden, der sich auskennt, nicht schwierig, herauszufinden, wo genau.Beim Trennen eines Benutzers wird das Ereignis „On-Down“ generiert und das entsprechende Skript mit den Parametern aufgerufen. Die Aufgabe dieses Skripts besteht darin, die Firewall-Regeln zu bereinigen, die für den getrennten Benutzer erstellt wurden.
Der im Profil verwendete Code für das PPP on-down Verbindungsereignis.
:local vcomment ("2fa_".("Remote-Adresse"))
/ip firewall address-list remove [find address=("remote-address") list=2fa_approved]
/ip firewall filter remove [find chain="input_2fa" src-address=("remote-address") ]
/ip firewall layer7-protocol remove [find name=$vcomment]
Danach können Benutzer erstellt und allen oder einigen von ihnen ein Profil mit Zwei-Faktor-Authentifizierung zugewiesen werden.winbox
Code
/ppp secrets set [find name=Petrov] profile=2FASo sieht es auf der Client-Seite aus.
Beim Einrichten einer VPN-Verbindung erhält das Android/iOS-Telefon/Tablet mit SIM-Karte eine SMS in etwa folgender Form:
SMS
Wenn die Verbindung direkt vom Telefon/Tablet hergestellt wird, kann die 2FA einfach durch Klicken auf den Link in der Nachricht erfolgen. Das ist praktisch.
Wenn die VPN-Verbindung mit einem PC hergestellt wird, benötigt der Benutzer ein minimales Passwort-Eingabeformular. Ein kleines Formular in Form einer HTML-Datei wird dem Benutzer bei der Einrichtung des VPNs zur Verfügung gestellt. Diese Datei kann sogar per E-Mail versendet werden, damit der Benutzer sie speichern und eine Verknüpfung an einem bequemen Ort erstellen kann. So könnte es aussehen:
Verknüpfung auf dem Desktop
Der Benutzer klickt auf die Verknüpfung, ein einfaches Eingabeformular öffnet sich, das den Code in die geöffnete URL einfügt:
Screenshot des Formulars
Das Formular ist sehr rudimentär und dient nur als Beispiel. Interessierte können es nach ihren Wünschen anpassen.
2fa_login_mini.html
<html> <head> <title>SMS-OTP-Anmeldung</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form name="login" action="/de/location.href='http://gw.local/otp/'+document.getElementById(‘text').value/" method="post" <input id="text" type="text" data-trp-original-action="location.href='http://gw.local/otp/'+document.getElementById(‘text').value"/><input type="hidden" name="trp-form-language" value="de"/> <input type="button" value="Anmelden" onclick="location.href='http://gw.local/otp/'+document.getElementById('text').value"/> </form> </body> </html>Wenn die Authentifizierung erfolgreich war, sieht der Benutzer im Browser das Logo von MikroTik, was als Zeichen für eine erfolgreiche Authentifizierung dient:
Ich möchte anmerken, dass das Bild von dem integrierten Webserver MikroTik über WebProxy Deny Redirect zurückgegeben wird.
Ich gehe davon aus, dass das Bild anpassbar ist, indem das Tool „Hotspot“ verwendet wird, um eine eigene Variante hochzuladen und die Deny Redirect URL mit WebProxy festzulegen.
Eine große Bitte an diejenigen, die versuchen, den günstigsten "Spielzeug" MikroTik für 20 $ zu kaufen, um damit einen 500 $ Router zu ersetzen – das sollten Sie besser lassen. Geräte wie der „hAP Lite“/„hAP mini“ (Home Access Point) haben eine sehr schwache CPU (smips) und werden wahrscheinlich mit der Last im Geschäftsumfeld nicht zurechtkommen.
Warnung! Bei dieser Lösung gibt es einen Nachteil: Beim Anschließen und Trennen von Clients ändern sich die Konfigurationen, die der Router in seinem nichtflüchtigen Speicher zu speichern versucht. Bei einer großen Anzahl von Clients und häufigen Verbindungen und Trennungen kann dies zu einer Degradierung des internen Speichers im Router führen.
P.S.: Die Methoden zur Bereitstellung von Code an den Kunden können erweitert und ergänzt werden, soweit es Ihre Programmierfähigkeiten zulassen. Zum Beispiel können Nachrichten über Telegram gesendet werden oder... schlagen Sie Alternativen vor!
Ich hoffe, der Artikel ist für Sie nützlich und trägt dazu bei, die Netzwerke kleiner und mittelständischer Unternehmen ein wenig sicherer zu machen.
Quelle: habr.com




