De-faktè otantifikasyon itilizatè VPN atravè MikroTik ak SMS

Bonjou kòlèg yo! Jodi a, lè pasyon nan travay aleka te bese yon ti kras, pifò administratè yo te konkeri travay la nan aksè aleka nan anplwaye nan rezo antrepriz la, li lè yo pataje eksperyans ki dire lontan mwen nan amelyore sekirite VPN. Atik sa a pa pral kouvri kounye a alamòd IPSec IKEv2 ak xAuth. Li se sou bati yon sistèm Otantifikasyon de faktè (2FA) Itilizatè VPN lè MikroTik aji kòm yon sèvè VPN. Savwa, lè yo itilize pwotokòl "klasik" tankou PPP.

De-faktè otantifikasyon itilizatè VPN atravè MikroTik ak SMS

Jodi a mwen pral di w kijan pou pwoteje MikroTik PPP-VPN menm si kont itilizatè ou an vòlè. Lè yo te prezante konplo sa a nan youn nan kliyan mwen yo, li te dekri yon ti tan kòm "byen, kounye a li jis tankou nan yon bank!"

Metòd la pa sèvi ak sèvis otantifikatè ekstèn. Travay yo fèt anndan pa routeur nan tèt li. Pa gen pri pou kliyan an konekte. Metòd la ap travay pou tou de kliyan PC ak aparèy mobil.

Konplo pwoteksyon jeneral la se jan sa a:

  1. Adrès IP entèn yon itilizatè ki gen siksè konekte ak sèvè VPN a otomatikman ajoute nan lis gri a.
  2. Evènman koneksyon an otomatikman jenere yon kòd yon sèl fwa ke yo voye bay itilizatè a lè l sèvi avèk youn nan metòd ki disponib yo.
  3. Adrès ki nan lis sa a gen aksè limite a resous rezo lokal yo, eksepte sèvis "otantifikatè" la, ki espere resevwa yon kòd modpas yon sèl fwa.
  4. Apre prezante kòd la, itilizatè a gen aksè a resous entèn rezo a.

Premye a pwoblèm nan pi piti nou te fè fas a te estoke enfòmasyon kontak sou itilizatè a voye l 'yon kòd 2FA. Piske li enposib pou kreye jaden done abitrè ki koresponn ak itilizatè yo nan Mikrotik, yo te itilize jaden "kòmantè" ki egziste deja:

/ppp sekrè ajoute non=Petrov modpas=4M@ngr! kòmantè="89876543210"

Dezyèm lan pwoblèm nan te vin pi grav - chwa a nan chemen an ak metòd nan livrezon kòd la. Twa plan yo kounye a aplike: a) SMS via USB-modèm b) imel c) SMS via imel ki disponib pou kliyan antrepriz nan operatè selilè wouj la.

Wi, konplo SMS fè depans. Men, si ou gade sou li, "sekirite se toujou sou lajan" (c).
Mwen pèsonèlman pa renmen konplo imel la. Se pa paske li mande pou sèvè lapòs la disponib pou kliyan an otantifye - li pa yon pwoblèm pou divize trafik la. Sepandan, si kliyan an neglijans sove modpas pou tou de vpn ak imèl nan navigatè a, ak Lè sa a, pèdi laptop li, atakè a pral jwenn aksè konplè nan rezo antrepriz la soti nan li.

Se konsa, li deside - nou delivre yon kòd yon sèl fwa lè l sèvi avèk mesaj SMS.

Twazyèm lan pwoblèm nan te kote ak ki jan yo jenere yon kòd pseudo-o aza pou 2FA nan MikroTik. Pa gen okenn ekivalan a fonksyon random() nan langaj scripting RouterOS la, e mwen te wè plizyè dèlko nimewo pseudo-o aza ki gen script script. Mwen pa t renmen youn nan yo pou plizyè rezon.

An reyalite, gen yon dèlko sekans pseudo-o aza nan MikroTik! Li kache nan yon ti koutje supèrfisyèl nan kontèks /certificates scep-server. Premye fason jwenn yon modpas yon sèl fwa se fasil ak senp - ak lòd la /certificates scep-server otp jenere. Si nou fè yon senp operasyon plasman varyab, nou pral jwenn yon valè etalaj ki ka itilize pita nan scripts.

Dezyèm fason jwenn yon modpas yon sèl fwa ki fasil pou aplike tou - lè l sèvi avèk yon sèvis ekstèn random.org pou jenere kalite sekans nimewo pseudoazar yo vle. Isit la se yon senplifye cantilevered egzanp jwenn done nan yon varyab:

Kòd
: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

