Dalawang-factor na pagpapatunay ng mga gumagamit ng VPN sa pamamagitan ng MikroTik at SMS

Hello mga kasamahan! Ngayon, kapag ang hilig sa malayong trabaho ay humupa ng kaunti, karamihan sa mga administrador ay nagtagumpay sa gawain ng malayuang pag-access ng mga empleyado sa corporate network, oras na upang ibahagi ang aking matagal nang karanasan sa pagpapabuti ng seguridad ng VPN. Hindi saklaw ng artikulong ito ang kasalukuyang naka-istilong IPSec IKEv2 at xAuth. Ito ay tungkol sa pagbuo ng isang sistema two-factor authentication (2FA) Ang mga gumagamit ng VPN kapag ang MikroTik ay kumikilos bilang isang VPN server. Ibig sabihin, kapag ginamit ang "classic" na mga protocol tulad ng PPP.

Dalawang-factor na pagpapatunay ng mga gumagamit ng VPN sa pamamagitan ng MikroTik at SMS

Ngayon sasabihin ko sa iyo kung paano protektahan ang MikroTik PPP-VPN kahit na na-hijack ang iyong user account. Nang ipakilala ang scheme na ito sa isa sa aking mga customer, maikli niyang inilarawan ito bilang "well, ngayon ay parang sa isang bangko!"

Ang pamamaraan ay hindi gumagamit ng mga serbisyo ng panlabas na authenticator. Ang mga gawain ay isinasagawa sa loob ng router mismo. Walang gastos para sa konektadong kliyente. Gumagana ang pamamaraan para sa parehong mga kliyente ng PC at mga mobile device.

Ang pangkalahatang scheme ng proteksyon ay ang mga sumusunod:

  1. Ang panloob na IP address ng isang user na matagumpay na nakakonekta sa VPN server ay awtomatikong idinaragdag sa gray na listahan.
  2. Ang kaganapan ng koneksyon ay awtomatikong bumubuo ng isang beses na code na ipinadala sa gumagamit gamit ang isa sa mga magagamit na pamamaraan.
  3. Ang mga address sa listahang ito ay may limitadong access sa mga mapagkukunan ng lokal na network, maliban sa serbisyong "authenticator", na inaasahang makakatanggap ng isang beses na code ng password.
  4. Pagkatapos ipakita ang code, ang user ay may access sa mga panloob na mapagkukunan ng network.

Muna ang pinakamaliit na problemang kinailangan naming harapin ay ang pag-iimbak ng impormasyon sa pakikipag-ugnayan tungkol sa user para magpadala sa kanya ng 2FA code. Dahil imposibleng lumikha ng mga arbitrary na patlang ng data na naaayon sa mga gumagamit sa Mikrotik, ginamit ang umiiral na patlang na "komento":

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

Ang pangalawang ang problema ay naging mas seryoso - ang pagpili ng landas at paraan ng paghahatid ng code. Sa kasalukuyan, tatlong scheme ang ipinatupad: a) SMS sa pamamagitan ng USB modem b) e-mail c) SMS sa pamamagitan ng e-mail na magagamit para sa mga corporate client ng pulang mobile operator.

Oo, ang mga SMS scheme ay nagkakaroon ng mga gastos. Ngunit kung titingnan mo ito, "ang seguridad ay palaging tungkol sa pera" (c).
Personal kong hindi gusto ang scheme ng email. Hindi dahil kinakailangan nito na maging available ang mail server sa client na pinapatotohanan - hindi problema ang hatiin ang trapiko. Gayunpaman, kung ang kliyente ay walang ingat na nag-save ng mga password para sa parehong VPN at email sa browser, at pagkatapos ay nawala ang kanyang laptop, ang umaatake ay makakakuha ng ganap na access sa corporate network mula dito.

Kaya, napagpasyahan - naghahatid kami ng isang beses na code gamit ang mga mensaheng SMS.

