Auténtikasi dua faktor pangguna VPN via MikroTik sareng SMS

Halo kolega! Kiwari, nalika inténsitas gairah sabudeureun "kerja jauh" subsided saeutik, seuseueurna admins meunang tugas aksés jauh karyawan ka jaringan perusahaan, éta waktuna pikeun babagi pangalaman lila kuring dina ngaronjatkeun kaamanan VPN. Tulisan ieu moal modéren ayeuna IPSec IKEv2 sareng xAuth. Éta ngeunaan ngawangun sistem. auténtikasi dua faktor (2FA) Pamaké VPN nalika MikroTik bertindak salaku server VPN. Nyaéta, nalika protokol "klasik" sapertos PPP dianggo.

Auténtikasi dua faktor pangguna VPN via MikroTik sareng SMS

Dinten ieu kuring bakal ngabejaan ka maneh kumaha ngajaga MikroTik PPP-VPN sanajan akun pamaké anjeun dibajak. Nalika skéma ieu diwanohkeun ka salah sahiji nasabah kuring, anjeunna sakeudeung ngajelaskeun eta salaku "muhun, ayeuna éta kawas di bank!"

Métodena henteu nganggo jasa authenticator éksternal. Tugasna dilaksanakeun sacara internal ku router sorangan. Taya ongkos pikeun klien disambungkeun. Metodeu tiasa dianggo pikeun klien PC sareng alat sélulér.

Skéma panyalindungan umum nyaéta kieu:

  1. Alamat IP internal hiji pamaké anu geus hasil nyambung ka server VPN otomatis ditambahkeun kana daptar abu.
  2. Acara sambungan otomatis ngahasilkeun kode hiji-waktos anu dikirim ka pamaké ngagunakeun salah sahiji metodeu sadia.
  3. Alamat dina daptar ieu gaduh aksés kawates kana sumber jaringan lokal, iwal ti layanan "authenticator", anu ngantosan nampi kodeu aksés sakali.
  4. Saatos nampilkeun kodeu, pangguna ngagaduhan aksés kana sumber jaringan internal.

kahiji masalah pangleutikna urang kudu nyanghareupan éta nyimpen informasi kontak ngeunaan pamaké pikeun ngirim anjeunna kode 2FA. Kusabab teu mungkin nyieun widang data sawenang-wenang pakait jeung pamaké dina Mikrotik, widang "komentar" aya dipaké:

/ ppp Rahasia nambahkeun ngaran = Petrov sandi = 4M @ ngr! komentar = "89876543210"

kadua Masalahna janten langkung serius - pilihan jalur sareng metode pangiriman kodeu. Tilu skéma ayeuna dilaksanakeun: a) SMS via USB-modem b) e-mail c) SMS via e-mail sadia pikeun klien perusahaan tina operator sélulér beureum.

Sumuhun, skéma SMS mayar waragad. Tapi lamun nempo eta, "kaamanan salawasna ngeunaan duit" (c).
Kuring pribadi teu resep skéma jeung e-mail. Henteu sabab merlukeun pangladén mail janten sadia pikeun klien nu keur dioténtikasi - teu jadi masalah pikeun pamisah lalulintas. Nanging, upami klien teu ati-ati nyimpen kecap konci vpn sareng email dina browser teras kaleungitan laptopna, panyerang bakal nampi aksés pinuh ka jaringan perusahaan ti éta.

Janten, éta diputuskeun - kami ngirimkeun kode sakali nganggo pesen SMS.

katilu masalah éta dimana na kumaha carana ngahasilkeun kode pseudo-acak pikeun 2FA di MikroTik. Henteu aya analog tina fungsi acak () dina basa skrip RouterOS, sareng kuring parantos ningali sababaraha generator angka pseudo-acak naskah kruk sateuacanna. Abdi henteu resep salah sahiji aranjeunna kusabab sababaraha alesan.

Kanyataanna, aya generator runtuyan pseudo-acak dina MikroTik! Ieu disumputkeun tina glance deet dina konteks / sertipikat scep-server. Metodeu munggaran Kéngingkeun kecap akses sakali gampang sareng saderhana - kalayan paréntah / sertipikat scep-server otp ngahasilkeun. Upami urang ngalakukeun operasi ngerjakeun variabel basajan, urang bakal nampi nilai Asép Sunandar Sunarya anu tiasa dianggo engké dina naskah.

Cara kadua meunangkeun kecap akses hiji-waktos, anu ogé gampang dianggo - nganggo jasa éksternal acak.org pikeun ngahasilkeun tipe nu dipikahoyong tina runtuyan nomer pseudorandom. Ieu anu disederhanakeun cantilevered conto narima data kana 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 pamundut formatna pikeun konsol nu (escaping karakter husus bakal diperlukeun dina awak naskah) narima string genep karakter numerik kana $ rnd1 variabel. Paréntah "nempatkeun" di handap ieu ngan ukur nunjukkeun variabel dina konsol MikroTik.

