Ծառայությունը սկսվում է, մատյանը բողոքում է, որ չի կարող բացել tun սարքը, և երթուղիները երբեք չեն հայտնվում։ Գործարկեք capsh --print ձեր shell-ում և cap_net_admin հենց այնտեղ է, ինչը ձախողումը դարձնում է անհնար թվացող։ Ձեր shell-ի և միավորի միջև տարբերվում է արտոնությունների անցումը, ոչ թե միջուկի պատրաստակամությունը տալու հնարավորությունը։ Անցեք ներքևի չորս ստուգումները հերթականությամբ և կանգ առեք առաջինի վրա, որը բացատրում է բացը։

Առանձնացրեք բացակայող հնարավորությունը թաքնված սարքից

Երկու ձախողումներ մատյանի տողից նույնն են թվում։ Առանց CAP_NET_ADMIN գործընթացը չի կարող ստեղծել կամ կարգավորել թունելի ինտերֆեյսը, իսկ այն գործընթացը, որի sandbox-ը թաքցնում է /dev/net/tun-ը, ի սկզբանե չի կարող բացել այն։ Հնարավորություններ ավելացնելը չի շտկի երկրորդ դեպքը։

Նախքան որևէ բան խմբագրելը ստուգեք՝ արդյոք սարքը գոյություն ունի ծառայության անվանատարածքում։ PrivateDevices=yes տարածված կարծրացման տող է, որը լիովին հեռացնում է tun հանգույցը, և սահմանափակող ProtectSystem-ը կարող է կարգավորման ուղին դարձնել միայն-ընթերցվող այնպես, որ կարդացվում է որպես թույլտվության սխալ։ Երկուսն էլ ստեղծում են մատյանի տողեր, որոնք հիշատակում են թունելը, դրա համար էլ մեղադրում են հնարավորություններին։ Նախ հաստատեք, որ հանգույցը առկա է և բացվող, ապա անցեք առաջ։

Իմացեք, թե որ հնարավորությունների հավաքածուն եք նայում

Linux-ը պահում է թույլատրված, արդյունավետ, ժառանգվող, սահմանափակող և միջավայրային հավաքածուներ, և միջավայրային հավաքածուն է, որ վերապրում է ոչ root օգտվողի exec-ը։ Բինարի վրա ֆայլային հնարավորությունները exec-ի ժամանակ կարող են փոխանցել թույլատրված և արդյունավետ իրավունքներ, բայց միայն այնքան ժամանակ, քանի դեռ շղթայում ոչինչ չի արգելափակում այդ փոխանցումը։

Այստեղ է, որ sudo-ը մոլորեցնում է մարդկանց։ sudo -u-ով գործարկված հրամանը սկսում է արտոնությունների նոր անցում և միջավայրային հավաքածուն անհետանում է, ուստի root-ի պես հաջողվող նույն ստուգումը այնտեղ ձախողվում է։ Ծառայությունների կառավարիչը ևս մեկ այլ անցում է, և այն ոչինչ միջավայրային չի տալիս, եթե միավորը այդպես չի ասում։

Տվեք հնարավորությունը միավորում, ոչ թե փաթաթիչում

Նվազագույն ծառայության բաժինը թունելի համար, որը պետք է սարք ստեղծի և երթուղիներ տեղադրի, այսպիսի տեսք ունի։

[Unit]
Description=OpenVPN client, office profile
After=network-online.target

[Service]
Type=notify
User=openvpn
Group=openvpn
NoNewPrivileges=yes
AmbientCapabilities=CAP_NET_ADMIN
CapabilityBoundingSet=CAP_NET_ADMIN
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/office.conf

AmbientCapabilities-ը իրավունքը դնում է միջավայրային հավաքածուի մեջ մինչ գործընթացի մեկնարկը, իսկ CapabilityBoundingSet-ը թույլ չի տալիս գործընթացին այդ ցանկից դուրս որևէ բան պահել։ NoNewPrivileges=yes-ը արգելափակում է արտոնությունների ձեռքբերումը setuid-ի կամ ֆայլային հնարավորությունների միջոցով, մինչ միավորի բացահայտ տված հնարավորությունը դեռ գործում է։ Ավելացրեք CAP_NET_BIND_SERVICE-ը միայն այն դեպքում, երբ ծառայությունը պետք է կապի ցածր պորտ, և երբեք մի ավելացրեք CAP_SYS_ADMIN-ը միայն այն պատճառով, որ ֆորումի թեման այդպես արեց։

Եթե միավորը բինարը փաթաթում է sudo-ի մեջ, հեռացրեք փաթաթիչը։ systemd-ն արդեն կիրառում է User=-ը, և այդ լրացուցիչ շերտն է միջավայրային հավաքածուի դատարկ լինելու ամենահավանական պատճառը։

Ստուգեք կենդանի գործընթացի դեմ, ոչ թե միավորի ֆայլի

Կարդացեք, թե կառավարիչն ինչ է իրականում կիրառել, ապա կարդացեք այն գործընթացը, որը նա ստեղծել է։

unit=openvpn-client@office
systemctl show -p User -p AmbientCapabilities "$unit"
systemctl show -p MainPID --value "$unit" | xargs -r getpcaps
grep -E '^Cap(Eff|Amb)' /proc/$(systemctl show -p MainPID --value "$unit")/status

Եթե միավորը թվարկում է հնարավորությունը, և CapEff-ը դեռ չունի այն, ապա ինչ-որ drop-in վերագրում է կարգավորումը կամ ExecStartPre քայլը փոխում է միջավայրը։ Փնտրեք միավորի անունը drop-in պանակներում նախքան հիմնական ֆայլը հեղինակավոր համարելը, որովհետև ավելի ուշ ֆայլը լուռ հաղթում է։ Եթե և՛ միավորը, և՛ գործընթացը ցույց են տալիս հնարավորությունը, և թունելը դեռ ձախողվում է, վերադարձեք սարքի և ուղու ստուգումներին՝ սահմանափակող հավաքածուն լայնացնելու փոխարեն։ Այն լայնացնելը թաքցնում է իրական պատճառը և ծառայությունը թողնում է ավելի արտոնյալ, քան եղել է։

Նախընտրեք արտոնությունները թողնել մեկնարկից հետո

OpenVPN կարող է սկսվել արտոնյալ և ապա իր user և group ընտրանքներով իջնել ոչ արտոնյալ հաշվի, մինչ persist-key-ը և persist-tun-ը թունելը պահում են հետագայում օգտագործելի։ Այդ դասավորությունը նեղացնում է այն պատուհանը, որտեղ գործընթացն իրավունքներ ունի, և հաճախ ավելի հարմար է, քան ամբողջ դեմոնը ոչ արտոնյալ՝ մշտական հնարավորություններով սկսելը։

Ինչ մոդել էլ ընտրեք, վերագործարկեք միավորը և վերստուգեք վերագործարկումից հետո, որովհետև ինտերակտիվ root shell-ից աշխատող, բայց բեռնման ժամանակ ձախողվող ծառայությունը սովորաբար հնարավորության, սարքի կամ ֆայլի թույլտվության տարբերություն է։ Գրանցեք միավորի կարգավորումները գործընթացի հնարավորությունների ելքի կողքին, որպեսզի հաջորդ վերանայողը տեսնի՝ փաթեթի թարմացումը կամ drop-in-ը տեղափոխել է սահմանը։

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