Ang ikatlo ang problema ay kung saan at paano bumuo ng pseudo-random code para sa 2FA sa MikroTik. Walang katumbas ang random() function sa RouterOS scripting language, at nakakita na ako ng ilang crummy scripted pseudo-random number generators dati. Hindi ko nagustuhan ang alinman sa kanila sa iba't ibang dahilan.

Sa katunayan, mayroong isang pseudo-random na sequence generator sa MikroTik! Ito ay nakatago mula sa isang mababaw na sulyap sa konteksto ng /certificates scep-server. Ang unang paraan ang pagkuha ng isang beses na password ay madali at simple - gamit ang command /certificate scep-server otp bumuo. Kung magsasagawa kami ng isang simpleng variable na pagpapatakbo ng pagtatalaga, makakakuha kami ng isang halaga ng array na maaaring magamit sa ibang pagkakataon sa mga script.

Ang ikalawang paraan pagkuha ng isang beses na password, na madaling gamitin - gamit ang isang panlabas na serbisyo random.org upang makabuo ng gustong uri ng pagkakasunod-sunod ng mga pseudorandom na numero. Narito ang isang pinasimple konsol halimbawa ng pagtanggap ng data sa isang variable:

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

Ang isang kahilingang na-format para sa console (kakailanganin ang pagtakas sa mga espesyal na character sa katawan ng script) ay makakatanggap ng string ng anim na numerong character sa $rnd1 variable. Ang sumusunod na command na "put" ay nagpapakita lamang ng variable sa MikroTik console.

Ang pang-apat na problema na kailangang mabilis na malutas ay kung paano at saan ipapadala ng konektadong kliyente ang isang beses na code nito sa ikalawang yugto ng pagpapatunay.

Dalawang-factor na pagpapatunay ng mga gumagamit ng VPN sa pamamagitan ng MikroTik at SMS

Dapat mayroong isang serbisyo sa MikroTik router na maaaring tanggapin ang code at itugma ito sa isang partikular na kliyente. Kung ang ibinigay na code ay tumutugma sa inaasahan, ang address ng kliyente ay dapat na kasama sa isang tiyak na "puting" listahan, mga address kung saan pinapayagan ang pag-access sa panloob na network ng kumpanya.

Dahil sa limitadong pagpili ng mga serbisyo, napagpasyahan na tanggapin ang mga code sa pamamagitan ng http gamit ang webproxy na nakapaloob sa Mikrotik. At dahil ang firewall ay maaaring gumana sa mga dynamic na listahan ng mga IP address, ito ay ang firewall na naghahanap para sa code, tumutugma ito sa client IP at idinagdag ito sa "puting" listahan gamit ang Layer7 regexp. Ang router mismo ay itinalaga ng isang kondisyon na pangalan ng DNS na "gw.local", at isang static na A record ang ginawa dito para sa pagpapalabas sa mga kliyente ng PPP:

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

Pagkuha ng trapiko mula sa mga hindi na-verify na kliyente sa pamamagitan ng 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

Sa kasong ito, ang proxy ay may dalawang function.

1. Buksan ang mga koneksyon sa TCP sa mga kliyente;

2. Sa kaso ng matagumpay na awtorisasyon, i-redirect ang client browser sa isang pahina o larawang nag-aabiso tungkol sa matagumpay na pagpapatunay:

Proxy config
/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

Ililista ko ang mahahalagang elemento ng pagsasaayos:

  1. interface-list "2fa" - isang dynamic na listahan ng mga interface ng kliyente, ang trapiko kung saan nangangailangan ng pagproseso sa loob ng balangkas ng 2FA;
  2. address-list β€œ2fa_jailed” β€” β€œgrey” na listahan ng mga tunnel IP address ng mga kliyente ng VPN;
  3. address_list "2fa_approved" - isang puting listahan ng mga tunnel IP address ng mga kliyente ng VPN na matagumpay na nakapasa sa two-factor authentication.
  4. chain ng firewall na "input_2fa" - sinusuri nito ang mga TCP packet para sa pagkakaroon ng authorization code at kung ang IP address ng nagpadala ng code ay tumutugma sa kinakailangang isa. Ang mga panuntunan sa chain ay dynamic na idinaragdag at inalis.

