Pengesahan dua faktor pengguna VPN melalui MikroTik dan SMS

Hello rakan sekerja! Hari ini, apabila keghairahan di sekitar kerja jauh telah reda sedikit, kebanyakan pentadbir telah menakluki tugas akses jauh pekerja ke rangkaian korporat, sudah tiba masanya untuk berkongsi pengalaman lama saya dalam meningkatkan keselamatan VPN. Artikel ini tidak akan membincangkan IPSec IKEv2 dan xAuth yang kini bergaya. Ia mengenai membina sistem pengesahan dua faktor (2FA) Pengguna VPN apabila MikroTik bertindak sebagai pelayan VPN. Iaitu, apabila protokol "klasik" seperti PPP digunakan.

Pengesahan dua faktor pengguna VPN melalui MikroTik dan SMS

Hari ini saya akan memberitahu anda bagaimana untuk melindungi MikroTik PPP-VPN walaupun akaun pengguna anda dirampas. Apabila skim ini diperkenalkan kepada salah seorang pelanggan saya, dia secara ringkas menyifatkannya sebagai "baik, sekarang ia seperti di bank!"

Kaedah ini tidak menggunakan perkhidmatan pengesah luaran. Tugasan dilakukan secara dalaman oleh penghala itu sendiri. Tiada kos untuk pelanggan yang disambungkan. Kaedah ini berfungsi untuk kedua-dua pelanggan PC dan peranti mudah alih.

Skim perlindungan am adalah seperti berikut:

  1. Alamat IP dalaman pengguna yang telah berjaya menyambung ke pelayan VPN ditambah secara automatik ke senarai kelabu.
  2. Acara sambungan secara automatik menjana kod sekali sahaja yang dihantar kepada pengguna menggunakan salah satu kaedah yang tersedia.
  3. Alamat dalam senarai ini mempunyai akses terhad kepada sumber rangkaian tempatan, kecuali perkhidmatan "pengesah", yang menjangkakan menerima kod kata laluan sekali.
  4. Selepas membentangkan kod, pengguna mempunyai akses kepada sumber rangkaian dalaman.

Pertama masalah terkecil yang perlu kami hadapi ialah menyimpan maklumat hubungan tentang pengguna untuk menghantar kod 2FA kepadanya. Memandangkan mustahil untuk membuat medan data sewenang-wenang yang sepadan dengan pengguna dalam Mikrotik, medan "komen" sedia ada telah digunakan:

/ppp secrets add name=Petrov password=4M@ngr! komen="89876543210"

Yang kedua masalahnya ternyata lebih serius - pilihan laluan dan kaedah penyampaian kod. Pada masa ini, tiga skim dilaksanakan: a) SMS melalui modem USB b) e-mel c) SMS melalui e-mel tersedia untuk pelanggan korporat pengendali mudah alih merah.

Ya, skim SMS menanggung kos. Tetapi jika anda melihatnya, "keselamatan sentiasa mengenai wang" (c).
Saya secara peribadi tidak suka skema e-mel. Bukan kerana ia memerlukan pelayan mel tersedia untuk pelanggan yang disahkan - ia bukan masalah untuk memisahkan trafik. Walau bagaimanapun, jika pelanggan secara cuai menyimpan kata laluan untuk kedua-dua VPN dan e-mel dalam penyemak imbas, dan kemudian kehilangan komputer ribanya, penyerang akan mendapat akses penuh ke rangkaian korporat daripadanya.

Jadi, sudah diputuskan - kami menghantar kod sekali menggunakan mesej SMS.

Ketiga masalahnya ialah di mana dan bagaimana untuk menjana kod pseudo-rawak untuk 2FA dalam MikroTik. Tiada yang setara dengan fungsi rawak() dalam bahasa skrip RouterOS, dan saya telah melihat beberapa penjana nombor pseudo-rawak skrip yang buruk sebelum ini. Saya tidak menyukai salah satu daripada mereka kerana pelbagai sebab.

Malah, terdapat penjana jujukan pseudo-rawak dalam MikroTik! Ia tersembunyi daripada pandangan cetek dalam konteks /certificates scep-server. Cara pertama mendapatkan kata laluan sekali adalah mudah dan mudah - dengan arahan /sijil scep-server otp menjana. Jika kita melakukan operasi penugasan pembolehubah mudah, kita akan mendapat nilai tatasusunan yang boleh digunakan kemudian dalam skrip.

Cara kedua mendapatkan kata laluan sekali sahaja, yang juga mudah digunakan - menggunakan perkhidmatan luaran rawak.org untuk menjana jenis urutan nombor pseudorandom yang dikehendaki. Berikut ialah yang dipermudahkan cantilever contoh menerima data ke dalam pembolehubah:

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

