VPN դեմոնին պետք են արտոնյալ ցանցային գործողություններ, թեև սովորական ծրագրերը բացում են ելքային սոքեթներ առանց որևէ արտոնության։ Հենց այդ ճեղքից են սկսվում հնարավորությունների մասին սխալների մեծ մասը՝ ինչ-որ մեկը տեսնում է թույլտվության սխալ, տալիս է ամբողջ հավաքածուն, և ծառայությունն աշխատում է պատճառներով, որոնք հետո ոչ ոք չի կարող բացատրել։ Ստորև ներկայացված ուղեցույցը սկսվում է ձախողված գործողությունից, այն կապում է մեկ լիազորության հետ, ապա ստուգում է այն համատեքստը, որտեղ գործընթացն իրականում աշխատում է։ Չսահմանափակված root-ով աշխատելը որոշ տեղաբաշխումների համար վավեր պատասխան է, բայց այն պետք է լինի որոշում, ոչ թե լռելյայն արժեք։

Սկսեք ձախողված գործողությունից

Կարդացեք սխալը, նախքան ձեռնարկ կարդալը։ «Գործողությունը թույլատրված չէ» միջերեսի փոփոխության ժամանակ, սարքի հանգույցը բացելու մերժումը և ցածր պորտում bind-ի ձախողումը երեք տարբեր խնդիրներ են՝ երեք տարբեր թույլտվություններով։ Եթե գործընթացը մեկնարկում է և ձախողվում է միայն առաջին երթուղու փոփոխության ժամանակ, դա նաև նշանակում է, որ միջերեսի ստեղծումն արդեն հաջողվել է, ինչը զգալիորեն նեղացնում է պատասխանը։

Վերարտադրեք ձախողումը ծառայությունը կանգնեցված վիճակում, ապա գործարկեք այն առաջին պլանում նույն օգտատիրոջ ներքո, եթե իրականացումը թույլ է տալիս։ Ձեր տեսած սխալն ավելի լավ է, քան գուշակելու ենթակա գրանցամատյանի տողը, և այն հստակեցնում է տարբերությունը հնարավորության խնդրի և SELinux-ի կամ AppArmor-ի մերժման միջև։

Կապեք յուրաքանչյուր գործողություն մեկ լիազորության հետ

Աղյուսակը մեկնարկային քարտեզ է, ոչ թե իրականացման փաստաթղթի փոխարինող՝

OperationUsual authorityWatch for
Create or configure tun/tapCAP_NET_ADMIN in the relevant namespaceCreating the device and opening it are separate steps
Add routes, rules, firewall entriesCAP_NET_ADMINSame capability, different namespace than you think
Open /dev/net/tunDevice permissions, not a capabilityGroup membership or a udev rule may be enough
Raw socketsCAP_NET_RAWNeeded by some user-space tunnel implementations
Bind a port below 1024CAP_NET_BIND_SERVICEIrrelevant for most modern tunnel ports

Այդ աղյուսակի երկու տողերն են, որ մարդիկ շփոթում են։ /dev/net/tun-ը բացելը ֆայլի թույլտվության հարց է, իսկ միջուկին խնդրելը կարգավորել այն, ինչ բացել եք՝ հնարավորության հարց է։ CAP_NET_ADMIN տալը չի շտկում սարքի հանգույցը, որը ձեր ծառայության օգտատերը չի կարող կարդալ, իսկ հանգույցը շտկելը ձեզ երթուղու լիազորություն չի տալիս։ Ստուգեք երկուսն էլ, նախքան դրանցից որևէ մեկը փոխելը։

Միջուկի WireGuard-ը և օգտատիրոջ տարածության թունելային ծրագրերը նույնպես նույնական պահանջներ չունեն։ Միջուկի մոդուլի ուղին կարգավորում է գոյություն ունեցող միջերեսը netlink-ի միջոցով, մինչդեռ օգտատիրոջ տարածության իրականացմանը կարող է պետք լինել նաև սարքը և որոշ տրանսպորտների համար՝ հում սոքեթներ։

Կարդացեք համատեքստը՝ ծառայություն, կոնտեյներ թե shell

