MikroTik və SMS vasitəsilə VPN istifadəçilərinin iki faktorlu autentifikasiyası

Salam həmkarlar! Bu gün, "uzaqdan iş" ətrafında ehtirasların intensivliyi bir qədər azaldıqda, adminlərin əksəriyyəti işçilərin korporativ şəbəkəyə uzaqdan daxil olması tapşırığını qazandı, VPN təhlükəsizliyini yaxşılaşdırmaqda çoxdankı təcrübəmi bölüşmək vaxtı gəldi. Bu məqalə indi dəb olmayacaq IPSec IKEv2 və xAuth. Söhbət bir sistemin qurulmasından gedir. iki faktorlu autentifikasiya (2FA) MikroTik VPN serveri kimi çıxış etdikdə VPN istifadəçiləri. Məhz, PPP kimi "klassik" protokollar istifadə edildikdə.

MikroTik və SMS vasitəsilə VPN istifadəçilərinin iki faktorlu autentifikasiyası

Bu gün sizə istifadəçi hesabının "oğurlanması" halında belə MikroTik PPP-VPN-i necə qoruyacağınızı söyləyəcəyəm. Müştərilərimdən birinə bu sxem təqdim olunanda o, qısaca onu “yaxşı, indi bankdakı kimidir!” kimi təsvir etdi.

Metod xarici autentifikator xidmətlərindən istifadə etmir. Tapşırıqlar daxili olaraq marşrutlaşdırıcının özü tərəfindən yerinə yetirilir. Əlaqədar müştəri üçün heç bir xərc tələb olunmur. Metod həm PC müştəriləri, həm də mobil cihazlar üçün işləyir.

Ümumi qorunma sxemi aşağıdakı kimidir:

  1. VPN serverinə uğurla qoşulmuş istifadəçinin daxili IP ünvanı avtomatik olaraq boz siyahıya salınır.
  2. Bağlantı hadisəsi avtomatik olaraq mövcud üsullardan birini istifadə edərək istifadəçiyə göndərilən birdəfəlik kod yaradır.
  3. Bu siyahıdakı ünvanların birdəfəlik parol almağı gözləyən “autentifikator” xidməti istisna olmaqla, yerli şəbəkə resurslarına çıxışı məhduddur.
  4. Kodu təqdim etdikdən sonra istifadəçi şəbəkənin daxili resurslarına çıxış əldə edir.

Ilk üzləşdiyim ən kiçik problem istifadəçiyə 2FA kodunu göndərmək üçün onun əlaqə məlumatlarını saxlamaq idi. Mikrotik-də istifadəçilərə uyğun ixtiyari məlumat sahələri yaratmaq mümkün olmadığı üçün mövcud "şərh" sahəsindən istifadə edilmişdir:

/ppp sirləri əlavə ad=Petrov parolu=4M@ngr! şərh="89876543210"

İkinci problem daha ciddi oldu - kodun çatdırılma yolunun və metodunun seçimi. Hazırda üç sxem həyata keçirilir: a) USB-modem vasitəsilə SMS b) e-poçt c) Qırmızı mobil operatorun korporativ müştəriləri üçün elektron poçt vasitəsilə SMS.

Bəli, SMS sxemləri xərc gətirir. Amma baxsanız, “təhlükəsizlik həmişə pulla bağlıdır” (c).
Şəxsən mən elektron poçtla sxemi bəyənmirəm. Ona görə yox ki, o, poçt serverinin autentifikasiya edilən müştəri üçün əlçatan olmasını tələb edir - trafiki bölmək problem deyil. Bununla belə, müştəri ehtiyatsızlıqdan brauzerdə həm vpn, həm də e-poçt parollarını saxlasa və sonra laptopunu itirərsə, təcavüzkar ondan korporativ şəbəkəyə tam giriş əldə edərdi.

Beləliklə, qərar verildi - SMS mesajlarından istifadə edərək birdəfəlik kodu çatdırırıq.

