MikroTik va SMS orqali VPN foydalanuvchilarining ikki faktorli autentifikatsiyasi

Salom hamkasblar! Bugun, uzoqdan ishlashga bo'lgan ishtiyoq biroz susayganida, ko'pchilik ma'murlar xodimlarning korporativ tarmoqqa masofadan kirish vazifasini engib o'tishdi, VPN xavfsizligini yaxshilash bo'yicha uzoq yillik tajribam bilan o'rtoqlashish vaqti keldi. Ushbu maqola hozirgi moda IPSec IKEv2 va xAuth-ni qamrab olmaydi. Bu tizimni yaratish haqida Ikki faktorli autentifikatsiya (2FA) MikroTik VPN serveri sifatida ishlaganda VPN foydalanuvchilari. Ya'ni, PPP kabi "klassik" protokollardan foydalanilganda.

MikroTik va SMS orqali VPN foydalanuvchilarining ikki faktorli autentifikatsiyasi

Bugun men sizning foydalanuvchi hisobingiz o'g'irlangan taqdirda ham MikroTik PPP-VPN-ni qanday himoya qilishni aytaman. Ushbu sxema mening mijozlarimdan biriga tanishtirilganda, u buni qisqacha ta'riflab berdi: "Xo'sh, endi bu xuddi bankdagidek!"

Usul tashqi autentifikatsiya xizmatlaridan foydalanmaydi. Vazifalar ichki yo'riqnoma tomonidan amalga oshiriladi. Ulangan mijoz uchun hech qanday to'lov yo'q. Usul ham shaxsiy kompyuter mijozlari, ham mobil qurilmalar uchun ishlaydi.

Umumiy himoya sxemasi quyidagicha:

  1. VPN serveriga muvaffaqiyatli ulangan foydalanuvchining ichki IP manzili avtomatik ravishda kulrang ro'yxatga qo'shiladi.
  2. Ulanish hodisasi avtomatik ravishda mavjud usullardan biri yordamida foydalanuvchiga yuboriladigan bir martalik kodni yaratadi.
  3. Ushbu ro'yxatdagi manzillar mahalliy tarmoq resurslariga cheklangan kirish huquqiga ega, bir martalik parol kodini olishni kutayotgan "autentifikatsiya" xizmati bundan mustasno.
  4. Kodni taqdim etgandan so'ng, foydalanuvchi ichki tarmoq resurslariga kirish huquqiga ega.

birinchi Biz duch kelgan eng kichik muammo foydalanuvchiga 2FA kodini yuborish uchun aloqa ma'lumotlarini saqlash edi. Mikrotik-da foydalanuvchilarga mos keladigan ixtiyoriy ma'lumotlar maydonlarini yaratish mumkin emasligi sababli, mavjud "sharh" maydoni ishlatilgan:

/ppp sirlari ism qo'shish=Petrov paroli=4M@ngr! izoh="89876543210"

ikkinchi muammo yanada jiddiy bo'lib chiqdi - kodni etkazib berish yo'li va usulini tanlash. Hozirgi vaqtda uchta sxema amalga oshirilmoqda: a) USB modem orqali SMS b) elektron pochta c) elektron pochta orqali SMS qizil uyali aloqa operatorining korporativ mijozlari uchun mavjud.

Ha, SMS sxemalari xarajatlarni talab qiladi. Ammo agar siz qarasangiz, "xavfsizlik har doim pul bilan bog'liq" (c).
Shaxsan menga elektron pochta sxemasi yoqmaydi. Pochta serveri autentifikatsiya qilinayotgan mijoz uchun mavjud bo'lishini talab qilgani uchun emas - trafikni ajratish muammo emas. Ammo, agar mijoz beparvolik bilan brauzerda VPN va elektron pochta uchun parollarni saqlagan bo'lsa va keyin noutbukini yo'qotsa, tajovuzkor undan korporativ tarmoqqa to'liq kirish huquqiga ega bo'ladi.

Shunday qilib, qaror qabul qilindi - biz SMS-xabarlar yordamida bir martalik kodni etkazib beramiz.

