Otentikasi rong faktor pangguna VPN liwat MikroTik lan SMS

Halo rekan kerja! Dina iki, nalika semangat ing karya remot wis suda sethithik, umume pangurus wis ngalahake tugas akses remot karyawan menyang jaringan perusahaan, wektune kanggo nuduhake pengalaman saya suwe saya suwe kanggo nambah keamanan VPN. Artikel iki ora bakal nutupi IPSec IKEv2 lan xAuth sing saiki modis. Iku babagan mbangun sistem otentikasi rong faktor (2FA) Pangguna VPN nalika MikroTik tumindak minangka server VPN. Yaiku, nalika protokol "klasik" kaya PPP digunakake.

Otentikasi rong faktor pangguna VPN liwat MikroTik lan SMS

Dina iki aku bakal menehi pitutur marang kowe carane nglindhungi MikroTik PPP-VPN sanajan akun pangguna sampeyan dibajak. Nalika skema iki dikenalake menyang salah sawijining pelangganku, dheweke kanthi ringkes nggambarake "ya, saiki kaya ing bank!"

Cara kasebut ora nggunakake layanan authenticator eksternal. Tugas kasebut ditindakake sacara internal dening router dhewe. Ora ana biaya kanggo klien sing disambungake. Cara kasebut bisa digunakake kanggo klien PC lan piranti seluler.

Skema perlindungan umum kaya ing ngisor iki:

  1. Alamat IP internal pangguna sing wis kasil nyambung menyang server VPN ditambahake kanthi otomatis menyang dhaptar abu-abu.
  2. Acara sambungan kanthi otomatis ngasilake kode siji-wektu sing dikirim menyang pangguna nggunakake salah siji cara sing kasedhiya.
  3. Alamat ing dhaptar iki nduweni akses winates menyang sumber daya jaringan lokal, kajaba layanan "authenticator", sing ngarepake nampa kode sandi siji-wektu.
  4. Sawise nampilake kode kasebut, pangguna nduweni akses menyang sumber daya jaringan internal.

Kaping pisanan masalah paling cilik sing kudu diadhepi yaiku nyimpen informasi kontak babagan pangguna kanggo ngirim kode 2FA. Amarga ora mungkin nggawe kolom data sewenang-wenang sing cocog karo pangguna ing Mikrotik, kolom "komentar" sing ana digunakake:

/ ppp rahasia nambah jeneng = Petrov sandi = 4M @ ngr! komentar = "89876543210"

Kapindho masalah dadi luwih serius - pilihan saka path lan cara ngirim kode. Saiki, telung skema dileksanakake: a) SMS liwat modem USB b) e-mail c) SMS liwat e-mail kasedhiya kanggo klien perusahaan saka operator seluler abang.

Ya, skema SMS mbutuhake biaya. Nanging yen sampeyan ndeleng, "keamanan tansah babagan dhuwit" (c).
Aku pribadi ora seneng karo skema email. Ora amarga mbutuhake server mail kasedhiya kanggo klien sing diotentikasi - ora dadi masalah kanggo pamisah lalu lintas. Nanging, yen klien ora sengaja nyimpen sandhi kanggo VPN lan email ing browser, banjur ilang laptop, panyerang bakal entuk akses lengkap menyang jaringan perusahaan.

Dadi, wis mutusake - kita ngirim kode siji-wektu nggunakake pesen SMS.

Katelu masalah ana ngendi lan carane nggawe kode pseudo-acak kanggo 2FA ing MikroTik. Ora ana sing padha karo fungsi acak () ing basa skrip RouterOS, lan aku wis ndeleng sawetara generator nomer pseudo-acak script crummy sadurunge. Aku ora seneng karo salah sijine amarga macem-macem alasan.

Nyatane, ana generator urutan pseudo-random ing MikroTik! Iki didhelikake saka tampilan entheng ing konteks /certificate scep-server. Cara pisanan entuk sandhi siji-wektu gampang lan prasaja - kanthi printah / sertifikat scep-server otp generate. Yen kita nindakake operasi assignment variabel prasaja, kita bakal entuk nilai array sing bisa digunakake mengko ing skrip.

Cara liya entuk sandhi siji-wektu, sing uga gampang digunakake - nggunakake layanan eksternal acak.org kanggo ngasilake jinis urutan nomer pseudorandom sing dikarepake. Mangkene sing disederhanakake kantilevered conto nampa data menyang variabel:

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

