Uwierzytelnianie dwuskładnikowe użytkowników VPN przez MikroTik i SMS

Cześć koledzy! Dziś, kiedy intensywność pasji wokół „pracy zdalnej” nieco opadła, większość adminów wygrała zadanie zdalnego dostępu pracowników do firmowej sieci, czas podzielić się moim wieloletnim doświadczeniem w ulepszaniu bezpieczeństwa VPN. Ten artykuł nie będzie teraz modny IPSec IKEv2 i xAuth. Chodzi o budowanie systemu. uwierzytelnianie dwuskładnikowe (2FA) Użytkownicy VPN, gdy MikroTik działa jako serwer VPN. Mianowicie, gdy używane są „klasyczne” protokoły, takie jak PPP.

Uwierzytelnianie dwuskładnikowe użytkowników VPN przez MikroTik i SMS

Dzisiaj powiem ci, jak chronić MikroTik PPP-VPN, nawet jeśli konto użytkownika zostanie „przejęte”. Kiedy jeden z moich klientów przedstawił ten schemat, krótko opisał go jako „no, teraz jest jak w banku!”.

Metoda nie korzysta z zewnętrznych usług uwierzytelniających. Zadania są wykonywane wewnętrznie przez sam router. Brak kosztów dla łączącego się klienta. Metoda działa zarówno dla klientów PC, jak i urządzeń mobilnych.

Ogólny schemat ochrony jest następujący:

  1. Wewnętrzny adres IP użytkownika, który pomyślnie połączył się z serwerem VPN, jest automatycznie umieszczany na szarej liście.
  2. Zdarzenie połączenia automatycznie generuje jednorazowy kod, który jest wysyłany do użytkownika jedną z dostępnych metod.
  3. Adresy na tej liście mają ograniczony dostęp do zasobów sieci lokalnej, z wyjątkiem usługi „authenticator”, która oczekuje na otrzymanie jednorazowego hasła.
  4. Po podaniu kodu użytkownik ma dostęp do wewnętrznych zasobów sieci.

pierwszy najmniejszym problemem, z jakim musiałem się zmierzyć, było przechowywanie informacji kontaktowych o użytkowniku, aby wysłać mu kod 2FA. Ponieważ w Mikrotik nie można utworzyć dowolnych pól danych odpowiadających użytkownikom, wykorzystano istniejące pole „komentarz”:

/ppp secrets dodaj imię=Pietrow hasło=4M@ngr! komentarz = "89876543210"

Drugi problem okazał się poważniejszy - wybór ścieżki i sposobu dostarczenia kodu. Obecnie realizowane są trzy schematy: a) SMS przez modem USB b) e-mail c) SMS przez e-mail dostępny dla klientów korporacyjnych czerwonego operatora komórkowego.

Tak, schematy SMS wiążą się z kosztami. Ale jeśli spojrzysz, „bezpieczeństwo zawsze dotyczy pieniędzy” (c).
Osobiście nie podoba mi się schemat z e-mailem. Nie dlatego, że wymaga, aby serwer pocztowy był dostępny dla uwierzytelnianego klienta - podział ruchu nie stanowi problemu. Jeśli jednak klient nieuważnie zapisał w przeglądarce zarówno hasła do sieci VPN, jak i do poczty e-mail, a następnie zgubił laptopa, atakujący uzyskałby z niego pełny dostęp do sieci korporacyjnej.

Więc postanowione - jednorazowy kod dostarczamy za pomocą wiadomości SMS.

trzeci Problem polegał na tym, gdzie jak wygenerować pseudolosowy kod dla 2FA w MikroTiku. W języku skryptowym RouterOS nie ma odpowiednika funkcji random() i widziałem już kilka skryptowych generatorów liczb pseudolosowych. Żaden z nich nie przypadł mi do gustu z różnych powodów.

W rzeczywistości w MikroTiku istnieje generator sekwencji pseudolosowych! Jest ukryty przed powierzchownym spojrzeniem w kontekście /certificates scep-server. Pierwsza metoda uzyskanie hasła jednorazowego jest łatwe i proste - za pomocą polecenia /certificates scep-server otp generuje. Jeśli wykonamy prostą operację przypisania zmiennej, otrzymamy wartość tablicową, którą można później wykorzystać w skryptach.

druga metoda uzyskanie hasła jednorazowego, które jest również łatwe do zastosowania - za pomocą usługi zewnętrznej random.org wygenerować żądany rodzaj sekwencji liczb pseudolosowych. Oto uproszczenie wspornik przykład pobierania danych do zmiennej:

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