uchinchi muammo qaerda va edi MikroTik-da 2FA uchun psevdo-tasodifiy kodni qanday yaratish mumkin. RouterOS skript tilida random() funksiyasining ekvivalenti yo'q va men ilgari bir nechta noaniq skriptli psevdo-tasodifiy raqamlar generatorlarini ko'rganman. Turli sabablarga ko'ra ikkalasini ham yoqtirmasdim.

Aslida, MikroTik-da psevdo-tasodifiy ketma-ketlik generatori mavjud! U /certificates scep-server kontekstida yuzaki qarashdan yashiringan. birinchi usul bir martalik parolni olish oson va sodda - buyruq bilan /sertifikatlar scep-server otp hosil qiladi. Agar oddiy o'zgaruvchini belgilash operatsiyasini bajarsak, keyinchalik skriptlarda foydalanish mumkin bo'lgan massiv qiymatini olamiz.

ikkinchi usul bir martalik parolni olish, undan foydalanish ham oson - tashqi xizmatdan foydalanish tasodifiy.org psevdor tasodifiy raqamlar ketma-ketligining kerakli turini yaratish. Mana soddalashtirilgan konsolli o'zgaruvchiga ma'lumotlarni qabul qilish misoli:

da
: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 uchun formatlangan so'rov (skriptning asosiy qismida maxsus belgilardan qochish talab qilinadi) $rnd1 o'zgaruvchisiga oltita raqamli belgilar qatorini oladi. Quyidagi "qo'yish" buyrug'i oddiygina MikroTik konsolida o'zgaruvchini ko'rsatadi.

To'rtinchi muammo Autentifikatsiyaning ikkinchi bosqichida ulangan mijoz o'zining bir martalik kodini qanday va qayerda yuborishi tezda hal qilinishi kerak edi.

MikroTik va SMS orqali VPN foydalanuvchilarining ikki faktorli autentifikatsiyasi

MikroTik routerda kodni qabul qiladigan va ma'lum bir mijoz bilan mos keladigan xizmat bo'lishi kerak. Agar taqdim etilgan kod kutilgan kodga mos keladigan bo'lsa, mijozning manzili ma'lum "oq" ro'yxatga kiritilishi kerak, uning manzillari kompaniyaning ichki tarmog'iga kirishga ruxsat beriladi.

Xizmatlarning cheklangan tanlovi tufayli Mikrotik-ga o'rnatilgan webproksi yordamida http orqali kodlarni qabul qilishga qaror qilindi. Xavfsizlik devori IP-manzillarning dinamik ro'yxatlari bilan ishlashi mumkinligi sababli, bu xavfsizlik devori kodni qidiradi, uni mijoz IP-ga moslashtiradi va Layer7 regexp yordamida uni "oq" ro'yxatga qo'shadi. Routerning o'ziga "gw.local" shartli DNS nomi berilgan va PPP mijozlariga berish uchun unda statik A yozuvi yaratilgan:

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

Proksi orqali tekshirilmagan mijozlardan trafikni olish:
/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

Bunday holda, proksi-server ikkita funktsiyaga ega.

1. Mijozlar bilan TCP ulanishlarini ochish;

2. Muvaffaqiyatli avtorizatsiya qilingan taqdirda, mijoz brauzerini muvaffaqiyatli autentifikatsiya haqida xabar beruvchi sahifa yoki rasmga yo'naltiring:

Proksi-server konfiguratsiyasi
/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

Men muhim konfiguratsiya elementlarini sanab o'taman:

  1. "2fa" interfeys-ro'yxati - trafikni 2FA doirasida qayta ishlashni talab qiladigan mijoz interfeyslarining dinamik ro'yxati;
  2. "2fa_jailed" manzillar ro'yxati - VPN mijozlarining tunnel IP manzillarining "kulrang" ro'yxati;
  3. address_list "2fa_approved" - ikki faktorli autentifikatsiyadan muvaffaqiyatli o'tgan VPN mijozlarining tunnel IP manzillarining oq ro'yxati.
  4. "input_2fa" xavfsizlik devori zanjiri - u TCP paketlarini avtorizatsiya kodi mavjudligini va kod jo'natuvchining IP manzili talab qilinganiga mos kelishini tekshiradi. Zanjirdagi qoidalar dinamik ravishda qo'shiladi va o'chiriladi.