Հոսթի ցանցային անվանատարածքում գտնվող հնարավորությունը կարող է ազդել շատ ավելի լայն, քան նույն գործողությունը դիտավորյալ մեկուսացված կույտում։ Կոնտեյներների գործարկման միջավայրը սովորաբար սկսվում է կրճատված սահմանային հավաքածուով՝ NET_ADMIN-ը հոսթի ցանցը կիսող կոնտեյներին ավելացնելը շատ ավելի մեծ թույլտվություն է, քան սեփական ցանցային անվանատարածք ունեցող և հոսթի mount չունեցող կոնտեյներին ավելացնելը։

systemd-ի միավորների համար կարդացեք, թե ինչ է իրականում կիրառվում, ոչ թե այն, ինչ միավորի ֆայլը կարծես ասում է՝ systemctl show -p CapabilityBoundingSet -p AmbientCapabilities-ը հաղորդում է արդյունավետ արժեքները, որոնք կարող են սահմանված լինել ձեր մոռացած drop-in-ով։ Պահանջեք արդյունավետ արժեքը, երբեք՝ նախատեսվածը։ Ambient հնարավորությունները կարևոր են, քանի որ root չհանդիսացող ծառայությունը դրանց բացակայությամբ կորցնում է հնարավորությունները exec-ի ընթացքում։

Որպես հիմք վերցրեք փաթեթի կամ պատկերի աջակցվող կարգավորումը։ Չավելացնեք հում սոքեթի թույլտվություններ կամ արտոնյալ ռեժիմ միայն այն պատճառով, որ մեկ այլ ձեռնարկ դրանք թվարկել է այլ գործիքի համար, այդ տրամաբանությունը ոչինչ չի փոխանցում և խլում է ձեր վճարած մեկուսացումը։ Կասկածի դեպքում ոչինչ մի տվեք և կարդացեք իրականացման նշումները ձեզ անհրաժեշտ ճշգրիտ գործողության համար։

Ուշադրություն դարձրեք, թե ինչ է լինում արտոնությունների անկումից հետո

Շատ դեմոններ մեկնարկում են արտոնյալ, կարգավորում միջերեսը, ապա անցնում անարտոնյալ օգտատիրոջ և պահպանում թունելը։ Այդ պահից գործընթացը չի կարող ավելացնել երթուղի, վերաշարադրել firewall-ի կանոն կամ բացել նոր արտոնյալ սարք, ինչը նորմալ է այնքան ժամանակ, քանի դեռ վերամիացմանը հենց դա պետք չի լինում։ Հետագա ֆայլերի ընթերցումը և hook-երի կատարումը կարող են ձախողվել նույն պատճառով։

Փորձարկեք ամբողջ կյանքի ցիկլը, ոչ թե առաջին վայրկյանը՝ մեկնարկ, թարմացում կամ վերամիացում, և մաքրում կանգնեցնելիս։ Միջերեսի առաջին հաջող ստեղծումը չի ապացուցում, որ յուրաքանչյուր հետագա արտոնյալ գործողություն դեռ կաշխատի, և ձախողումը սովորաբար ի հայտ է գալիս ժամեր անց՝ արտադրության մեջ։

Այն իրականացումները, որոնք թունելը բաց են պահում օգտատիրոջ փոփոխության ընթացքում, սովորաբար դա զուգակցում են թունելը և բանալիները պահպանելու ընտրանքների հետ։ systemd-ի կողմում համարժեք հարցն այն է՝ արդյոք միավորի հնարավորությունների հավաքածուն վերապրում է ձեր կարգավորած օգտատիրոջ փոփոխությունը։

Գրանցեք թույլտվությունը և դրա պատճառը

Գրեք ճշգրիտ թույլտվությունը, այն գործողությունը, որը այն հնարավոր է դարձնում, և այն սխալը, որը այն ուղղել է։ Տեղաբաշխման նշումների մեկ տողը՝ «CAP_NET_ADMIN միավորի ցանցային անվանատարածքում, անհրաժեշտ է վերամիացումից հետո երթուղիների փոփոխությունների համար», բավական է, որպեսզի հաջորդ մարդը նորից չընդարձակի թույլտվությունը։

Ապա յուրաքանչյուր թարմացումից հետո նորից կարդացեք արդյունավետ հավաքածուն։ Մատակարարները հատկություններ են ավելացնում, պատկերները փոխում են լռելյայն արժեքները, և անցյալ տարի ավելորդ հնարավորությունը կարող է դառնալ կրող՝ առանց որևէ մեկի նկատելուն։

Առնչվող հոդվածներ