Üçüncü Problem harada idi MikroTik-də 2FA üçün psevdo-təsadüfi kodu necə yaratmaq olar. RouterOS skript dilində random() funksiyasının analoqu yoxdur və mən əvvəllər bir neçə psevdo-təsadüfi nömrə generatoru görmüşəm. Müxtəlif səbəblərdən heç birini bəyənmədim.

Əslində, MikroTik-də psevdo-təsadüfi ardıcıllıq generatoru var! O, /certificates scep-server kontekstində səthi baxışdan gizlədilir. ПÐμÑ € Ð²Ñ <й Ñ Ð¿Ð¾Ñ Ð¾Ð ± birdəfəlik parol əldə etmək asan və sadədir - əmrlə / sertifikatlar scep-server otp yaradır. Sadə bir dəyişən təyin etmə əməliyyatını yerinə yetirsək, sonradan skriptlərdə istifadə edilə bilən massiv dəyəri alacağıq.

ikinci yol tətbiqi asan olan birdəfəlik parol əldə etmək - xarici xidmətdən istifadə etməklə random.org psevdo-təsadüfi ədədlərin istənilən növ ardıcıllığını yaratmaq. Budur sadələşdirilmiş cantilever verilənlərin dəyişənə daxil edilməsinə misal:

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

Konsol üçün formatlaşdırılmış sorğu (skript əsasında xüsusi simvollardan qaçmaq tələb olunacaq) $rnd1 dəyişəninə altı rəqəmdən ibarət sətir qəbul edir. Aşağıdakı "qoyur" əmri sadəcə olaraq MikroTik konsolunda dəyişəni göstərir.

Dördüncü problem tez həll edilməli olan - qoşulmuş müştəri autentifikasiyanın ikinci mərhələsində birdəfəlik kodunu necə və harada ötürəcək.

MikroTik və SMS vasitəsilə VPN istifadəçilərinin iki faktorlu autentifikasiyası

MikroTik marşrutlaşdırıcısında kodu qəbul edə və müəyyən bir müştəri ilə uyğunlaşdıra bilən bir xidmət olmalıdır. Təqdim olunan kod gözlənilən kodla uyğun gəlirsə, müştərinin ünvanı müəyyən "ağ" siyahıya daxil edilməlidir, ünvanları şirkətin daxili şəbəkəsinə daxil olmağa icazə verilir.

Xidmətlərin zəif seçimi səbəbindən Mikrotik-də quraşdırılmış webproxy-dən istifadə edərək http vasitəsilə kodları qəbul etmək qərara alındı. Firewall IP ünvanlarının dinamik siyahıları ilə işləyə bildiyindən, kodun axtarışını həyata keçirən, onu müştəri IP-si ilə uyğunlaşdıran və Layer7 regexp istifadə edərək onu “ağ” siyahıya əlavə edən təhlükəsizlik duvarıdır. Routerin özünə şərti DNS adı "gw.local" verilmişdir, PPP müştərilərinə verilməsi üçün onun üzərində statik A qeydi yaradılmışdır:

DNS
/ip dns statik əlavə adı=gw.yerli ünvan=172.31.1.1

Proksi üzərində yoxlanılmamış müştərilərin trafikinin tutulması:
/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

Bu halda proxy iki funksiyaya malikdir.

1. Müştərilərlə tcp əlaqələrini açın;

2. Uğurlu avtorizasiya halında, müştəri brauzerini uğurlu autentifikasiya haqqında bildiriş verən səhifəyə və ya şəkilə yönləndirin:

Proksi konfiqurasiyası
/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

Mühüm konfiqurasiya elementlərini sadalayacağam:

  1. interfeys siyahısı "2fa" - trafik 2FA daxilində emal tələb edən müştəri interfeyslərinin dinamik siyahısı;
  2. ünvan siyahısı "2fa_jailed" - VPN müştərilərinin tunel IP ünvanlarının "boz" siyahısı;
  3. address_list "2fa_approved" - iki faktorlu autentifikasiyadan uğurla keçmiş VPN müştərilərinin tunel IP ünvanlarının "ağ" siyahısı.
  4. firewall zənciri "input_2fa" - o, tcp paketlərini avtorizasiya kodunun olub-olmadığını yoxlayır və kod göndərənin IP ünvanını tələb olunanla uyğunlaşdırır. Zəncirdəki qaydalar dinamik şəkildə əlavə edilir və silinir.