Żądanie sformatowane dla konsoli (w treści skryptu wymagane będą specjalne znaki ucieczki) otrzymuje ciąg sześciu cyfr do zmiennej $rnd1. Następujące polecenie „put” po prostu wyświetla zmienną w konsoli MikroTik.

Czwarty problem który trzeba było szybko rozwiązać - tak i gdzie podłączony klient przekaże swój jednorazowy kod na drugim etapie uwierzytelnienia.

Uwierzytelnianie dwuskładnikowe użytkowników VPN przez MikroTik i SMS

Na routerze MikroTik musi być usługa, która może zaakceptować kod i dopasować go do konkretnego klienta. Jeśli podany kod jest zgodny z oczekiwanym, adres klienta powinien znaleźć się na pewnej „białej” liście adresów, z których dozwolony jest dostęp do sieci wewnętrznej firmy.

Ze względu na zły dobór usług zdecydowano się na przyjmowanie kodów przez http z wykorzystaniem wbudowanego w Mikrotik webproxy. A ponieważ firewall może pracować z dynamicznymi listami adresów IP, to właśnie firewall wykonuje wyszukiwanie kodu, dopasowując go do adresu IP klienta i dodając go do „białej” listy za pomocą wyrażenia regularnego Layer7. Samemu routerowi przypisano warunkową nazwę DNS „gw.local”, utworzono na nim statyczny rekord A do wydawania klientom PPP:

DNS
/ip dns static dodaj nazwę=gw.lokalny adres=172.31.1.1

Przechwytywanie ruchu niezweryfikowanych klientów na serwerze 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

W tym przypadku proxy ma dwie funkcje.

1. Otwórz połączenia tcp z klientami;

2. W przypadku udanej autoryzacji przekieruj przeglądarkę klienta na stronę lub obrazek informujący o pomyślnym uwierzytelnieniu:

Konfiguracja proxy
/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

Wymienię ważne elementy konfiguracji:

  1. interface-list "2fa" - dynamiczna lista interfejsów klienckich, z których ruch wymaga przetworzenia w ramach 2FA;
  2. address-list "2fa_jailed" - "szara" lista tunelowych adresów IP klientów VPN;
  3. address_list "2fa_approved" - "biała" lista tunelowych adresów IP klientów VPN, którzy pomyślnie przeszli uwierzytelnianie dwuskładnikowe.
  4. łańcuch firewalla „input_2fa” - sprawdza pakiety tcp pod kątem obecności kodu autoryzacyjnego i dopasowuje adres IP nadawcy kodu do wymaganego. Reguły w łańcuchu są dodawane i usuwane dynamicznie.

Uproszczony schemat przetwarzania pakietów wygląda następująco:

Uwierzytelnianie dwuskładnikowe użytkowników VPN przez MikroTik i SMS

Aby dostać się do Layer7 kontroli ruchu od klientów z „szarej” listy, którzy nie przeszli jeszcze drugiego etapu uwierzytelnienia, w standardowym łańcuchu „input” utworzono regułę:

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

Teraz zacznijmy wiązać całe to bogactwo z usługą PPP. MikroTik umożliwia stosowanie skryptów w profilach (ppp-profile) i przypisywanie ich do zdarzeń nawiązania i zerwania połączenia ppp. Ustawienia profilu ppp można zastosować do całego serwera PPP lub do poszczególnych użytkowników. Jednocześnie profil przypisany do użytkownika ma pierwszeństwo, nadrzędnie nad parametrami profilu wybranego dla serwera jako całości z jego określonymi parametrami.

Dzięki takiemu podejściu możemy stworzyć specjalny profil do uwierzytelniania dwuskładnikowego i przypisać go nie wszystkim użytkownikom, ale tylko tym, którzy uznają to za konieczne. Może to mieć znaczenie, jeśli korzystasz z usług PPP nie tylko do łączenia użytkowników końcowych, ale jednocześnie do budowania połączeń między lokacjami.

W nowo utworzonym profilu specjalnym stosujemy dynamiczne dodawanie adresu i interfejsu podłączonego użytkownika do „szarych” list adresów i interfejsów:

Winbox
Uwierzytelnianie dwuskładnikowe użytkowników VPN przez MikroTik i SMS

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

Do wykrywania i przechwytywania ruchu pochodzącego od innych niż drugorzędnych klientów VPN w łańcuchu dstnat (prerouting) konieczne jest używanie zarówno list adresów, jak i list interfejsów.

Po zakończeniu przygotowań, utworzeniu dodatkowych łańcuchów firewall i profilu napiszemy skrypt odpowiedzialny za automatyczne generowanie kodu 2FA oraz poszczególnych reguł firewall.