A request format kanggo console (uwal karakter khusus bakal dibutuhake ing awak script) nampa senar saka enem karakter numerik menyang $ rnd1 variabel. Printah "put" ing ngisor iki mung nampilake variabel ing konsol MikroTik.

Masalah kaping papat sing kudu ditanggulangi kanthi cepet yaiku carane lan ing ngendi klien sing disambungake bakal ngirim kode siji-wektu ing tahap otentikasi kapindho.

Otentikasi rong faktor pangguna VPN liwat MikroTik lan SMS

Mesthi ana layanan ing router MikroTik sing bisa nampa kode kasebut lan cocog karo klien tartamtu. Yen kode sing diwenehake cocog karo sing dikarepake, alamat klien kudu kalebu ing dhaptar "putih" tartamtu, alamat sing diidini akses menyang jaringan internal perusahaan.

Amarga pilihan layanan sing winates, diputusake nampa kode liwat http nggunakake webproxy sing dibangun ing Mikrotik. Lan wiwit firewall bisa nggarap dhaptar dinamis alamat IP, iku firewall sing nggoleki kode, cocog karo IP klien lan nambah menyang dhaptar "putih" nggunakake Layer7 regexp. Router kasebut dhewe wis diwenehi jeneng DNS kondisional "gw.local", lan rekaman A statis wis digawe kanggo diterbitake kanggo klien PPP:

DNS
/ ip dns statis nambah jeneng = alamat gw.local = 172.31.1.1

Njupuk lalu lintas saka klien sing ora diverifikasi kanthi 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

Ing kasus iki, proxy duwe rong fungsi.

1. Bukak sambungan TCP karo klien;

2. Yen otorisasi sukses, pangalihan browser klien menyang kaca utawa gambar sing menehi kabar babagan otentikasi sing sukses:

Konfigurasi 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

Aku bakal dhaptar unsur konfigurasi penting:

  1. dhaptar antarmuka "2fa" - dhaptar dinamis antarmuka klien, lalu lintas sing mbutuhake proses ing kerangka 2FA;
  2. dhaptar alamat "2fa_jailed" - dhaptar alamat IP terowongan klien VPN "abu-abu";
  3. address_list "2fa_approved" - dhaptar putih alamat IP terowongan klien VPN sing wis kasil ngliwati otentikasi rong faktor.
  4. chain firewall "input_2fa" - mriksa paket TCP kanggo ananΓ© kode wewenang lan apa alamat IP pangirim kode cocog karo sing dibutuhake. Aturan ing rantai ditambahake lan dibusak kanthi dinamis.

Bagan alur pangolahan paket sing disederhanakake katon kaya iki:

Otentikasi rong faktor pangguna VPN liwat MikroTik lan SMS

Kanggo nyakup lalu lintas saka klien ing dhaptar "abu-abu" sing durung ngliwati tahap otentikasi kapindho menyang pindai Layer7, aturan wis digawe ing rantai "input" standar:

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

Saiki ayo miwiti nyambungake kabeh kasugihan iki menyang layanan PPP. MikroTik ngijini sampeyan kanggo nggunakake skrip ing profil (ppp-profil) lan nemtokake kanggo acara nyetel lan break sambungan ppp. Setelan profil ppp bisa diterapake ing server PPP sakabèhé lan kanggo pangguna individu. Ing kasus iki, profil diutus kanggo pangguna wis prioritas, overriding karo paramèter tartamtu paramèter saka profil sing dipilih kanggo server sakabèhé.

Minangka asil saka pendekatan iki, kita bisa nggawe profil khusus kanggo otentikasi loro-faktor lan nemtokake ora kanggo kabeh pangguna, nanging mung kanggo wong-wong sing dianggep perlu kanggo nindakake. Iki bisa uga relevan yen sampeyan nggunakake layanan PPP ora mung kanggo nyambungake pangguna pungkasan, nanging ing wektu sing padha kanggo mbangun sambungan situs-kanggo-situs.

Ing profil khusus sing mentas digawe, kita nggunakake tambahan dinamis alamat lan antarmuka pangguna sing disambungake menyang dhaptar alamat lan antarmuka "abu-abu":

winbox
Otentikasi rong faktor pangguna VPN liwat MikroTik lan SMS

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

Sampeyan kudu nggunakake dhaptar "alamat-dhaftar" lan "antarmuka-dhaftar" bebarengan kanggo ngenali lan dijupuk lalu lintas saka klien VPN sing durung liwati wewenang secondary ing chain dstnat (prerouting).