Ang isang pinasimpleng packet processing flowchart ay ganito ang hitsura:

Dalawang-factor na pagpapatunay ng mga gumagamit ng VPN sa pamamagitan ng MikroTik at SMS

Upang maisama ang trapiko mula sa mga kliyente sa listahang β€œgrey” na hindi pa nakapasa sa ikalawang yugto ng pagpapatunay sa pag-scan ng Layer7, isang panuntunan ang ginawa sa karaniwang chain ng β€œinput”:

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

Ngayon simulan nating ikonekta ang lahat ng kayamanan na ito sa serbisyo ng PPP. Pinapayagan ka ng MikroTik na gumamit ng mga script sa mga profile (ppp-profile) at italaga ang mga ito sa mga kaganapan ng pag-set up at pagsira ng koneksyon sa ppp. Ang mga setting ng ppp-profile ay maaaring ilapat pareho sa PPP server sa kabuuan at sa mga indibidwal na user. Sa kasong ito, ang profile na itinalaga sa user ay may priyoridad, override sa mga tinukoy na parameter nito ang mga parameter ng profile na pinili para sa server sa kabuuan.

Bilang resulta ng diskarteng ito, maaari kaming lumikha ng isang espesyal na profile para sa dalawang-factor na pagpapatotoo at italaga ito hindi sa lahat ng mga gumagamit, ngunit lamang sa mga itinuturing naming kinakailangan na gawin ito. Ito ay maaaring may kaugnayan kung gagamit ka ng mga serbisyo ng PPP hindi lamang upang kumonekta sa mga end user, ngunit sa parehong oras upang bumuo ng mga koneksyon sa site-to-site.

Sa bagong likhang espesyal na profile, gumagamit kami ng dynamic na pagdaragdag ng address at interface ng nakakonektang user sa mga "grey" na listahan ng mga address at interface:

winbox
Dalawang-factor na pagpapatunay ng mga gumagamit ng VPN sa pamamagitan ng MikroTik at SMS

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

Kinakailangang gamitin ang mga listahan ng "address-list" at "interface-list" upang matukoy at makuha ang trapiko mula sa mga kliyente ng VPN na hindi nakapasa sa pangalawang awtorisasyon sa dstnat (prerouting) chain.

Kapag nakumpleto na ang paghahanda, nakagawa na ng karagdagang mga chain ng firewall at isang profile, susulat kami ng script na responsable para sa awtomatikong pagbuo ng 2FA code at mga indibidwal na panuntunan sa firewall.

Dokumentasyon wiki.mikrotik.com sa PPP-Profile ay nagpapayaman sa amin ng impormasyon tungkol sa mga variable na nauugnay sa koneksyon ng kliyente ng PPP at mga kaganapan sa pagdiskonekta "Ipatupad ang script sa login-event ng user. Ito ay mga available na variable na naa-access para sa script ng kaganapan: user, local-address, remote-address, caller-id, called-id, interface". Ang ilan sa mga ito ay magiging lubhang kapaki-pakinabang sa atin.

Code na ginamit sa profile para sa PPP on-up na kaganapan sa koneksyon

#Π›ΠΎΠ³ΠΈΡ€ΡƒΠ΅ΠΌ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ 
: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

Binabalaan ko kayo lalo na para sa mga mahilig magkopya-paste nang walang isip - ang code ay kinuha mula sa isang pagsubok na bersyon at maaaring naglalaman ng mga maliliit na error. Hindi magiging mahirap para sa isang taong maunawain na malaman kung saan eksakto.

Kapag nagdiskonekta ang isang user, bubuo ng event na "On-Down" at tatawagin ang kaukulang script na may mga parameter. Ang layunin ng script na ito ay linisin ang mga panuntunan sa firewall na ginawa para sa nadiskonektang user.

Code na ginamit sa profile para sa PPP on-down na kaganapan sa koneksyon