Masalah kaopat Anu kedah gancang direngsekeun nyaéta kumaha sareng dimana klien anu disambungkeun bakal ngirimkeun kode hiji-waktos na dina tahap kadua auténtikasi.

Auténtikasi dua faktor pangguna VPN via MikroTik sareng SMS

Kedah aya jasa dina router MikroTik anu tiasa nampi kode sareng cocog sareng klien khusus. Upami kode anu disayogikeun cocog sareng anu dipiharep, alamat klien kedah dilebetkeun kana daptar "bodas" anu tangtu, alamat anu diidinan aksés ka jaringan internal perusahaan.

Alatan pilihan kawates jasa, éta mutuskeun pikeun nampa kode via http ngagunakeun webproxy diwangun kana Mikrotik. Sarta saprak firewall nu bisa digawekeun ku daptar dinamis alamat IP, éta firewall nu neangan kode, cocog jeung IP klien tur nambahkeun kana daptar "bodas" maké Layer7 regexp. Router sorangan parantos ditugaskeun nami DNS kondisional "gw.local", sareng catetan A statik parantos diciptakeun pikeun dikaluarkeun ka klien PPP:

DNS
/ ip DNS statik nambahkeun ngaran = alamat gw.local = 172.31.1.1

Nangkep lalu lintas ti klien anu teu diverifikasi ku 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

Dina hal ieu, proxy boga dua fungsi.

1. Buka sambungan tcp sareng klien;

2. Dina hal otorisasina suksés, alihan browser klien ka kaca atawa gambar ngabéjaan ngeunaan auténtikasi suksés:

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

Kuring bakal daptar elemen konfigurasi penting:

  1. interface-list "2fa" - daptar dinamis tina interfaces klien, lalulintas ti mana merlukeun processing dina kerangka 2FA;
  2. daptar alamat "2fa_jailed" - daptar "abu" alamat IP torowongan klien VPN;
  3. address_list "2fa_approved" - daptar bodas alamat IP torowongan klien VPN nu geus hasil lulus auténtikasi dua-faktor.
  4. Ranté firewall "input_2fa" - éta pariksa pakét TCP pikeun ayana kode otorisasi sareng naha alamat IP pangirim kode cocog sareng anu diperyogikeun. Aturan dina ranté nu ditambahkeun jeung dihapus dinamis.

Bagan alur pangolahan pakét anu saderhana sapertos kieu:

Auténtikasi dua faktor pangguna VPN via MikroTik sareng SMS

Pikeun ngalebetkeun lalu lintas ti klien dina daptar "abu" anu henteu acan lulus tahap kadua auténtikasi kana scan Layer7, aturan parantos didamel dina ranté "input" standar:

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

Ayeuna hayu urang mimitian nyepetkeun sadayana kabeungharan ieu kana jasa PPP. MikroTik ngamungkinkeun anjeun ngagunakeun skrip dina propil (ppp-profil) sareng napelkeunana kana acara ngadegkeun sareng megatkeun sambungan ppp. Setélan ppp-profil tiasa diterapkeun ka server PPP sacara gembleng atanapi ka pangguna individu. Dina waktos anu sami, profil anu ditugaskeun ka pangguna ngagaduhan prioritas, ngalangkungan parameter profil anu dipilih pikeun server sacara gembleng sareng parameter anu ditangtukeun.

Salaku hasil tina pendekatan ieu, urang bisa nyieun hiji profil husus pikeun auténtikasi dua-faktor jeung napelkeun eta teu ka sadaya pamaké, tapi ngan ka jalma anu urang anggap perlu pikeun ngalakukeunana. Ieu tiasa relevan upami anjeun nganggo jasa PPP henteu ngan ukur pikeun nyambungkeun pangguna akhir, tapi dina waktos anu sami pikeun ngawangun sambungan situs-ka-situs.

Dina profil khusus anu nembé diciptakeun, kami nganggo tambahan dinamis alamat sareng antarmuka pangguna anu dihubungkeun kana daptar alamat sareng antarmuka "abu":

winbox
Auténtikasi dua faktor pangguna VPN via MikroTik sareng 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

Perlu ngagunakeun "alamat-daptar" jeung "antarmuka-daftar" béréndélan babarengan pikeun ngaidentipikasi sarta néwak lalulintas ti klien VPN nu teu lulus otorisasina sekundér dina ranté dstnat (prerouting).

Nalika persiapan geus réngsé, ranté firewall tambahan sarta profil hiji geus dijieun, urang bakal nulis naskah jawab otomatis-generasi kodeu 2FA jeung aturan firewall individu.