Yon demann fòma pou konsole a (yo pral mande pou chape karaktè espesyal nan kò a nan script la) resevwa yon seri sis karaktè nimerik nan $rnd1 varyab la. Kòmandman "mete" sa a tou senpleman montre varyab la nan konsole MikroTik la.

Katriyèm pwoblèm nan ki te dwe byen vit rezoud se ki jan ak ki kote kliyan an konekte ta transmèt kòd yon sèl-fwa li nan dezyèm etap la nan otantifikasyon.

De-faktè otantifikasyon itilizatè VPN atravè MikroTik ak SMS

Dwe gen yon sèvis sou routeur MikroTik ki ka aksepte kòd la epi matche li ak yon kliyan espesifik. Si kòd yo bay la matche ak youn nan espere, adrès kliyan an dwe enkli nan yon sèten lis "blan", adrès ki soti nan ki gen aksè nan rezo entèn konpayi an.

Akòz chwa a limite nan sèvis, li te deside aksepte kòd atravè http lè l sèvi avèk webproxy ki te bati nan Mikrotik. Epi depi firewall la ka travay ak lis dinamik adrès IP, se firewall la ki chèche kòd la, matche li ak IP kliyan an epi ajoute li nan lis "blan" lè l sèvi avèk Layer7 regexp. Yo te bay routeur la li menm yon non DNS kondisyonèl "gw.local", epi yo te kreye yon dosye estatik A sou li pou bay kliyan PPP yo:

dns
/ip dns static ajoute non = gw.local address = 172.31.1.1

Kaptire trafik kliyan ki pa verifye sou proxy a:
/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

Nan ka sa a, prokurasyon an gen de fonksyon.

1. Louvri koneksyon TCP ak kliyan;

2. Nan ka otorizasyon siksè, redireksyon navigatè kliyan an nan yon paj oswa imaj ki fè konnen sou otantifikasyon siksè:

Konfigirasyon 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

Mwen pral lis eleman konfigirasyon enpòtan yo:

  1. koòdone-lis "2fa" - yon lis dinamik nan koòdone kliyan, trafik ki soti nan ki mande pou pwosesis nan kad 2FA;
  2. address-list "2fa_jailed" - "gri" lis adrès IP tinèl kliyan VPN yo;
  3. address_list "2fa_approved" - yon lis blan adrès IP tinèl kliyan VPN ki te pase avèk siksè otantifikasyon de faktè.
  4. chèn firewall "input_2fa" - li tcheke pakè tcp pou prezans yon kòd otorizasyon ak matche ak adrès IP moun k ap voye kòd la ak youn ki nesesè yo. Règ nan chèn lan yo ajoute epi retire dinamik.

Yon organigram senplifye nan pwosesis pake sanble sa a:

De-faktè otantifikasyon itilizatè VPN atravè MikroTik ak SMS

Pou antre nan chèk trafik Layer7 nan kliyan ki soti nan lis "gri" ki poko pase dezyèm etap otantifikasyon an, yo te kreye yon règ nan chèn "antre" estanda a:

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

Koulye a, ann kòmanse tache tout richès sa a nan sèvis la PPP. MikroTik pèmèt ou sèvi ak scripts nan pwofil (ppp-profile) epi asiyen yo nan evènman yo nan etabli ak kraze yon koneksyon ppp. Anviwònman ppp-pwofil yo ka aplike nan tou de sèvè a PPP kòm yon antye ak nan itilizatè endividyèl yo. An menm tan an, pwofil la bay itilizatè a gen priyorite, anile paramèt pwofil la chwazi pou sèvè a kòm yon antye ak paramèt espesifye li yo.

Kòm yon rezilta nan apwòch sa a, nou ka kreye yon pwofil espesyal pou otantifikasyon de faktè epi bay li pa tout itilizatè yo, men sèlman nan moun ki konsidere li nesesè yo fè sa. Sa a ka enpòtan si ou itilize sèvis PPP non sèlman pou konekte itilizatè final yo, men an menm tan an pou konstwi koneksyon sit-a-site.

Nan pwofil espesyal ki fèk kreye a, nou itilize adisyon dinamik adrès ak koòdone itilizatè ki konekte nan lis "gri" adrès ak koòdone yo:

winbox
De-faktè otantifikasyon itilizatè VPN atravè MikroTik ak SMS

Kòd
/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

Li nesesè pou itilize lis "address-list" ak "koòdone-list" ansanm pou idantifye ak pran trafik nan kliyan VPN ki pa te pase otorizasyon segondè nan chèn dstnat (prerouting).

Lè preparasyon an fini, chèn pare-feu adisyonèl ak yon pwofil yo kreye, nou pral ekri yon script ki responsab pou jenerasyon oto-kod 2FA a ak règleman firewall endividyèl yo.