Nalika preparation wis rampung, rentengan firewall tambahan lan profil wis digawe, kita bakal nulis script tanggung jawab kanggo generasi otomatis kode 2FA lan aturan firewall individu.

Dokumentasi wiki.mikrotik.com ing PPP-Profil enriched kita karo informasi bab variabel gadhah sambungan klien PPP lan acara disconnection "Nglakokake skrip ing acara login pangguna. Iki minangka variabel sing kasedhiya sing bisa diakses kanggo skrip acara: pangguna, alamat lokal, alamat remot, ID panelpon, id-disebut, antarmuka". Sawetara bakal migunani banget kanggo kita.

Kode sing digunakake ing profil kanggo 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

Aku ngelingake sampeyan utamane kanggo wong sing seneng nyalin-tempel - kode kasebut dijupuk saka versi tes lan bisa uga ana kesalahan cilik. Ora bakal angel kanggo wong sing ngerti babagan endi sing tepat.

Nalika pangguna pedhot, acara "On-Down" digawe lan script sing cocog karo paramèter diarani. Tujuan saka script iki kanggo ngresiki munggah aturan firewall digawe kanggo pangguna pedhot.

Kode sing digunakake ing profil kanggo acara sambungan ing-mudhun 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]
Sampeyan banjur bisa nggawe pangguna lan nemtokake sawetara utawa kabeh menyang profil otentikasi rong faktor.

winbox
Otentikasi rong faktor pangguna VPN liwat MikroTik lan SMS

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

Apa sing katon ing sisih klien.

Nalika sampeyan nggawe sambungan VPN, SMS kira-kira kaya iki dikirim menyang telpon / tablet Android/iOS nganggo kertu SIM:

SMS
Otentikasi rong faktor pangguna VPN liwat MikroTik lan SMS

Yen sambungan digawe langsung saka telpon / tablet, sampeyan bisa mbukak liwat 2FA mung kanthi ngeklik link saka pesen. Wis nyaman.

Yen sambungan VPN digawe saka PC, pangguna kudu ngetik sandhi minimal. Wangun cilik ing wangun file HTML dikirim menyang pangguna nalika nyetel VPN. File kasebut bisa uga dikirim kanthi mail supaya pangguna bisa nyimpen lan nggawe trabasan ing papan sing trep. Iku katon kaya iki:

Label ing meja
Otentikasi rong faktor pangguna VPN liwat MikroTik lan SMS

Pangguna ngeklik trabasan, formulir entri kode prasaja mbukak, sing bakal nglebokake kode kasebut menyang URL sing dibukak:

Layar formulir
Otentikasi rong faktor pangguna VPN liwat MikroTik lan SMS

Wangun paling primitif, diwenehi minangka conto. Sing pengin bisa ngowahi supaya cocog karo awake dhewe.

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>

Yen otorisasi sukses, pangguna bakal weruh logo MikroTik ing browser, sing kudu dadi sinyal otentikasi sukses:

Otentikasi rong faktor pangguna VPN liwat MikroTik lan SMS

Elinga yen gambar bali saka server web MikroTik sing dibangun nggunakake WebProxy Deny Redirect.

Aku percaya yen gambar bisa disesuaikan nggunakake alat "hotspot", ngunggah versi sampeyan dhewe ing kana lan nyetel URL Deny Redirect menyang karo WebProxy.

Panjaluk gedhe kanggo wong-wong sing nyoba tuku "dolanan" Mikrotik sing paling murah kanthi rega $ 20 lan ngganti karo router $ 500 - aja nglakoni. Piranti kaya "hAP Lite" / "hAP mini" (titik akses ngarep) duwe CPU banget banget (smips), lan kamungkinan ora bisa ngatasi beban ing bagean bisnis.

Pènget! Solusi iki nduweni siji kekurangan: nalika klien nyambungake utawa medhot, owah-owahan konfigurasi kedadeyan, sing router nyoba disimpen ing memori sing ora molah malih. Kanthi akeh klien lan sambungan lan pedhot sing kerep, iki bisa nyebabake degradasi panyimpenan internal ing router.

PS: cara kanggo ngirim kode menyang klien bisa ditambahi lan ditambahi minangka adoh saka kemampuan program sampeyan. Contone, sampeyan bisa ngirim pesen ing telegram utawa ... menehi saran pilihan!

Muga-muga artikel iki migunani kanggo sampeyan lan mbantu nggawe jaringan bisnis cilik lan medium dadi luwih aman.

Source: www.habr.com