Dokuméntasi wiki.mikrotik.com on PPP-Profil enriches kami kalayan informasi ngeunaan variabel pakait sareng PPP klien acara connect-disconnect "Jalankeun skrip dina acara login pangguna. Ieu mangrupikeun variabel anu sayogi anu tiasa diaksés pikeun naskah acara: pangguna, alamat lokal, alamat jauh, id panelepon, id-disebut, antarmuka". Sababaraha di antarana pisan mangpaat pikeun urang.

Kodeu dipaké dina profil pikeun 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

Utamana pikeun maranéhanana anu resep mindlessly nyalin-témpél, abdi ngingetkeun anjeun - kode nu dicokot tina versi test na bisa ngandung typos minor. Éta moal hésé pikeun jalma anu ngarti pikeun terang dimana.

Lamun pamaké disconnects, hiji "On-Down" acara dihasilkeun sarta Aksara pakait jeung parameter disebut. Tujuan tina skrip ieu nyaéta pikeun ngabersihan aturan firewall anu diciptakeun pikeun pangguna anu dipegatkeun.

Kodeu dipaké dina profil pikeun acara sambungan on-handap 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]
Anjeun teras tiasa nyiptakeun pangguna sareng napelkeun sadayana atanapi sababaraha aranjeunna kana profil auténtikasi dua faktor.

winbox
Auténtikasi dua faktor pangguna VPN via MikroTik sareng SMS

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

Kumaha eta Sigana di sisi klien.

Sawaktos Anjeun nyieun sambungan VPN, SMS kira-kira saperti kieu dikirim ka telepon/tablet Android/ios Anjeun nganggo kartu SIM:

SMS
Auténtikasi dua faktor pangguna VPN via MikroTik sareng SMS

Upami sambunganna didamel langsung tina telepon / tablet anjeun, maka anjeun tiasa ngaliwat 2FA ngan saukur ku ngaklik tautan tina pesen. Nyaan.

Upami sambungan VPN didamel tina PC, maka pangguna bakal diperyogikeun ngalebetkeun kecap konci anu minimal. Bentuk leutik dina bentuk file HTML dikirim ka pangguna nalika nyetél VPN. Berkas bahkan tiasa dikirim ku mail supados pangguna tiasa nyimpen sareng nyiptakeun potong kompas di tempat anu merenah. Sigana mah kieu:

Label dina méja
Auténtikasi dua faktor pangguna VPN via MikroTik sareng SMS

Pamaké ngaklik potong kompas, formulir éntri kode basajan muka, anu bakal ngalebetkeun kodeu kana URL anu dibuka:

Layar formulir
Auténtikasi dua faktor pangguna VPN via MikroTik sareng SMS

Bentuk anu paling primitif, dirumuskeun salaku conto. Anu hoyong tiasa ngarobih éta pikeun nyocogkeun diri.

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>

Upami otorisasina suksés, pangguna bakal ningali logo MikroTik dina browser, anu kedah nunjukkeun oténtikasi anu suksés:

Auténtikasi dua faktor pangguna VPN via MikroTik sareng SMS

Catet yén gambar dipulangkeun tina pangladén wéb MikroTik anu diwangun nganggo WebProxy Deny Redirect.

Kuring yakin yén gambar bisa ngaropéa ngagunakeun "hotspot" alat, unggah versi anjeun sorangan aya tur nyetel Deny alihan URL kana eta kalawan WebProxy.

Paménta ageung pikeun anu narékahan mésér "kaulinan" Mikrotik paling murah pikeun $ 20 sareng ngagentos ku router $ 500 - ulah ngalakukeun éta. Alat sapertos "hAP Lite" / "hAP mini" (titik aksés bumi) gaduh CPU anu lemah pisan (smips), sareng kamungkinan henteu tiasa ngatasi beban dina bagean bisnis.

Awas! Leyuran ieu boga hiji aral: lamun klien nyambungkeun atawa megatkeun, parobahan konfigurasi lumangsung, nu router nyoba simpen dina mémori non-volatile na. Kalayan sajumlah ageung klien sareng sambungan sering sareng putus, ieu tiasa nyababkeun degradasi panyimpenan internal dina router.

PS: Métode pikeun ngirimkeun kode ka klien tiasa dilegaan sareng ditambah sajauh kamampuan pamrograman anjeun cekap. Salaku conto, anjeun tiasa ngirim pesen ka telegram atanapi ... nyarankeun pilihan!

Kuring miharep artikel ieu bakal mangpaat pikeun anjeun sarta mantuan nyieun jaringan bisnis leutik tur sedeng-ukuran saeutik leuwih aman.

sumber: www.habr.com