Paketlarni qayta ishlashning soddalashtirilgan sxemasi quyidagicha ko'rinadi:

MikroTik va SMS orqali VPN foydalanuvchilarining ikki faktorli autentifikatsiyasi

Layer7 skanerlashda autentifikatsiyaning ikkinchi bosqichidan o'tmagan mijozlardan trafikni "kulrang" ro'yxatga kiritish uchun standart "kirish" zanjirida qoida yaratildi:

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

Endi keling, barcha bu boylikni PPP xizmatiga ulashni boshlaylik. MikroTik skriptlarni profillarda (ppp-profil) ishlatish va ularni ppp ulanishini o'rnatish va uzish voqealariga belgilash imkonini beradi. Ppp-profil sozlamalari umuman PPP serveriga ham, alohida foydalanuvchilarga ham qo'llanilishi mumkin. Bunday holda, foydalanuvchiga tayinlangan profil o'zining belgilangan parametrlari bilan butun server uchun tanlangan profil parametrlarini bekor qilib, ustuvorlikka ega.

Ushbu yondashuv natijasida biz ikki faktorli autentifikatsiya uchun maxsus profil yaratishimiz va uni barcha foydalanuvchilarga emas, balki faqat biz buni zarur deb bilganlarga belgilashimiz mumkin. Agar siz PPP xizmatlaridan nafaqat oxirgi foydalanuvchilarni ulash uchun, balki ayni paytda saytdan saytga ulanishni o'rnatish uchun foydalansangiz, bu tegishli bo'lishi mumkin.

Yangi yaratilgan maxsus profilda biz manzillar va interfeyslarning "kulrang" ro'yxatiga ulangan foydalanuvchining manzili va interfeysini dinamik qo'shishdan foydalanamiz:

winbox
MikroTik va SMS orqali VPN foydalanuvchilarining ikki faktorli autentifikatsiyasi

da
/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 (oldindan yo'naltirish) zanjirida ikkilamchi avtorizatsiyadan o'tmagan VPN mijozlaridan trafikni aniqlash va olish uchun "manzillar ro'yxati" va "interfeys ro'yxati" ro'yxatidan birgalikda foydalanish kerak.

Tayyorgarlik tugagach, qo'shimcha xavfsizlik devori zanjirlari va profil yaratilgan bo'lsa, biz 2FA kodini va individual xavfsizlik devori qoidalarini avtomatik yaratish uchun javob beradigan skriptni yozamiz.

Hujjatlar wiki.mikrotik.com PPP-Profilida bizni PPP mijoz ulanishi va uzilish hodisalari bilan bog'liq o'zgaruvchilar haqidagi ma'lumotlar bilan boyitadi. "Foydalanuvchining login-hodisasida skriptni bajaring. Bular voqea skripti uchun mavjud bo'lgan o'zgaruvchilar: foydalanuvchi, mahalliy manzil, masofaviy manzil, qo'ng'iroq qiluvchining identifikatori, chaqirilgan identifikator, interfeys". Ulardan ba'zilari biz uchun juda foydali bo'ladi.

PPP on-up ulanish hodisasi uchun profilda ishlatiladigan 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

Ayniqsa, bexabar nusxa ko'chirishni yaxshi ko'radiganlar uchun ogohlantiraman - kod sinov versiyasidan olingan va kichik xatolar bo'lishi mumkin. Tushunadigan odam uchun aniq qaerda ekanligini aniqlash qiyin bo'lmaydi.

Foydalanuvchi aloqani uzganda, "On-Down" hodisasi hosil bo'ladi va parametrlari bilan mos keladigan skript chaqiriladi. Ushbu skriptning maqsadi uzilgan foydalanuvchi uchun yaratilgan xavfsizlik devori qoidalarini tozalashdir.

PPP-dan pastga ulanish hodisasi uchun profilda ishlatiladigan 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]
Keyin foydalanuvchilarni yaratishingiz va ularning bir qismini yoki barchasini ikki faktorli autentifikatsiya profiliga belgilashingiz mumkin.