Permintaan yang diformatkan untuk konsol (melarikan aksara khas akan diperlukan dalam badan skrip) menerima rentetan enam aksara angka ke dalam pembolehubah $rnd1. Perintah "put" berikut hanya memaparkan pembolehubah dalam konsol MikroTik.

Masalah keempat yang perlu diselesaikan dengan cepat ialah bagaimana dan di mana klien yang disambungkan akan menghantar kod sekali pada peringkat kedua pengesahan.

Pengesahan dua faktor pengguna VPN melalui MikroTik dan SMS

Mesti ada perkhidmatan pada penghala MikroTik yang boleh menerima kod dan memadankannya dengan pelanggan tertentu. Jika kod yang diberikan sepadan dengan kod yang dijangkakan, alamat pelanggan mesti disertakan dalam senarai "putih" tertentu, alamat yang membolehkan akses kepada rangkaian dalaman syarikat.

Disebabkan oleh pilihan perkhidmatan yang terhad, ia telah memutuskan untuk menerima kod melalui http menggunakan webproxy terbina dalam Mikrotik. Dan oleh kerana firewall boleh berfungsi dengan senarai dinamik alamat IP, firewall yang mencari kod tersebut, memadankannya dengan IP klien dan menambahkannya ke senarai "putih" menggunakan Layer7 regexp. Penghala itu sendiri telah diberikan nama DNS bersyarat "gw.local", dan rekod A statik telah dibuat padanya untuk dikeluarkan kepada klien PPP:

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

Menangkap trafik daripada pelanggan yang tidak disahkan melalui proksi:
/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

Dalam kes ini, proksi mempunyai dua fungsi.

1. Buka sambungan TCP dengan pelanggan;

2. Sekiranya kebenaran berjaya, ubah hala pelayar klien ke halaman atau imej yang memberitahu tentang pengesahan yang berjaya:

Konfigurasi proksi
/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

Saya akan menyenaraikan elemen konfigurasi penting:

  1. senarai antara muka "2fa" - senarai dinamik antara muka pelanggan, lalu lintas yang memerlukan pemprosesan dalam rangka kerja 2FA;
  2. senarai alamat "2fa_jailed" β€” senarai "kelabu" alamat IP terowong pelanggan VPN;
  3. address_list "2fa_approved" - senarai putih alamat IP terowong pelanggan VPN yang telah berjaya melepasi pengesahan dua faktor.
  4. rantaian firewall "input_2fa" - ia menyemak paket TCP untuk kehadiran kod kebenaran dan sama ada alamat IP penghantar kod sepadan dengan yang diperlukan. Peraturan dalam rantai ditambah dan dialih keluar secara dinamik.

Carta alir pemprosesan paket yang dipermudahkan kelihatan seperti ini:

Pengesahan dua faktor pengguna VPN melalui MikroTik dan SMS

Untuk memasukkan trafik daripada pelanggan pada senarai "kelabu" yang belum melepasi peringkat kedua pengesahan ke dalam imbasan Layer7, peraturan telah dibuat dalam rantaian "input" standard:

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

Sekarang mari kita mula menghubungkan semua kekayaan ini kepada perkhidmatan PPP. MikroTik membenarkan anda menggunakan skrip dalam profil (profil ppp) dan menetapkannya kepada acara menyediakan dan memutuskan sambungan ppp. Tetapan profil ppp boleh digunakan pada pelayan PPP secara keseluruhan dan kepada pengguna individu. Dalam kes ini, profil yang diberikan kepada pengguna mempunyai keutamaan, mengatasi dengan parameter yang ditentukan parameter profil yang dipilih untuk pelayan secara keseluruhan.

Hasil daripada pendekatan ini, kami boleh mencipta profil khas untuk pengesahan dua faktor dan menetapkannya bukan kepada semua pengguna, tetapi hanya kepada mereka yang kami anggap perlu berbuat demikian. Ini mungkin berkaitan jika anda menggunakan perkhidmatan PPP bukan sahaja untuk menghubungkan pengguna akhir, tetapi pada masa yang sama untuk membina sambungan tapak ke tapak.

Dalam profil khas yang baru dibuat, kami menggunakan penambahan dinamik alamat dan antara muka pengguna yang disambungkan kepada senarai alamat dan antara muka "kelabu":

kotak win
Pengesahan dua faktor pengguna VPN melalui MikroTik dan 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

Anda perlu menggunakan senarai "senarai alamat" dan "senarai antara muka" bersama-sama untuk mengenal pasti dan menangkap trafik daripada klien VPN yang belum melepasi keizinan kedua dalam rantaian dstnat (prerouting).

Apabila penyediaan selesai, rantaian firewall tambahan dan profil telah dibuat, kami akan menulis skrip yang bertanggungjawab untuk penjanaan automatik kod 2FA dan peraturan firewall individu.

