Բարև գործընկերներ: Այսօր, երբ «հեռավոր աշխատանքի» շուրջ կրքերի ինտենսիվությունը մի փոքր հանդարտվեց, ադմինների մեծամասնությունը շահեց աշխատակիցների կորպորատիվ ցանցին հեռահար մուտք գործելու խնդիրը, ժամանակն է կիսվել VPN անվտանգության բարելավման իմ երկարամյա փորձով: Այս հոդվածը հիմա նորաձև չի լինի IPSec IKEv2 և xAuth: Խոսքը համակարգ կառուցելու մասին է:
Այսօր ես ձեզ կասեմ, թե ինչպես պաշտպանել MikroTik PPP-VPN-ն անգամ օգտատիրոջ հաշիվը «առևանգելու» դեպքում։ Երբ այս սխեման ներկայացվեց իմ հաճախորդներից մեկին, նա հակիրճ նկարագրեց այն այսպես.
Մեթոդը չի օգտագործում արտաքին վավերացման ծառայություններ: Առաջադրանքները ներքին կարգով կատարվում են հենց երթուղիչի կողմից: Միացնող հաճախորդի համար ծախսեր չկան: Մեթոդն աշխատում է ինչպես համակարգչի հաճախորդների, այնպես էլ շարժական սարքերի համար:
Պաշտպանության ընդհանուր սխեման հետևյալն է.
- VPN սերվերին հաջողությամբ միացած օգտատիրոջ ներքին IP հասցեն ավտոմատ կերպով հայտնվում է մոխրագույն ցուցակում:
- Կապի իրադարձությունը ավտոմատ կերպով ստեղծում է մեկանգամյա կոդ, որն ուղարկվում է օգտագործողին՝ օգտագործելով առկա մեթոդներից մեկը:
- Այս ցանկի հասցեները սահմանափակ հասանելիություն ունեն տեղական ցանցի ռեսուրսներին, բացառությամբ «authenticator» ծառայության, որը սպասում է մեկանգամյա գաղտնաբառ ստանալուն:
- Կոդը ներկայացնելուց հետո օգտագործողին հասանելի է ցանցի ներքին ռեսուրսները։
Առաջին Ամենափոքր խնդիրը, որին ես ստիպված էի հանդիպել, օգտատիրոջ մասին կոնտակտային տվյալները պահելն էր՝ նրան 2FA կոդը ուղարկելու համար: Քանի որ Mikrotik-ում օգտատերերին համապատասխան կամայական տվյալների դաշտեր ստեղծելն անհնար է, օգտագործվեց գոյություն ունեցող «մեկնաբանություն» դաշտը.
/ppp գաղտնիքները ավելացնել անունը=Պետրովի գաղտնաբառ=4M@ngr! մեկնաբանություն = "89876543210"
Երկրորդ խնդիրն ավելի լուրջ է ստացվել՝ կոդը փոխանցելու ուղու և եղանակի ընտրությունը։ Ներկայումս իրականացվում են երեք սխեմաներ. ա) SMS-ներ USB-մոդեմի միջոցով բ) էլ. փոստ գ) SMS էլեկտրոնային փոստով, որը հասանելի է կարմիր բջջային օպերատորի կորպորատիվ հաճախորդների համար:
Այո, SMS սխեմաները ծախսեր են բերում: Բայց եթե նայեք, «անվտանգությունը միշտ փողի հետ է կապված» (գ):
Ինձ անձամբ դուր չի գալիս էլեկտրոնային փոստով սխեման: Ոչ այն պատճառով, որ այն պահանջում է, որ փոստի սերվերը հասանելի լինի նույնականացվող հաճախորդի համար. խնդիր չէ տրաֆիկի բաժանումը: Այնուամենայնիվ, եթե հաճախորդն անզգուշորեն պահպանում է և՛ vpn, և՛ էլ.
Այսպիսով, որոշված է՝ մենք առաքում ենք մեկանգամյա կոդ՝ օգտագործելով SMS հաղորդագրություններ:
Երրորդը Խնդիրն այն էր, թե որտեղ ինչպես ստեղծել կեղծ պատահական կոդ 2FA-ի համար MikroTik-ում. RouterOS-ի սկրիպտավորման լեզվում պատահական() ֆունկցիայի անալոգը չկա, և ես նախկինում տեսել եմ մի քանի հենակային սցենար կեղծ-պատահական թվերի գեներատորներ: Նրանցից ոչ մեկն ինձ դուր չեկավ տարբեր պատճառներով։
Փաստորեն, MikroTik-ում կա կեղծ պատահական հաջորդականության գեներատոր: Այն թաքնված է մակերեսային հայացքից /certificates scep-server-ի համատեքստում: Առաջին ճանապարհը Միանգամյա գաղտնաբառ ստանալը հեշտ և պարզ է՝ հրամանով /վկայականներ scep-server otp առաջացնում. Եթե մենք կատարենք փոփոխականի նշանակման պարզ գործողություն, ապա կստանանք զանգվածի արժեք, որը հետագայում կարող է օգտագործվել սկրիպտներում։
Երկրորդ ճանապարհը միանգամյա գաղտնաբառի ձեռքբերում, որը նույնպես հեշտ է կիրառել՝ օգտագործելով արտաքին ծառայություն
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 վահանակում:
Չորրորդ խնդիրը որը պետք է արագ լուծվեր. ահա թե ինչպես և որտեղ միացված հաճախորդը կփոխանցի իր մեկանգամյա կոդը նույնականացման երկրորդ փուլում:
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
Ես կթվարկեմ կազմաձևման կարևոր տարրերը.
- ինտերֆեյս-ցուցակ «2fa» - հաճախորդի միջերեսների դինամիկ ցուցակ, որոնցից տրաֆիկը պահանջում է մշակում 2FA-ի շրջանակներում;
- հասցեների ցուցակ «2fa_jailed» - VPN հաճախորդների թունելային IP հասցեների «մոխրագույն» ցուցակ;
- address_list «2fa_approved» - VPN հաճախորդների թունելային IP հասցեների «սպիտակ» ցուցակ, որոնք հաջողությամբ անցել են երկգործոն նույնականացում:
- firewall շղթա «input_2fa» - այն ստուգում է tcp փաթեթները թույլտվության կոդի առկայության համար և համապատասխանեցնում է կոդը ուղարկողի IP հասցեն պահանջվողին: Շղթայում կանոնները ավելացվում և հեռացվում են դինամիկ կերպով:
Փաթեթների մշակման պարզեցված սխեմա ունի հետևյալ տեսքը.
«Գորշ» ցուցակից հաճախորդների կողմից տրաֆիկի 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 ծառայությունները ոչ միայն վերջնական օգտագործողներին միացնելու, այլև միևնույն ժամանակ կայք-կայք կապեր ստեղծելու համար:
Նորաստեղծ հատուկ պրոֆիլում մենք օգտագործում ենք կապակցված օգտվողի հասցեի և ինտերֆեյսի դինամիկ հավելումը հասցեների և ինտերֆեյսների «մոխրագույն» ցուցակներին.
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 կանոնների համար:
ՊՄԳ միացման իրադարձության պրոֆիլում օգտագործվող կոդը
#Логируем для отладки полученные переменные :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
Code
/ppp secrets set [find name=Petrov] profile=2FA
Ինչպես է այն նայում հաճախորդի կողմից:
Երբ VPN կապ է հաստատվում, SIM քարտով Android/iOS հեռախոսը/պլանշետը ստանում է հետևյալ SMS-ը.
SMS
Եթե կապը հաստատվել է անմիջապես հեռախոսից / պլանշետից, ապա կարող եք անցնել 2FA-ով պարզապես սեղմելով հաղորդագրության հղմանը: Հարմարավետ է։
Եթե VPN կապը հաստատված է համակարգչից, ապա օգտվողից կպահանջվի մուտքագրել նվազագույն գաղտնաբառի ձև: VPN-ը կարգավորելիս օգտվողին տրվում է փոքր ձև HTML ֆայլի տեսքով: Ֆայլը կարող է ուղարկվել նույնիսկ փոստով, որպեսզի օգտագործողը պահպանի այն և ստեղծի դյուրանցում հարմար վայրում։ Այն կարծես այսպիսին է.
Պիտակը սեղանի վրա
Օգտագործողը սեղմում է դյուրանցման վրա, բացվում է կոդի մուտքագրման պարզ ձև, որը կտեղադրի կոդը բացված URL-ում.
Էկրանի ձև
Որպես օրինակ բերված է ամենապրիմիտիվ ձևը. Ցանկացողները կարող են փոփոխել իրենց համար։
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 լոգոն, որը պետք է ազդարարի հաջող նույնականացում.
Նկատի ունեցեք, որ պատկերը վերադարձվում է ներկառուցված MikroTik վեբ սերվերից՝ օգտագործելով WebProxy Deny Redirect:
Ենթադրում եմ, որ պատկերը կարող է հարմարեցվել «hotspot» գործիքի միջոցով՝ այնտեղ բեռնելով ձեր սեփական տարբերակը և դրան WebProxy-ով սահմանելով «Deny Redirect» URL-ը:
Մեծ խնդրանք նրանց, ովքեր փորձում են 20 դոլարով գնել ամենաէժան «խաղալիքը» Mikrotik-ը և դրանով փոխարինել 500 դոլարանոց երթուղիչը՝ մի արեք դա։ Նման սարքերը, ինչպիսիք են «hAP Lite» / «hAP mini» (տնային մուտքի կետ) ունեն շատ թույլ պրոցեսոր (smips), և հավանական է, որ նրանք չեն կարողանա հաղթահարել բիզնես հատվածի բեռը:
Warning: Այս լուծումն ունի մեկ թերություն. երբ հաճախորդները միանում կամ անջատվում են, տեղի են ունենում կազմաձևման փոփոխություններ, որոնք երթուղիչը փորձում է պահպանել իր ոչ անկայուն հիշողության մեջ: Հաճախորդների մեծ քանակի և հաճախակի միացումների և անջատումների դեպքում դա կարող է հանգեցնել երթուղիչի ներքին պահեստի դեգրադացիայի:
Հ.Գ. Հաճախորդին կոդը փոխանցելու մեթոդները կարող են ընդլայնվել և լրացվել այնքանով, որքանով ձեր ծրագրավորման հնարավորությունները բավարար են: Օրինակ, կարող եք հաղորդագրություններ ուղարկել telegram կամ ... առաջարկել տարբերակներ:
Հուսով եմ հոդվածը օգտակար կլինի ձեզ և կօգնի փոքր և միջին բիզնեսի ցանցերը մի փոքր ավելի անվտանգ դարձնել։
Source: www.habr.com