: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]
Pagkatapos ay maaari kang lumikha ng mga user at magtalaga ng ilan o lahat ng mga ito sa isang two-factor authentication profile.

winbox
Dalawang-factor na pagpapatunay ng mga gumagamit ng VPN sa pamamagitan ng MikroTik at SMS

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

Ano ang hitsura nito sa panig ng kliyente.

Kapag nagtaguyod ka ng koneksyon sa VPN, isang SMS na humigit-kumulang na tulad nito ang ipapadala sa iyong Android/iOS phone/tablet na may SIM card:

SMS
Dalawang-factor na pagpapatunay ng mga gumagamit ng VPN sa pamamagitan ng MikroTik at SMS

Kung direktang itinatag ang koneksyon mula sa iyong telepono/tablet, maaari kang dumaan sa 2FA sa pamamagitan lamang ng pag-click sa link mula sa mensahe. Ito ay komportable.

Kung ang isang koneksyon sa VPN ay naitatag mula sa isang PC, kakailanganin ng user na magpasok ng kaunting paraan ng password. Ang isang maliit na form sa anyo ng isang HTML file ay ipinadala sa gumagamit kapag nagse-set up ng VPN. Ang file ay maaaring ipadala sa pamamagitan ng koreo upang mai-save ito ng gumagamit at lumikha ng isang shortcut sa isang maginhawang lugar. Mukhang ganito:

Label sa mesa
Dalawang-factor na pagpapatunay ng mga gumagamit ng VPN sa pamamagitan ng MikroTik at SMS

Nag-click ang user sa shortcut, bubukas ang isang simpleng form ng pagpasok ng code, na maglalagay ng code sa binuksan na URL:

Screen ng form
Dalawang-factor na pagpapatunay ng mga gumagamit ng VPN sa pamamagitan ng MikroTik at SMS

Ang form ay ang pinaka-primitive, na ibinigay bilang isang halimbawa. Ang mga nagnanais ay maaaring baguhin ito upang umangkop sa kanilang sarili.

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>

Kung matagumpay ang awtorisasyon, makikita ng user ang logo ng MikroTik sa browser, na dapat magsilbi bilang senyales ng matagumpay na pagpapatunay:

Dalawang-factor na pagpapatunay ng mga gumagamit ng VPN sa pamamagitan ng MikroTik at SMS

Tandaan na ang imahe ay ibinalik mula sa built-in na MikroTik web server gamit ang WebProxy Deny Redirect.

Naniniwala ako na maaaring i-customize ang larawan gamit ang tool na "hotspot", i-upload ang sarili mong bersyon doon at magtakda ng Deny Redirect URL dito gamit ang WebProxy.

Isang malaking kahilingan sa mga sumusubok na bumili ng pinakamurang "laruan" na Mikrotik sa halagang $20 at palitan ito ng $500 na router - huwag gawin iyon. Ang mga device tulad ng "hAP Lite"/"hAP mini" (home access point) ay may napakahinang CPU (smips), at malamang na hindi makayanan ang load sa segment ng negosyo.

Babala! Ang solusyon na ito ay may isang disbentaha: kapag kumonekta o nagdiskonekta ang mga kliyente, nagaganap ang mga pagbabago sa pagsasaayos, na sinusubukang i-save ng router sa hindi pabagu-bagong memorya nito. Sa malaking bilang ng mga kliyente at madalas na koneksyon at pagkakadiskonekta, maaari itong humantong sa pagkasira ng panloob na imbakan sa router.

PS: ang mga pamamaraan para sa paghahatid ng code sa kliyente ay maaaring palawakin at dagdagan hangga't ang iyong mga kakayahan sa programming ay nababahala. Halimbawa, maaari kang magpadala ng mga mensahe sa telegrama o... magmungkahi ng mga opsyon!

Umaasa ako na ang artikulong ito ay magiging kapaki-pakinabang sa iyo at makatulong na gawing mas secure ng kaunti at katamtamang laki ang mga network ng negosyo.

Pinagmulan: www.habr.com