Dokimantasyon wiki.mikrotik.com sou PPP-Profile anrichi nou ak enfòmasyon sou varyab ki asosye ak koneksyon kliyan PPP ak evènman dekoneksyon "Egzekite script sou itilizatè login-evènman. Sa yo se varyab ki disponib ki aksesib pou script evènman an: itilizatè, lokal-address, remote-address, moun kap rele-id, rele-id, koòdone". Kèk nan yo pral trè itil pou nou.

Kòd yo itilize nan pwofil la pou evènman koneksyon PPP sou-up la

#Логируем для отладки полученные переменные 
: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

Mwen avèti w espesyalman pou moun ki renmen kopye-kole san konprann - kòd la te pran nan yon vèsyon tès epi li ka gen erè minè. Li p ap difisil pou yon moun konprann pou konnen ki kote egzakteman.

Lè yon itilizatè dekonekte, yon evènman "On-Down" pwodwi epi yo rele script ki koresponn lan ak paramèt. Objektif script sa a se netwaye règ firewall ki te kreye pou itilizatè ki dekonekte a.

Kòd yo itilize nan pwofil pou evènman koneksyon PPP sou desann

: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]
Lè sa a, ou ka kreye itilizatè yo epi bay kèk oswa tout nan yon pwofil otantifikasyon de faktè.

winbox
De-faktè otantifikasyon itilizatè VPN atravè MikroTik ak SMS

Kòd
/ppp secrets set [find name=Petrov] profile=2FA

Ki jan li sanble sou bò kliyan an.

Lè ou etabli yon koneksyon VPN, yo voye yon SMS apeprè tankou sa a nan telefòn Android/iOS/tablèt ou ak yon kat SIM:

SMS
De-faktè otantifikasyon itilizatè VPN atravè MikroTik ak SMS

Si koneksyon an etabli dirèkteman nan telefòn ou / tablèt ou a, Lè sa a, ou ka ale nan 2FA tou senpleman pa klike sou lyen ki soti nan mesaj la. Li konfòtab.

Si yo etabli koneksyon VPN nan yon PC, lè sa a itilizatè a pral oblije antre nan yon fòm modpas minim. Yo bay itilizatè a yon ti fòm nan fòm yon fichye HTML lè w ap mete VPN a. Fichye a ka menm voye pa lapòs pou itilizatè a sove li epi li kreye yon chemen kout nan yon kote ki pratik. Li sanble sa a:

Mete etikèt sou tab la
De-faktè otantifikasyon itilizatè VPN atravè MikroTik ak SMS

Itilizatè a klike sou chemen kout la, yon senp fòm antre kòd ouvri, ki pral mete kòd la nan URL la louvri:

Fòm ekran
De-faktè otantifikasyon itilizatè VPN atravè MikroTik ak SMS

Yo bay fòm ki pi primitif la kòm yon egzanp. Moun ki vle kapab modifye pou tèt yo.

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>

Si otorizasyon an reyisi, itilizatè a pral wè logo MikroTik nan navigatè a, ki ta dwe sèvi kòm yon siyal otantifikasyon siksè:

De-faktè otantifikasyon itilizatè VPN atravè MikroTik ak SMS

Remake byen ke imaj la tounen soti nan sèvè wèb MikroTik entegre lè l sèvi avèk WebProxy Deny Redirect.

Mwen kwè ke imaj la ka Customized lè l sèvi avèk zouti "hotspot" la, telechaje vèsyon pwòp ou a la epi mete yon URL Redireksyon refize li ak WebProxy.

Yon gwo demann pou moun ki ap eseye achte pi bon mache "jwèt" Mikrotik la pou $20 epi ranplase li ak yon routeur $500 - pa fè sa. Aparèy tankou "hAP Lite"/"hAP mini" (pwen aksè lakay) gen yon CPU trè fèb (smips), epi yo gen anpil chans pou yo pa fè fas ak chaj la nan segman biznis la.

Avètisman! Solisyon sa a gen yon sèl dezavantaj: lè kliyan konekte oswa dekonekte, chanjman konfigirasyon rive, ki routeur la ap eseye sove nan memwa ki pa temèt li yo. Avèk yon gwo kantite kliyan ak koneksyon souvan ak dekoneksyon, sa ka mennen nan degradasyon nan depo entèn nan routeur la.

PS: metòd pou delivre kòd bay kliyan an ka elaji ak complétée osi lwen ke kapasite pwogram ou yo konsène. Pou egzanp, ou ka voye mesaj sou telegram oswa ... sijere opsyon!

Mwen espere atik sa a pral itil ou epi ede fè rezo biznis ti ak mwayen gwosè yon ti kras pi an sekirite.

Sous: www.habr.com