Dokumentasi wiki.mikrotik.com pada PPP-Profile memperkayakan kami dengan maklumat tentang pembolehubah yang dikaitkan dengan sambungan klien PPP dan peristiwa pemutusan sambungan "Laksanakan skrip pada acara log masuk pengguna. Ini adalah pembolehubah tersedia yang boleh diakses untuk skrip acara: pengguna, alamat setempat, alamat jauh, id pemanggil, id yang dipanggil, antara muka". Sebahagian daripada mereka akan sangat berguna kepada kita.

Kod yang digunakan dalam profil untuk acara sambungan on-up 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

Saya memberi amaran kepada anda terutamanya bagi mereka yang suka menyalin-tampal tanpa mengira - kod itu diambil daripada versi ujian dan mungkin mengandungi ralat kecil. Tidak sukar bagi orang yang memahami untuk mengetahui di mana sebenarnya.

Apabila pengguna memutuskan sambungan, acara "On-Down" dijana dan skrip yang sepadan dengan parameter dipanggil. Tujuan skrip ini adalah untuk membersihkan peraturan tembok api yang dibuat untuk pengguna yang terputus sambungan.

Kod yang digunakan dalam profil untuk acara sambungan on-down 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]
Anda kemudian boleh membuat pengguna dan menetapkan sebahagian atau kesemuanya kepada profil pengesahan dua faktor.

kotak win
Pengesahan dua faktor pengguna VPN melalui MikroTik dan SMS

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

Bagaimana rupanya di sisi pelanggan.

Apabila anda mewujudkan sambungan VPN, SMS lebih kurang seperti ini dihantar ke telefon/tablet Android/iOS anda dengan kad SIM:

SMS
Pengesahan dua faktor pengguna VPN melalui MikroTik dan SMS

Jika sambungan diwujudkan terus dari telefon/tablet anda, maka anda boleh melalui 2FA hanya dengan mengklik pada pautan daripada mesej. Ia selesa.

Jika sambungan VPN diwujudkan daripada PC, maka pengguna akan dikehendaki memasukkan bentuk kata laluan yang minimum. Borang kecil dalam bentuk fail HTML dihantar kepada pengguna semasa menyediakan VPN. Fail juga boleh dihantar melalui mel supaya pengguna boleh menyimpannya dan mencipta jalan pintas di tempat yang mudah. Ia kelihatan seperti ini:

Label di atas meja
Pengesahan dua faktor pengguna VPN melalui MikroTik dan SMS

Pengguna mengklik pada pintasan, borang kemasukan kod mudah dibuka, yang akan memasukkan kod ke dalam URL yang dibuka:

Skrin borang
Pengesahan dua faktor pengguna VPN melalui MikroTik dan SMS

Bentuknya adalah yang paling primitif, diberikan sebagai contoh. Mereka yang berhajat boleh mengubah suai mengikut kesesuaian diri mereka.

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>

Jika kebenaran berjaya, pengguna akan melihat logo MikroTik dalam penyemak imbas, yang sepatutnya berfungsi sebagai isyarat pengesahan berjaya:

Pengesahan dua faktor pengguna VPN melalui MikroTik dan SMS

Ambil perhatian bahawa imej dikembalikan daripada pelayan web MikroTik terbina dalam menggunakan WebProxy Deny Redirect.

Saya percaya bahawa imej itu boleh disesuaikan menggunakan alat "hotspot", memuat naik versi anda sendiri di sana dan menetapkan URL Deny Redirect kepadanya dengan WebProxy.

Permintaan besar kepada mereka yang cuba membeli "mainan" Mikrotik termurah dengan harga $20 dan menggantikannya dengan penghala $500 - jangan lakukan itu. Peranti seperti "hAP Lite"/"hAP mini" (titik akses rumah) mempunyai CPU yang sangat lemah (smips) dan berkemungkinan tidak dapat menampung beban dalam segmen perniagaan.

Amaran! Penyelesaian ini mempunyai satu kelemahan: apabila pelanggan menyambung atau memutuskan sambungan, perubahan konfigurasi berlaku, yang cuba disimpan oleh penghala dalam memori tidak meruapnya. Dengan bilangan pelanggan yang besar dan sambungan dan pemutusan sambungan yang kerap, ini boleh menyebabkan kemerosotan storan dalaman dalam penghala.

PS: kaedah untuk menghantar kod kepada pelanggan boleh dikembangkan dan ditambah setakat keupayaan pengaturcaraan anda. Contohnya, anda boleh menghantar mesej melalui telegram atau... cadangkan pilihan!

Saya harap artikel ini berguna kepada anda dan membantu menjadikan rangkaian perniagaan kecil dan sederhana lebih selamat sedikit.

Sumber: www.habr.com