VPN օգտագործողների երկու գործոն նույնականացում MikroTik-ի և SMS-ի միջոցով

Բարև գործընկերներ: Այսօր, երբ «հեռավոր աշխատանքի» շուրջ կրքերի ինտենսիվությունը մի փոքր հանդարտվեց, ադմինների մեծամասնությունը շահեց աշխատակիցների կորպորատիվ ցանցին հեռահար մուտք գործելու խնդիրը, ժամանակն է կիսվել VPN անվտանգության բարելավման իմ երկարամյա փորձով: Այս հոդվածը հիմա նորաձև չի լինի IPSec IKEv2 և xAuth: Խոսքը համակարգ կառուցելու մասին է: երկգործոն նույնականացում (2FA) VPN օգտվողներ, երբ MikroTik-ը գործում է որպես VPN սերվեր: Մասնավորապես, երբ օգտագործվում են «դասական» արձանագրություններ, ինչպիսին PPP-ն է։

VPN օգտագործողների երկու գործոն նույնականացում MikroTik-ի և SMS-ի միջոցով

Այսօր ես ձեզ կասեմ, թե ինչպես պաշտպանել MikroTik PPP-VPN-ն անգամ օգտատիրոջ հաշիվը «առևանգելու» դեպքում։ Երբ այս սխեման ներկայացվեց իմ հաճախորդներից մեկին, նա հակիրճ նկարագրեց այն այսպես.

Մեթոդը չի օգտագործում արտաքին վավերացման ծառայություններ: Առաջադրանքները ներքին կարգով կատարվում են հենց երթուղիչի կողմից: Միացնող հաճախորդի համար ծախսեր չկան: Մեթոդն աշխատում է ինչպես համակարգչի հաճախորդների, այնպես էլ շարժական սարքերի համար:

Պաշտպանության ընդհանուր սխեման հետևյալն է.

  1. VPN սերվերին հաջողությամբ միացած օգտատիրոջ ներքին IP հասցեն ավտոմատ կերպով հայտնվում է մոխրագույն ցուցակում:
  2. Կապի իրադարձությունը ավտոմատ կերպով ստեղծում է մեկանգամյա կոդ, որն ուղարկվում է օգտագործողին՝ օգտագործելով առկա մեթոդներից մեկը:
  3. Այս ցանկի հասցեները սահմանափակ հասանելիություն ունեն տեղական ցանցի ռեսուրսներին, բացառությամբ «authenticator» ծառայության, որը սպասում է մեկանգամյա գաղտնաբառ ստանալուն:
  4. Կոդը ներկայացնելուց հետո օգտագործողին հասանելի է ցանցի ներքին ռեսուրսները։

Առաջին Ամենափոքր խնդիրը, որին ես ստիպված էի հանդիպել, օգտատիրոջ մասին կոնտակտային տվյալները պահելն էր՝ նրան 2FA կոդը ուղարկելու համար: Քանի որ Mikrotik-ում օգտատերերին համապատասխան կամայական տվյալների դաշտեր ստեղծելն անհնար է, օգտագործվեց գոյություն ունեցող «մեկնաբանություն» դաշտը.

/ppp գաղտնիքները ավելացնել անունը=Պետրովի գաղտնաբառ=4M@ngr! մեկնաբանություն = "89876543210"

Երկրորդ խնդիրն ավելի լուրջ է ստացվել՝ կոդը փոխանցելու ուղու և եղանակի ընտրությունը։ Ներկայումս իրականացվում են երեք սխեմաներ. ա) SMS-ներ USB-մոդեմի միջոցով բ) էլ. փոստ գ) SMS էլեկտրոնային փոստով, որը հասանելի է կարմիր բջջային օպերատորի կորպորատիվ հաճախորդների համար:

Այո, SMS սխեմաները ծախսեր են բերում: Բայց եթե նայեք, «անվտանգությունը միշտ փողի հետ է կապված» (գ):
Ինձ անձամբ դուր չի գալիս էլեկտրոնային փոստով սխեման: Ոչ այն պատճառով, որ այն պահանջում է, որ փոստի սերվերը հասանելի լինի նույնականացվող հաճախորդի համար. խնդիր չէ տրաֆիկի բաժանումը: Այնուամենայնիվ, եթե հաճախորդն անզգուշորեն պահպանում է և՛ vpn, և՛ էլ.

Այսպիսով, որոշված ​​է՝ մենք առաքում ենք մեկանգամյա կոդ՝ օգտագործելով SMS հաղորդագրություններ:

Երրորդը Խնդիրն այն էր, թե որտեղ ինչպես ստեղծել կեղծ պատահական կոդ 2FA-ի համար MikroTik-ում. RouterOS-ի սկրիպտավորման լեզվում պատահական() ֆունկցիայի անալոգը չկա, և ես նախկինում տեսել եմ մի քանի հենակային սցենար կեղծ-պատահական թվերի գեներատորներ: Նրանցից ոչ մեկն ինձ դուր չեկավ տարբեր պատճառներով։

Փաստորեն, MikroTik-ում կա կեղծ պատահական հաջորդականության գեներատոր: Այն թաքնված է մակերեսային հայացքից /certificates scep-server-ի համատեքստում: Առաջին ճանապարհը Միանգամյա գաղտնաբառ ստանալը հեշտ և պարզ է՝ հրամանով /վկայականներ scep-server otp առաջացնում. Եթե ​​մենք կատարենք փոփոխականի նշանակման պարզ գործողություն, ապա կստանանք զանգվածի արժեք, որը հետագայում կարող է օգտագործվել սկրիպտներում։

Երկրորդ ճանապարհը միանգամյա գաղտնաբառի ձեռքբերում, որը նույնպես հեշտ է կիրառել՝ օգտագործելով արտաքին ծառայություն պատահական.org ստեղծել կեղծ պատահական թվերի ցանկալի տեսակի հաջորդականություն: Ահա պարզեցված կոնսուլյար Տվյալները փոփոխականի մեջ ստանալու օրինակ.

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

Վահանակի համար ձևաչափված հարցումը (սկրիպտի մարմնում կպահանջվի հատուկ նիշերից խուսափելը) $rnd1 փոփոխականի մեջ ստանում է վեց նիշանոց տող: Հետևյալ «put» հրամանը պարզապես ցուցադրում է փոփոխականը MikroTik վահանակում:

Չորրորդ խնդիրը որը պետք է արագ լուծվեր. ահա թե ինչպես և որտեղ միացված հաճախորդը կփոխանցի իր մեկանգամյա կոդը նույնականացման երկրորդ փուլում:

VPN օգտագործողների երկու գործոն նույնականացում MikroTik-ի և SMS-ի միջոցով

MikroTik երթուղիչի վրա պետք է լինի ծառայություն, որը կարող է ընդունել կոդը և համապատասխանեցնել այն կոնկրետ հաճախորդի հետ: Եթե ​​տրամադրված կոդը համապատասխանում է ակնկալվողին, հաճախորդի հասցեն պետք է ներառվի որոշակի «սպիտակ» ցուցակում, որտեղից թույլատրվում է մուտք գործել ընկերության ներքին ցանց:

Ծառայությունների վատ ընտրության պատճառով որոշվեց ընդունել կոդերը http-ի միջոցով՝ օգտագործելով Mikrotik-ում ներկառուցված webproxy-ը: Եվ քանի որ firewall-ը կարող է աշխատել IP հասցեների դինամիկ ցուցակների հետ, հենց firewall-ն է կատարում կոդի որոնումը՝ այն համապատասխանեցնելով հաճախորդի IP-ին և ավելացնելով այն «սպիտակ» ցուցակում՝ օգտագործելով Layer7 regexp: Երթուղիչին ինքնին տրվել է պայմանական DNS անվանում «gw.local», դրա վրա ստեղծվել է ստատիկ A-գրառում PPP հաճախորդներին տրամադրելու համար.

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

Չստուգված հաճախորդների երթևեկության գրանցում վստահված անձի վրա.
/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

Այս դեպքում վստահված անձը երկու գործառույթ ունի.

1. Բացեք tcp կապերը հաճախորդների հետ;

2. Հաջող թույլտվության դեպքում հաճախորդի զննարկիչը վերահղեք էջ կամ նկար, որը ծանուցում է հաջող վավերացման մասին.

Վստահված անձի կոնֆիգուրացիա
/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

Ես կթվարկեմ կազմաձևման կարևոր տարրերը.

  1. ինտերֆեյս-ցուցակ «2fa» - հաճախորդի միջերեսների դինամիկ ցուցակ, որոնցից տրաֆիկը պահանջում է մշակում 2FA-ի շրջանակներում;
  2. հասցեների ցուցակ «2fa_jailed» - VPN հաճախորդների թունելային IP հասցեների «մոխրագույն» ցուցակ;
  3. address_list «2fa_approved» - VPN հաճախորդների թունելային IP հասցեների «սպիտակ» ցուցակ, որոնք հաջողությամբ անցել են երկգործոն նույնականացում:
  4. firewall շղթա «input_2fa» - այն ստուգում է tcp փաթեթները թույլտվության կոդի առկայության համար և համապատասխանեցնում է կոդը ուղարկողի IP հասցեն պահանջվողին: Շղթայում կանոնները ավելացվում և հեռացվում են դինամիկ կերպով:

Փաթեթների մշակման պարզեցված սխեմա ունի հետևյալ տեսքը.

VPN օգտագործողների երկու գործոն նույնականացում MikroTik-ի և SMS-ի միջոցով

«Գորշ» ցուցակից հաճախորդների կողմից տրաֆիկի Layer7 ստուգման մեջ մտնելու համար, որոնք դեռ չեն անցել նույնականացման երկրորդ փուլը, ստանդարտ «ներածում» շղթայում ստեղծվել է կանոն.

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

Հիմա եկեք սկսենք այս ամբողջ հարստությունն ամրացնել ՊՄԳ ծառայությանը։ MikroTik-ը թույլ է տալիս օգտագործել սկրիպտներ պրոֆիլներում (ppp-profile) և վերագրել դրանք ppp կապի հաստատման և խզման իրադարձություններին: PPP-ի պրոֆիլի կարգավորումները կարող են կիրառվել PPP սերվերի վրա որպես ամբողջություն կամ առանձին օգտվողների համար: Միևնույն ժամանակ, օգտատիրոջը հատկացված պրոֆիլն ունի առաջնահերթություն՝ վերացնելով ամբողջ սերվերի համար ընտրված պրոֆիլի պարամետրերը՝ իր նշված պարամետրերով:

Այս մոտեցման արդյունքում մենք կարող ենք ստեղծել հատուկ պրոֆիլ երկգործոն նույնականացման համար և այն վերագրել ոչ բոլոր օգտատերերին, այլ միայն նրանց, ովքեր անհրաժեշտ են համարում դա անել։ Սա կարող է տեղին լինել, եթե դուք օգտագործում եք PPP ծառայությունները ոչ միայն վերջնական օգտագործողներին միացնելու, այլև միևնույն ժամանակ կայք-կայք կապեր ստեղծելու համար:

Նորաստեղծ հատուկ պրոֆիլում մենք օգտագործում ենք կապակցված օգտվողի հասցեի և ինտերֆեյսի դինամիկ հավելումը հասցեների և ինտերֆեյսների «մոխրագույն» ցուցակներին.

winbox
VPN օգտագործողների երկու գործոն նույնականացում MikroTik-ի և SMS-ի միջոցով

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

Անհրաժեշտ է օգտագործել ինչպես «հասցեների ցուցակը», այնպես էլ «ինտերֆեյսի ցուցակը»՝ dstnat (նախաուղղման) շղթայում ոչ երկրորդական VPN-հաճախորդներից տրաֆիկը հայտնաբերելու և գրավելու համար:

Երբ նախապատրաստումն ավարտվի, լրացուցիչ firewall շղթաներ և պրոֆիլ ստեղծվեն, մենք կգրենք սկրիպտ, որը պատասխանատու է 2FA կոդի ավտոմատ ստեղծման և առանձին firewall կանոնների համար:

Փաստաթղթեր wiki.mikrotik.com PPP-Profile-ում մեզ հարստացնում է PPP հաճախորդի միացման-անջատման իրադարձությունների հետ կապված փոփոխականների մասին տեղեկություններով «Գործարկել սկրիպտը օգտվողի մուտքի իրադարձության վրա: Սրանք հասանելի փոփոխականներ են, որոնք հասանելի են իրադարձության սկրիպտի համար՝ օգտատեր, տեղային հասցե, հեռավոր հասցե, զանգահարողի ID, կանչված ID, միջերես»:. Նրանցից ոմանք շատ օգտակար են մեզ համար:

ՊՄԳ միացման իրադարձության պրոֆիլում օգտագործվող կոդը

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

Հատկապես նրանց համար, ովքեր սիրում են անիմաստ copy-paste անել, զգուշացնում եմ՝ կոդը վերցված է թեստային տարբերակից և կարող է պարունակել չնչին տառասխալներ։ Հասկացող մարդու համար դժվար չի լինի հստակ հասկանալ, թե որտեղ:

Երբ օգտատերը անջատվում է, ստեղծվում է «On-Down» իրադարձություն և կանչվում է պարամետրերով համապատասխան սկրիպտը: Այս սցենարի նպատակն է մաքրել անջատված օգտվողի համար ստեղծված firewall-ի կանոնները:

Կոդ, որն օգտագործվում է պրոֆիլում 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]
Այնուհետև կարող եք ստեղծել օգտվողներ և նրանց բոլորին կամ մի քանիսին վերագրել երկու գործոնով իսկորոշման պրոֆիլին:

winbox
VPN օգտագործողների երկու գործոն նույնականացում MikroTik-ի և SMS-ի միջոցով

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

Ինչպես է այն նայում հաճախորդի կողմից:

Երբ VPN կապ է հաստատվում, SIM քարտով Android/iOS հեռախոսը/պլանշետը ստանում է հետևյալ SMS-ը.

SMS
VPN օգտագործողների երկու գործոն նույնականացում MikroTik-ի և SMS-ի միջոցով

Եթե ​​կապը հաստատվել է անմիջապես հեռախոսից / պլանշետից, ապա կարող եք անցնել 2FA-ով պարզապես սեղմելով հաղորդագրության հղմանը: Հարմարավետ է։

Եթե ​​VPN կապը հաստատված է համակարգչից, ապա օգտվողից կպահանջվի մուտքագրել նվազագույն գաղտնաբառի ձև: VPN-ը կարգավորելիս օգտվողին տրվում է փոքր ձև HTML ֆայլի տեսքով: Ֆայլը կարող է ուղարկվել նույնիսկ փոստով, որպեսզի օգտագործողը պահպանի այն և ստեղծի դյուրանցում հարմար վայրում։ Այն կարծես այսպիսին է.

Պիտակը սեղանի վրա
VPN օգտագործողների երկու գործոն նույնականացում MikroTik-ի և SMS-ի միջոցով

Օգտագործողը սեղմում է դյուրանցման վրա, բացվում է կոդի մուտքագրման պարզ ձև, որը կտեղադրի կոդը բացված URL-ում.

Էկրանի ձև
VPN օգտագործողների երկու գործոն նույնականացում MikroTik-ի և SMS-ի միջոցով

Որպես օրինակ բերված է ամենապրիմիտիվ ձևը. Ցանկացողները կարող են փոփոխել իրենց համար։

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>

Եթե ​​թույլտվությունը հաջող է եղել, օգտատերը բրաուզերում կտեսնի MikroTik լոգոն, որը պետք է ազդարարի հաջող նույնականացում.

VPN օգտագործողների երկու գործոն նույնականացում MikroTik-ի և SMS-ի միջոցով

Նկատի ունեցեք, որ պատկերը վերադարձվում է ներկառուցված MikroTik վեբ սերվերից՝ օգտագործելով WebProxy Deny Redirect:

Ենթադրում եմ, որ պատկերը կարող է հարմարեցվել «hotspot» գործիքի միջոցով՝ այնտեղ բեռնելով ձեր սեփական տարբերակը և դրան WebProxy-ով սահմանելով «Deny Redirect» URL-ը:

Մեծ խնդրանք նրանց, ովքեր փորձում են 20 դոլարով գնել ամենաէժան «խաղալիքը» Mikrotik-ը և դրանով փոխարինել 500 դոլարանոց երթուղիչը՝ մի արեք դա։ Նման սարքերը, ինչպիսիք են «hAP Lite» / «hAP mini» (տնային մուտքի կետ) ունեն շատ թույլ պրոցեսոր (smips), և հավանական է, որ նրանք չեն կարողանա հաղթահարել բիզնես հատվածի բեռը:

Warning: Այս լուծումն ունի մեկ թերություն. երբ հաճախորդները միանում կամ անջատվում են, տեղի են ունենում կազմաձևման փոփոխություններ, որոնք երթուղիչը փորձում է պահպանել իր ոչ անկայուն հիշողության մեջ: Հաճախորդների մեծ քանակի և հաճախակի միացումների և անջատումների դեպքում դա կարող է հանգեցնել երթուղիչի ներքին պահեստի դեգրադացիայի:

Հ.Գ. Հաճախորդին կոդը փոխանցելու մեթոդները կարող են ընդլայնվել և լրացվել այնքանով, որքանով ձեր ծրագրավորման հնարավորությունները բավարար են: Օրինակ, կարող եք հաղորդագրություններ ուղարկել telegram կամ ... առաջարկել տարբերակներ:

Հուսով եմ հոդվածը օգտակար կլինի ձեզ և կօգնի փոքր և միջին բիզնեսի ցանցերը մի փոքր ավելի անվտանգ դարձնել։

Source: www.habr.com