Paket emalının sadələşdirilmiş sxemi belə görünür:

MikroTik və SMS vasitəsilə VPN istifadəçilərinin iki faktorlu autentifikasiyası

Doğrulamanın ikinci mərhələsindən hələ keçməmiş "boz" siyahıdan müştərilərdən trafikin Layer7 yoxlamasına daxil olmaq üçün standart "giriş" zəncirində bir qayda yaradılmışdır:

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

İndi gəlin bütün bu zənginliyi PPP xidmətinə bağlamağa başlayaq. MikroTik sizə profillərdə (ppp-profil) skriptlərdən istifadə etməyə və onları ppp bağlantısının qurulması və kəsilməsi hadisələrinə təyin etməyə imkan verir. Ppp-profil parametrləri bütövlükdə PPP serverinə və ya fərdi istifadəçilərə tətbiq oluna bilər. Eyni zamanda, istifadəçiyə təyin edilmiş profil, bütövlükdə server üçün seçilmiş profilin parametrlərini müəyyən edilmiş parametrləri ilə əvəz edərək, prioritetə ​​malikdir.

Bu yanaşma nəticəsində biz iki faktorlu autentifikasiya üçün xüsusi profil yarada və onu bütün istifadəçilərə deyil, yalnız bunu zəruri hesab edənlərə təyin edə bilərik. Bu, PPP xidmətlərindən yalnız son istifadəçiləri birləşdirmək üçün deyil, eyni zamanda saytdan sayta bağlantılar qurmaq üçün istifadə etsəniz, aktual ola bilər.

Yeni yaradılmış xüsusi profildə biz qoşulmuş istifadəçinin ünvan və interfeysinin ünvan və interfeyslərin "boz" siyahılarına dinamik əlavə edilməsindən istifadə edirik:

winbox
MikroTik və SMS vasitəsilə VPN istifadəçilərinin iki faktorlu autentifikasiyası

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

Dstnat (qabaqcadan marşrutlaşdırma) zəncirində ikinci dərəcəli olmayan VPN müştərilərindən gələn trafiki aşkar etmək və tutmaq üçün həm “ünvan siyahısı”, həm də “interfeys siyahısı” siyahılarından istifadə etmək lazımdır.

Hazırlıq tamamlandıqda, əlavə təhlükəsizlik divarı zəncirləri və profil yaradıldıqda, biz 2FA kodunun avtomatik yaradılması və fərdi təhlükəsizlik duvarı qaydaları üçün cavabdeh olan skript yazacağıq.

Sənədlər wiki.mikrotik.com PPP-Profilində bizi PPP müştəri qoşulma-bağlantıyı kəsmə hadisələri ilə əlaqəli dəyişənlər haqqında məlumatla zənginləşdirir "İstifadəçi giriş hadisəsində skripti icra edin. Bunlar hadisə skripti üçün əlçatan olan mövcud dəyişənlərdir: istifadəçi, yerli ünvan, uzaq ünvan, zəng edənin identifikatoru, çağırılan id, interfeys". Onların bəziləri bizim üçün çox faydalıdır.

PPP on-up əlaqə hadisəsi üçün profildə istifadə edilən kod

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

Xüsusən də ehtiyatsız surətdə yapışdırmağı sevənlər üçün xəbərdarlıq edirəm - kod test versiyasından götürülüb və kiçik hərf səhvləri ola bilər. Anlayan insan üçün tam olaraq harada olduğunu anlamaq çətin olmayacaq.

İstifadəçi əlaqəni kəsdikdə “On-Down” hadisəsi yaradılır və parametrləri olan müvafiq skript çağırılır. Bu skriptin məqsədi əlaqəsi kəsilmiş istifadəçi üçün yaradılmış firewall qaydalarını təmizləməkdir.

