Մատյանը համալրվում է, բայց հնարավոր չէ վերստեղծել՝ ստուգեք թղթապանակի ACL-ը
Ֆայլին ավելացնելը նոր անուն չի պահանջում նրա թղթապանակում, իսկ ստեղծելը՝ պահանջում է։ Նախքան որևէ բան ընդլայնելը համեմատեք մուտքի ACL-ը ժառանգված լռելյայն արժեքների հետ։
Մատյանը, որը շարունակ աճում է, դադարում է աճել այն պահին, երբ ինչ-որ բան վերստեղծում է այն, և սխալը հայտնում է, որ թույլտվությունը մերժված է։ Գրավիչ եզրակացությունն այն է, որ մատյանի ֆայլն ինքն է պահանջում ավելի շատ թույլտվություններ, սակայն ֆայլը կարող է արդեն գրելի լինել նույն հաշվի համար։ Գոյություն ունեցող անվանը ավելացնելը և նոր անուն ստեղծելը տարբեր ստուգումներ են, և միայն երկրորդն է դիմում թղթապանակին։
Ավելացնելը և ստեղծելը տարբեր ստուգումներ են
Գոյություն ունեցող ֆայլը ավելացման համար բացելը պահանջում է գրելու իրավունք այդ ֆայլի վրա և որոնման իրավունք նրա ուղու բոլոր թղթապանակներում։ Ֆայլ ստեղծելը պահանջում է գրելու և որոնման իրավունք այն պարունակող թղթապանակում, քանի որ գործողությունը նրան անուն է ավելացնում։ Ֆայլը վերանվանմամբ փոխարինելը շոշափում է երկու թղթապանակներն ու դրանց sticky-bit կանոնները ևս։
| Operation | What must permit it | Typical failure message |
|---|---|---|
| Append to an existing log | File write access, path traversal | Permission denied on the file |
| Create a missing log | Directory write and search access | Permission denied on the path |
| Rename a replacement into place | Both directories, plus sticky restrictions | Permission denied or operation not permitted |
Արդեն բաց դեսկրիպտորը ավելացնում է չորրորդ դեպքը։ Գործընթացը կարող է պահել գրելու բռնակ, որը բացվել էր մինչև արտոնություններից հրաժարվելը, և այնուամենայնիվ չկարողանալ վերաբացել նույն ուղին իր ավելի ուշ ինքնությամբ։ Հաջող ավելացումները և ձախողված ստեղծումը կարող են երկուսն էլ ճշմարիտ լինել՝ նույն պահին, նույն գործընթացի համար։
Լռելյայն ACL-ները ժառանգվում են, դրանք չեն շնորհում
Լռելյայն նախածանցով սկսվող գրառումը նկարագրում է, թե նոր օբյեկտներն ինչ են ժառանգում թղթապանակից։ Այն ոչինչ չի շնորհում հենց թղթապանակին և չի վերանորոգում արդեն գոյություն ունեցող ֆայլի ACL-ը։
namei -l /var/log/openvpn/server.log
getfacl -p /var/log/openvpn
getfacl -p /var/log/openvpn/server.log
Մուտքի գրառումները կարդացեք լռելյայններից առանձին, և կարդացեք դիմակը։ Անվանված գրառումը, որը թվարկում է լրիվ իրավունքներ, դեռ կարող է սահմանափակվել դիմակով, ինչի պատճառով effective մեկնաբանությունն ավելի կարևոր է, քան առաջին տողի տառերը։
Օգտագործեք լուծված ուղին, այլ ոչ թե կարգավորումների մեջ եղած ուղին։ Սիմլինկը, մոնտաժման կետը կամ պտտված թղթապանակը կարող են իրական ֆայլը դնել մի տեղ, ուր ձեր տված թույլտվությունը երբեք չի հասնում։ Նախ անցեք ուղին անվանման գործիքով, ապա համեմատեք յուրաքանչյուր մակարդակը տվյալ հաշվի հետ։ Վերին մակարդակի թղթապանակը գուշակելը հենց այն է, ինչից ուղղումը վայրէջք է կատարում մեկ մակարդակ ավելի բարձր։
Որոշեք, թե ով է գրում այդ պահին
Նախքան որևէ բան փոխելը ստուգեք ծառայության միավորը, նրա drop-in-ները և դեմոնի սեփական հաշվի կարգավորումները։ Ավելացնող գործընթացը և վերստեղծող գործընթացը կարող են տարբեր լինել՝ ռոտացիայի օգնականը, կարգավիճակ գրողը և վեբ ընթերցողը հազվադեպ են կիսում ինքնություն։
Root shell-ից կատարված փորձարկումը չի վերարտադրում սահմանափակ ծառայությունը, և այն կհաջողվի, մինչ ծառայությունը շարունակ ձախողվում է։ Վերարտադրեք ձախողված գործողությունը նույն միավորի ներքո, նույն հաշվով և նույն sandbox կարգավորումներով։ Եթե չեք կարող, գործարկեք միավորը ժամանակավոր shell-ով և ստուգեք, թե ինչ ինքնություն է այն հայտնում։ Մնացած ամեն ինչ չափում է ձեր տերմինալը, այլ ոչ ծառայությունը։
Եթե ստեղծումն իսկապես անհրաժեշտ է, տվեք գրողին մուտք դեպի հատուկ մատյանի թղթապանակը, իսկ սպառողների համար կարդալու մուտքը պահեք առանձին։ Ընդհանուր հաշիվը կամ ամբողջ հավելվածի ծառը գրելի դարձնելը՝ մեկ log-արձանագրության կանչը բավարարելու համար, փոքր խնդիրը փոխանակում է մեծի հետ։
Ռոտացրեք առանց խնդիրը վերադարձնելու
Նա, ով վերստեղծում է ֆայլը, որոշում է դրա սեփականատերն ու ռեժիմը հաջորդ ցիկլի համար, ուստի համաձայնեցրեք ուղղումը ռոտացիայի կարգավորումների հետ։ Այլ հաշվով կամ թարմ ACL-ով ստեղծված փոխարինողը հաջող ուղղումից հետո վերադարձնում է ձախողումը։
Սահմանեք ռեժիմն ու խումբը ստեղծման պահին, ոչ թե հետո, և ստուգեք հաջորդ ռոտացիան, այլ ոչ հաջորդ ավելացումը։ Ավելացումը միայն կրկնում է արդեն անցած փորձարկումը։ Եթե ռոտացիայի գործիքն առաջարկում է create-mode կարգավորում, օգտագործեք այն ստեղծումից հետո chmod-ի փոխարեն։ Ստեղծման և chmod-ի միջև ընկած բացը հենց այն պահն է, երբ հաջորդ գրառումը կարող է ձախողվել։
Երբ կտրելը միևնույն է ձախողվում է, դադարեք թույլտվություններ ավելացնել
Ֆայլի կտրման ձախողումը, որը դուք կարող եք գրել, չի բացատրվում թղթապանակի թույլտվություններով, և դրանք ավելացնելը չի օգնի։ Փոխարենը նայեք ատրիբուտներին և սահմանափակմանը՝ append-only ատրիբուտը թույլ է տալիս գրել միայն ավելացման ռեժիմում, իսկ միայն կարդալու մոնտաժը կամ ծառայության sandbox-ը կարող են մերժել գործողություն, որը ACL-ը թույլ է տալիս։
Ստուգեք միավորի ֆայլային համակարգի սահմանափակումները և ուղու մոնտաժման ընտրանքները, ապա վերարտադրեք հենց այն գործողությունը, որը ձախողվել է։ Երբեք չհարցված թույլտվությունն ընդլայնելը միայն թաքցնում է, թե որ սահմանափակումն էր իրական։ Մեկանգամյա միավորում հանեք մեկ սահմանափակում և վերադարձրեք այն նախքան որևէ մշտական փոփոխություն անելը։