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
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:
- VPN serveriga muvaffaqiyatli ulangan foydalanuvchining ichki IP manzili avtomatik ravishda kulrang ro'yxatga qo'shiladi.
- Ulanish hodisasi avtomatik ravishda mavjud usullardan biri yordamida foydalanuvchiga yuboriladigan bir martalik kodni yaratadi.
- Ushbu ro'yxatdagi manzillar mahalliy tarmoq resurslariga cheklangan kirish huquqiga ega, bir martalik parol kodini olishni kutayotgan "autentifikatsiya" xizmati bundan mustasno.
- 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
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 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:
- "2fa" interfeys-ro'yxati - trafikni 2FA doirasida qayta ishlashni talab qiladigan mijoz interfeyslarining dinamik ro'yxati;
- "2fa_jailed" manzillar ro'yxati - VPN mijozlarining tunnel IP manzillarining "kulrang" ro'yxati;
- address_list "2fa_approved" - ikki faktorli autentifikatsiyadan muvaffaqiyatli o'tgan VPN mijozlarining tunnel IP manzillarining oq ro'yxati.
- "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:
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:
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.
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
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
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
Foydalanuvchi yorliqni bosadi, oddiy kodni kiritish shakli ochiladi, u kodni ochilgan URL manziliga kiritadi:
Shakl ekrani
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:
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