Dokumentacja wiki.mikrotik.com na PPP-Profile wzbogaca nas o informacje o zmiennych związanych ze zdarzeniami connect-disconnect klienta PPP „Wykonaj skrypt na zdarzeniu logowania użytkownika. Są to dostępne zmienne, które są dostępne dla skryptu zdarzenia: użytkownik, adres lokalny, adres zdalny, identyfikator dzwoniącego, identyfikator wywoływanego, interfejs". Niektóre z nich są dla nas bardzo przydatne.

Kod używany w profilu dla zdarzenia nawiązania połączenia PPP

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

Specjalnie dla tych, którzy lubią bezmyślnie kopiować, ostrzegam - kod jest wzięty z wersji testowej i może zawierać drobne literówki. Rozumnej osobie nie będzie trudno ustalić, gdzie dokładnie.

Kiedy użytkownik rozłącza się, generowane jest zdarzenie „On-Down” i wywoływany jest odpowiedni skrypt z parametrami. Zadaniem tego skryptu jest wyczyszczenie reguł firewalla utworzonych dla odłączonego użytkownika.

Kod używany w profilu dla zdarzenia włączenia i wyłączenia połączenia PPP

: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]
Następnie możesz utworzyć użytkowników i przypisać wszystkich lub niektórych z nich do profilu uwierzytelniania dwuskładnikowego.

Winbox
Uwierzytelnianie dwuskładnikowe użytkowników VPN przez MikroTik i SMS

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

Jak to wygląda od strony klienta.

Po nawiązaniu połączenia VPN telefon/tablet z systemem Android/iOS z kartą SIM otrzymuje SMS-a o treści:

SMS-y
Uwierzytelnianie dwuskładnikowe użytkowników VPN przez MikroTik i SMS

Jeśli połączenie jest nawiązywane bezpośrednio z telefonu / tabletu, możesz przejść przez 2FA po prostu klikając link z wiadomości. To jest wygodne.

Jeśli połączenie VPN jest nawiązywane z komputera PC, użytkownik będzie musiał wprowadzić minimalny formularz hasła. Mały formularz w postaci pliku HTML jest przekazywany użytkownikowi podczas konfigurowania VPN. Plik można nawet wysłać pocztą, aby użytkownik mógł go zapisać i utworzyć skrót w dogodnym miejscu. To wygląda tak:

Etykieta na stole
Uwierzytelnianie dwuskładnikowe użytkowników VPN przez MikroTik i SMS

Użytkownik klika na skrót, otwiera się prosty formularz wprowadzania kodu, który wklei kod do otwartego adresu URL:

Formularz ekranu
Uwierzytelnianie dwuskładnikowe użytkowników VPN przez MikroTik i SMS

Jako przykład podano najbardziej prymitywną formę. Ci, którzy chcą, mogą zmodyfikować dla siebie.

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>

Jeśli autoryzacja przebiegła pomyślnie, użytkownik zobaczy w przeglądarce logo MikroTik, co powinno sygnalizować pomyślne uwierzytelnienie:

Uwierzytelnianie dwuskładnikowe użytkowników VPN przez MikroTik i SMS

Zwróć uwagę, że obraz jest zwracany z wbudowanego serwera sieciowego MikroTik przy użyciu WebProxy Deny Redirect.

Przypuszczam, że obraz można dostosować za pomocą narzędzia „hotspot”, przesyłając tam własną wersję i ustawiając adres URL przekierowania Odmów do niego za pomocą WebProxy.

Wielka prośba do tych, którzy próbują kupić najtańszego "zabawkę" Mikrotika za 20 dolarów i zastąpić nim router za 500 dolarów - nie róbcie tego. Urządzenia typu „hAP Lite” / „hAP mini” (domowy punkt dostępowy) mają bardzo słaby procesor (smips) i prawdopodobnie nie poradzą sobie z obciążeniem w segmencie biznesowym.

Ostrzeżenie! To rozwiązanie ma jedną wadę: gdy klienci łączą się lub rozłączają, następują zmiany konfiguracji, które router stara się zapisać w swojej pamięci nieulotnej. Przy dużej liczbie klientów oraz częstych połączeniach i rozłączeniach może to prowadzić do degradacji pamięci wewnętrznej routera.

PS: Metody dostarczania kodu do klienta można rozbudowywać i uzupełniać w miarę swoich możliwości programistycznych. Na przykład możesz wysyłać wiadomości do telegramu lub ... sugerować opcje!

Mam nadzieję, że artykuł będzie dla Ciebie przydatny i pomoże uczynić sieci małych i średnich firm trochę bardziej bezpiecznymi.

Źródło: www.habr.com