PPP on-down əlaqə hadisəsi üçün profildə istifadə edilən kod

: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]
Daha sonra siz istifadəçilər yarada və onların hamısını və ya bəzilərini iki faktorlu autentifikasiya profilinə təyin edə bilərsiniz.

winbox
MikroTik və SMS vasitəsilə VPN istifadəçilərinin iki faktorlu autentifikasiyası

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

Müştəri tərəfində necə görünür.

VPN bağlantısı qurulduqda, SİM kartı olan Android/iOS telefonu/planşet belə bir SMS alır:

SMS
MikroTik və SMS vasitəsilə VPN istifadəçilərinin iki faktorlu autentifikasiyası

Bağlantı birbaşa telefondan / planşetdən qurulubsa, mesajdakı keçidə klikləməklə 2FA-dan keçə bilərsiniz. Rahatdır.

VPN bağlantısı PC-dən qurulubsa, istifadəçidən minimal parol formasını daxil etmək tələb olunacaq. VPN-i qurarkən istifadəçiyə HTML faylı şəklində kiçik bir forma verilir. Fayl hətta poçtla da göndərilə bilər ki, istifadəçi onu saxlasın və əlverişli yerdə qısa yol yaratsın. Bu belə görünür:

Masanın üzərindəki etiket
MikroTik və SMS vasitəsilə VPN istifadəçilərinin iki faktorlu autentifikasiyası

İstifadəçi qısa yola klik edir, kodu açılmış URL-ə yapışdıracaq sadə kod giriş forması açılır:

Ekran forması
MikroTik və SMS vasitəsilə VPN istifadəçilərinin iki faktorlu autentifikasiyası

Ən primitiv forma nümunə olaraq verilmişdir. İstəyənlər özləri üçün dəyişiklik edə bilərlər.

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>

Avtorizasiya uğurlu olarsa, istifadəçi brauzerdə MikroTik loqosunu görəcək və bu, uğurlu autentifikasiyanı göstərməlidir:

MikroTik və SMS vasitəsilə VPN istifadəçilərinin iki faktorlu autentifikasiyası

Qeyd edək ki, şəkil WebProxy Deny Redirect istifadə edərək quraşdırılmış MikroTik veb serverindən qaytarılır.

Güman edirəm ki, şəkil "qaynar nöqtə" alətindən istifadə etməklə fərdiləşdirilə bilər, orada öz versiyanı yükləyə və WebProxy ilə ona Yönləndirmə URL-sini rədd et.

Ən ucuz "oyuncaq" Mikrotiki 20 dollara almağa və 500 dollarlıq routeri onunla əvəz etməyə çalışanlara böyük bir xahiş - bunu etməyin. "hAP Lite" / "hAP mini" (ev giriş nöqtəsi) kimi cihazlar çox zəif CPU (smips) var və çox güman ki, biznes seqmentində yükün öhdəsindən gəlməyəcəklər.

Warning! Bu həllin bir çatışmazlığı var: müştərilər qoşulduqda və ya əlaqəni kəsdikdə, marşrutlaşdırıcının qeyri-sabit yaddaşında saxlamağa çalışdığı konfiqurasiya dəyişiklikləri baş verir. Çox sayda müştəri və tez-tez qoşulma və əlaqənin kəsilməsi ilə bu, marşrutlaşdırıcıda daxili yaddaşın deqradasiyasına səbəb ola bilər.

PS: Müştəriyə kodun çatdırılması üsulları, proqramlaşdırma imkanlarınız kifayət qədər genişləndirilə və əlavə edilə bilər. Məsələn, siz teleqrama mesaj göndərə və ya ... variantları təklif edə bilərsiniz!

Ümid edirəm ki, məqalə sizin üçün faydalı olacaq və kiçik və orta biznes şəbəkələrini bir az daha təhlükəsiz etməyə kömək edəcək.

Mənbə: www.habr.com