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
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:
- Alamat IP internal pangguna sing wis kasil nyambung menyang server VPN ditambahake kanthi otomatis menyang dhaptar abu-abu.
- Acara sambungan kanthi otomatis ngasilake kode siji-wektu sing dikirim menyang pangguna nggunakake salah siji cara sing kasedhiya.
- Alamat ing dhaptar iki nduweni akses winates menyang sumber daya jaringan lokal, kajaba layanan "authenticator", sing ngarepake nampa kode sandi siji-wektu.
- 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
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.
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:
- dhaptar antarmuka "2fa" - dhaptar dinamis antarmuka klien, lalu lintas sing mbutuhake proses ing kerangka 2FA;
- dhaptar alamat "2fa_jailed" - dhaptar alamat IP terowongan klien VPN "abu-abu";
- address_list "2fa_approved" - dhaptar putih alamat IP terowongan klien VPN sing wis kasil ngliwati otentikasi rong faktor.
- 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:
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":
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.
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
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
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
Pangguna ngeklik trabasan, formulir entri kode prasaja mbukak, sing bakal nglebokake kode kasebut menyang URL sing dibukak:
Layar formulir
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:
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