Չկուտակեք systemd-ի կարծրացումը OpenVPN-ի user անկման վրա
Նվազագույն արտոնությունների երկու բաղադրատոմսերը միասին ավելի խիստ չեն դառնում։ Ընտրեք, թե ով է կատարում ինքնության փոխարկումը, ապա քարտեզագրեք լիազորությունը ողջ կյանքի ցիկլում։
Իրար կպցված նվազագույն արտոնությունների երկու բաղադրատոմսեր ավելի խիստ տեղակայում չեն ստեղծում։ Մեկ մոդելը թույլ է տալիս դեմոնին սկսել արտոնություններով և նախաձեռնումից հետո իջնել ոչ արտոնյալ հաշիվ. մյուսը թույլ է տալիս ծառայության կառավարչին այն գործարկել սահմանափակ ինքնությամբ արդեն առաջին հրահանգից։ Յուրաքանչյուրն աշխատում է ինքնուրույն, իսկ համակցությունը հաճախ ստեղծում է ծառայություն, որը չի կարող մաքուր կատարել երկու աշխատանքներից ոչ մեկը։ Մնացածը հերթով անցնում է որոշումը։
Երկու մոդել, փոխարկման մեկ տեր
Առաջին մոդելը դեմոնինն է։ Համայնքային OpenVPN-ի user և group ընտրանքները փոխում են ինքնությունը թունելն ու բանալիները տեղադրելուց հետո, իսկ persist-key հետ միասին persist-tun այդ ռեսուրսները պահում են հետագայում օգտագործելի։
Երկրորդ մոդելը ծառայության կառավարչինն է։ systemd-ի User= կամ Group= կարգավորումը որոշում է, թե ով ինքնությամբ է սկսվում գործընթացը, իսկ ունակությունների հրահանգները որոշում են, թե ինչ կարող է այն պահել։ Մոդելների միջև ընտրությունը փաթեթավորման հարց է նախքան անվտանգության հարց դառնալը, և փաթեթի սպասարկողն արդեն պատասխանել է դրան։ Ձեր խնդիրն է գտնել այդ պատասխանը, այլ ոչ թե հորինել երրորդ տարբերակ։
Երկուսն էլ օրինական են։ Սխալը դրանք մեկ նախագծի շերտեր համարելն է, որովհետև երկրորդ մոդելը կարող է առաջինի ինքնության փոխարկումը դարձնել գործողություն, որն այլևս արգելված է գործընթացին։
Որոշեք, թե որտեղ է փոխվում ինքնությունը
Եթե միավորը արդեն սկսվում է հատուկ հաշվով, ապա դեմոնին մեկ այլ հաշիվ դառնալու հրահանգը պահանջում է setuid անցում, որը կարծրացված ծառայությունը երբեք չպետք է աներ։ Ձախողումը հայտնվում է որպես թույլտվության սխալ սկզբում, այլ ոչ թե որպես քաղաքականության հստակ հաղորդագրություն։ Սա ընկալվում է որպես բացակայող ունակություն, ինչը մարդկանց ուղղորդում է դեպի ավելի լայն սահմանային հավաքածու, այլ ոչ թե ինքնության հարցին։
Նախքան որևէ բան խմբագրելը կարդացեք, թե տեղադրված փաթեթն իրականում ինչ է մատակարարում, ներառյալ նրա drop-in պանակը։ Որոշ միավորներ դիտմամբ բաց են թողնում դեմոնի սեփական անկումը, քանի որ կառավարիչն արդեն զբաղվում է դրանով, իսկ որոշները հենվում են այդ ընտրանքների վրա նախաձեռնումից հետո փոխարկման համար։ Դրանցից որևէ մեկը հեռացնելը առանց իմանալու, թե որ մոդելն եք ժառանգել, այն ճանապարհն է, որով աշխատող ծառայությունը դադարում է սկսվել։
Գրեք ընտրված մոդելը մեկ տողում. կառավարչին պատկանող կամ դեմոնին պատկանող։ Յուրաքանչյուր հետագա հրահանգ պետք է համապատասխանի այդ նախադասությանը, իսկ խառը միավորը պետք է համարել սխալ, ոչ թե փոխզիջում։
Ունակությունները սահմաններ են, ոչ շնորհներ
Ունակությունների սահմանային հավաքածուն ասում է, թե գործընթացը առավելագույնը ինչ կարող է պահել։ Դա առաստաղ է, և այնտեղ ունակություն թվարկելն ինքնին ոչինչ չի տալիս, դրա համար էլ առատ սահմանային հավաքածուով միավորը կարող է այնուամենայնիվ չկարողանալ թունել ստեղծել։
Այն, ինչ իրականում ունակությունը դնում է ծառայության շրջապատող հավաքածուի մեջ, AmbientCapabilities= է։ systemd-ի կատարման տեղեկատուն երկու հրահանգները փաստագրում է առանձին, և այդ տարբերությունը բացատրում է առցանց ունակությունների վերաբերյալ շփոթեցնող խորհուրդների մեծ մասը։
Ավելացրեք ունակություն միայն այն բանից հետո, երբ ձախողվող գործողությունը նույնականացնի այն։ Ավելի լայն սահմանային հավաքածուն թաքցնում է իրական պատճառը և ծառայությունը թողնում է ավելի արտոնյալ, քան նախագիծն էր նախատեսում։ Այն նաև դժվարացնում է միավորի վերանայումը, քանի որ առաստաղն այլևս չի նկարագրում աշխատանքը։ Հեռացրեք ավելորդ ունակությունը, երբ իրական խափանումը շտկվի։
Քարտեզագրեք լիազորությունը կյանքի ցիկլում
Թվարկեք, թե գործընթացն ինչ պետք է անի յուրաքանչյուր փուլում. սկիզբ, կայուն վիճակ, վերաուղղորդում և ապամոնտաժում։ Ինտերֆեյսի ստեղծումը, երթուղիների փոփոխությունները, պաշտպանված բանալու ընթերցումը և օգնականի կանչը բոլորը չեն լինում նույն պահին կամ նույն պահանջներով։ Դասավորեք ցանկը փուլով, նախքան այն ունակությամբ դասավորելը։
Մշտականության ընտրանքները պահպանում են ռեսուրսները վերաբանակցումների ընթացքում և չեն տալիս թույլտվություններ, որոնք երբեք չեն ունեցել։ Բանալին, որը գործընթացը չի կարող կարդալ սկզբում, անընթեռնելի կմնա նաև ավելի ուշ, ինչ էլ ասեն մշտականության դրոշները։ Դրոշները պահպանում են այն, ինչ արդեն աշխատում էր։
Օգտագործեք հատուկ հաշիվ, ոչ թե ընդհանուր։ OpenVPN-ի մշակողները զգուշացնում են nobody որպես ընդհանուր օրինակ օգտագործելու սովորությունից, որովհետև հոսթի այլ ծառայություններ կարող են արդեն աշխատել այդ հաշվով, և այն մեկուսացումը, որ դուք կարծում եք ունեք, այնտեղ չէ։
Տեղական ծանրաբեռնվածությունը փոխող հատկությունները, օրինակ տվյալների ալիքի բեռնաթափումը կամ այլ կերպ կապակցվող կառուցումը, կարող են տեղաշարժել, թե որ գործողություններն են անհրաժեշտ։ Վերանայեք քարտեզը, երբ փոխվում է փաթեթը, ոչ միայն երբ ինչ-որ բան կոտրվում է։
Գրեք պլանը և պահպանեք վերականգնման հասանելիությունը
Տեղակայման գրառումը պետք է նշի կառավարչին, սկզբնական ինքնությունը, նախատեսված կայուն ինքնությունը և յուրաքանչյուր շնորհ՝ դա պահանջող գործողության հետ միասին։ Հենց այդ գրառումն է հաջորդ փոփոխությունը դարձնում վերանայելի, այլ ոչ փորձարարական։
Խմբագրելիս հասանելի պահեք վահանակի մուտքը, որովհետև սկզբում ձախողվող միավորը դժվար է հեռվից վերանորոգել։ Փոփոխությունը ավարտված հայտարարելուց առաջ փորձարկեք վերագործարկում և ամբողջական վերագործարկում։ Վերագործարկումը հաղթահարած միավորը դեռ կարող է ձախողվել նախքան ցանցի բարձրանալը։
Հաջողությունը հասկացված նվազագույն լիազորության կյանքի ցիկլն է, ոչ թե գործընթաց, որ պատահաբար աշխատում է root-ից տարբեր անվան տակ։