winbox
MikroTik va SMS orqali VPN foydalanuvchilarining ikki faktorli autentifikatsiyasi

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

Bu mijoz tomonida qanday ko'rinishga ega.

VPN ulanishini o'rnatganingizda, SIM karta bilan Android/iOS telefoningizga/planshetingizga taxminan shunday SMS yuboriladi:

SMS
MikroTik va SMS orqali VPN foydalanuvchilarining ikki faktorli autentifikatsiyasi

Agar ulanish to'g'ridan-to'g'ri telefoningiz/planshetingizdan o'rnatilgan bo'lsa, siz xabardagi havolani bosish orqali 2FA orqali o'tishingiz mumkin. Bu qulay.

Agar VPN ulanishi kompyuterdan o'rnatilgan bo'lsa, foydalanuvchi parolning minimal shaklini kiritishi kerak bo'ladi. VPN-ni sozlashda foydalanuvchiga HTML fayl ko'rinishidagi kichik shakl yuboriladi. Fayl hatto pochta orqali yuborilishi mumkin, shunda foydalanuvchi uni saqlashi va qulay joyda yorliq yaratishi mumkin. Bu taxminan shunday ko'rinadi:

Stol ustidagi yorliq
MikroTik va SMS orqali VPN foydalanuvchilarining ikki faktorli autentifikatsiyasi

Foydalanuvchi yorliqni bosadi, oddiy kodni kiritish shakli ochiladi, u kodni ochilgan URL manziliga kiritadi:

Shakl ekrani
MikroTik va SMS orqali VPN foydalanuvchilarining ikki faktorli autentifikatsiyasi

Shakl eng ibtidoiy bo'lib, misol sifatida keltirilgan. Istaganlar uni o'zlariga mos ravishda o'zgartirishlari mumkin.

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>

Agar avtorizatsiya muvaffaqiyatli bo'lsa, foydalanuvchi brauzerda MikroTik logotipini ko'radi, bu muvaffaqiyatli autentifikatsiya signali bo'lib xizmat qilishi kerak:

MikroTik va SMS orqali VPN foydalanuvchilarining ikki faktorli autentifikatsiyasi

E'tibor bering, rasm o'rnatilgan MikroTik veb-serveridan WebProxy Deny Redirect yordamida qaytariladi.

Tasvirni "hotspot" vositasi yordamida sozlash mumkin, deb o'ylayman, u erda o'z versiyangizni yuklang va WebProxy yordamida unga qayta yo'naltirishni rad etish URL manzilini o'rnating.

Eng arzon "o'yinchoq" Mikrotikni 20 dollarga sotib olib, uni 500 dollarlik router bilan almashtirmoqchi bo'lganlar uchun katta iltimos - buni qilmang. "HAP Lite"/"hAP mini" (uyga kirish nuqtasi) kabi qurilmalar juda zaif protsessorga (smips) ega va biznes segmentidagi yukni bardosh bera olmaydi.

Ogohlantirish! Ushbu yechimning bitta kamchiligi bor: mijozlar ulanganda yoki uzilganda, konfiguratsiya o'zgarishlari ro'y beradi, uni yo'riqnoma o'zining doimiy xotirasida saqlashga harakat qiladi. Mijozlarning ko'pligi va tez-tez ulanishlar va uzilishlar bilan bu routerdagi ichki xotiraning buzilishiga olib kelishi mumkin.

PS: mijozga kodni etkazib berish usullari sizning dasturlash imkoniyatlaridan kelib chiqqan holda kengaytirilishi va to'ldirilishi mumkin. Masalan, siz telegram orqali xabar yuborishingiz mumkin yoki... variantlarni taklif qilishingiz mumkin!

Umid qilamanki, ushbu maqola siz uchun foydali bo'ladi va kichik va o'rta biznes tarmoqlarini biroz xavfsizroq qilishga yordam beradi.

Manba: www.habr.com