Ֆայլերի թույլտվությունները Linux-ում

Բարեւ բոլորին. Մենք ակտիվորեն անցնում ենք աշխատանքի և արդեն պատրաստում ենք շատ հզոր մեկնարկներ հունվարին։ Ի թիվս այլոց, գրանցվել է բոլորի սիրելի դասընթացի նոր հոսքի համար: «Linux Administrator». Մեկնարկին ընդառաջ՝ մենք ավանդաբար կիսում ենք օգտակար նյութերի թարգմանությունները:

Ֆայլերի թույլտվությունները Linux-ում

Ֆայլի թույլտվություններն առաջարկում են անվտանգ այլընտրանք SUID գործարկվողներին, բայց սկզբում կարող է մի փոքր շփոթեցնող թվալ:


Մենք բոլորս գիտենք, որ երկուականները ՀԱՐԱՎ են վատ որոշում անվտանգության տեսանկյունից. Բարեբախտաբար, եթե ձեր դիմումը պահանջում է որոշ սահմանափակ արտոնություններ, կա ավելի արդյունավետ միջոց, որը կոչվում է ֆայլի թույլտվությունները.

Ես ձեզ որոշ ժամանակ կխնայեմ, եթե ցանկանում եք խուսափել վերը նշված հոդվածը մանրամասն կարդալուց: Ըստ էության, ֆայլի թույլտվությունները թույլ են տալիս գործընթացներ, որոնք աշխատում են որպես արմատ, և, հետևաբար, թույլատրվում է ինչ-որ բան անել որոշակի հնարավորություններ պահպանելու համար, սահմանափակ: այս ցանկըերբ նրանք հրաժարվում են արտոնություններից և ղեկավարվում են ոչ արտոնյալ օգտվողի կողմից: Սա նշանակում է, որ եթե հարձակվողին հաջողվի խախտել գործընթացը՝ օգտագործելով բուֆերային հոսք կամ այլ շահագործում, նա չի կարողանա օգտվել որևէ այլ բանից, բացի որոշակի նվազագույն արտոնություններից, որոնք իրականում անհրաժեշտ են գործընթացին:

Թույլտվությունները հիանալի են ծառայությունների համար, որոնք սովորաբար միշտ աշխատում են որպես արմատ, բայց ի՞նչ կասեք հրամանի տողի կոմունալ ծառայությունների մասին: Բարեբախտաբար, սա նույնպես աջակցվում է, եթե դուք տեղադրեք ճիշտ կոմունալ ծառայություններ: Եթե ​​դուք օգտագործում եք Ubuntu, ապա ձեզ, օրինակ, անհրաժեշտ կլինի փաթեթը libcap2-bin. Ձեզ անհրաժեշտ կլինի նաև գործարկել ոչ արխայիկ միջուկ (տարբերակից 2.6.24).

Այս գործառույթները թույլ են տալիս թույլտվությունները կապված լինել գործարկվող ֆայլերի հետ, ինչպես SUID բիթը սահմանելը, բայց միայն թույլտվությունների որոշակի փաթեթի համար: Կոմունալ setcap օգտագործվում է ֆայլից թույլտվություններ ավելացնելու և հեռացնելու համար:

Առաջին քայլը ձեզ անհրաժեշտ թույլտվությունների ընտրությունն է: Հանուն այս հոդվածի, ես ենթադրում եմ, որ կա ցանցի ախտորոշման գործիք, որը կոչվում է tracewalk, որը պետք է կարողանա օգտագործել հում վարդակներ. Սա սովորաբար պահանջում է, որ հավելվածը գործարկվի որպես արմատ, բայց դիտելիս ցուցակը պարզվում է, որ միայն թույլտվություն է պահանջվում CAP_NET_RAW.

Ենթադրելով, որ դուք գտնվում եք այն գրացուցակում, որտեղ գտնվում է երկուականը tracewalk, այս թույլտվությունը կարող եք ավելացնել այսպես.

sudo setcap cap_net_raw=eip tracewalk

Առայժմ անտեսեք վերջածանցը =eip լուծման համար մի քանի վայրկյանից կխոսեմ այդ մասին: Նկատի ունեցեք, որ թույլտվության անունը փոքրատառ է: Այժմ կարող եք ստուգել, ​​թե արդյոք ճիշտ եք կարգավորել թույլտվությունները հետևյալով.

setcap -v cap_new_raw=eip tracewalk

Կամ կարող եք թվարկել տվյալ գործարկվող նյութի համար սահմանված բոլոր թույլտվությունները.

getcap tracewalk

Հղման համար կարող եք նաև հեռացնել բոլոր թույլտվությունները գործարկվողից՝

setcap -r tracewalk

Այս պահին դուք պետք է կարողանաք գործարկել գործարկվողը որպես ոչ արտոնյալ օգտվող, և այն պետք է կարողանա աշխատել չմշակված վարդակների հետ, բայց չունենա որևէ այլ արտոնություն, որն ունի արմատային օգտվողը:

Այսպիսով, ի՞նչ է նշանակում այս տարօրինակ վերջածանցը: =eip? Սա պահանջում է թույլտվությունների բնույթի որոշակի պատկերացում: Յուրաքանչյուր գործընթաց ունի թույլտվությունների երեք հավաքածու − արդյունավետ, ժառանգական և թույլատրելի:

  • Արդյունավետ Թույլտվություններն այն են, որոնք սահմանում են, թե ինչ կարող է իրականում անել գործընթացը: Օրինակ, այն չի կարող գործ ունենալ հումքի վարդակների հետ, եթե CAP_NET_RAW արդյունավետ հավաքածուի մեջ չէ:
  • Հասանելի է Թույլտվություններն այն թույլտվություններն են, որոնք թույլատրվում է ունենալ գործընթացին, եթե այն պահանջի, օգտագործելով համապատասխան զանգը: Նրանք թույլ չեն տալիս գործընթացին իրականում որևէ բան անել, եթե այն հատուկ գրված չէ նշված թույլտվությունը խնդրելու համար: Սա թույլ է տալիս գործընթացներ գրել՝ արդյունավետ փաթեթին կարևոր թույլտվություններ ավելացնելու համար միայն այն ժամանակահատվածի համար, երբ դրանք իրականում պահանջվում են:
  • Ժառանգական թույլտվություններն այն թույլտվություններն են, որոնք կարող են ժառանգվել ծնված երեխայի գործընթացի հասանելի փաթեթում: Վիրահատության ժամանակ fork() կամ clone() երեխայի գործընթացին միշտ տրվում է մայր գործընթացի թույլտվությունների պատճենը, քանի որ այն դեռ աշխատում է նույն գործարկվող սարքում այդ պահին: Ժառանգական հավաքածուն օգտագործվում է, երբ exec() (կամ համարժեք) կոչվում է գործարկվող ֆայլը մեկ այլով փոխարինելու համար: Այս պահին գործընթացի հասանելի հավաքածուն քողարկվում է ժառանգական բազմությամբ՝ ձեռք բերելու հասանելի հավաքածուն, որը կօգտագործվի նոր գործընթացի համար:

Այսպիսով, օգտակարությունը setcap թույլ է տալիս մեզ ինքնուրույն ավելացնել այս երեք հավաքածուների թույլտվությունները տվյալ գործարկվող նյութի համար: Նկատի ունեցեք, որ խմբերի իմաստը մի փոքր այլ կերպ է մեկնաբանվում ֆայլի թույլտվությունների համար.

  • Առկա է ֆայլի թույլտվություններն այն թույլտվություններն են, որոնք միշտ հասանելի են գործարկվող ֆայլին, նույնիսկ եթե այն կանչող մայր պրոցեսը չուներ դրանք: Դրանք նախկինում կոչվում էին «պարտադիր» թույլտվություններ։
  • Ժառանգված ֆայլի թույլտվությունները սահմանում են լրացուցիչ դիմակ, որը կարող է օգտագործվել նաև զանգի գործընթացի հավաքածուից թույլտվությունները հեռացնելու համար: Դրանք կիրառվում են ի լրումն զանգի գործընթացի ժառանգված հավաքածուի, ուստի թույլտվությունը ժառանգվում է միայն այն դեպքում, եթե այն գոյություն ունի երկու խմբերում էլ:
  • Արդյունավետ ֆայլի թույլտվությունները իրականում ընդամենը մեկ բիթ են, ոչ թե մի շարք, և եթե սահմանված են, նշանակում է, որ ողջ հասանելի հավաքածուն նույնպես պատճենվում է նոր գործընթացի արդյունավետ հավաքածուի մեջ: Սա կարող է օգտագործվել թույլտվություններ ավելացնելու համար այն գործընթացներին, որոնք հատուկ գրված չեն դրանք պահանջելու համար: Քանի որ այն մեկ բիթ է, եթե այն սահմանել եք որևէ թույլտվության համար, այն պետք է սահմանվի բոլոր թույլտվությունների համար: Դուք կարող եք դա համարել որպես ժառանգական բիթ, քանի որ այն օգտագործվում է թույլտվությունները թույլ տալու համար, որոնք չեն աջակցում դրանք:

միջոցով թույլտվությունները նշելիս setcap երեք տառ e, i и p վերաբերում են արդյունավետ, ժառանգական և հասանելի սահմանում է համապատասխանաբար: Այսպիսով, ավելի վաղ հստակեցում.

sudo setcap cap_net_raw=eip tracewalk

... ցույց է տալիս, որ բանաձեւը CAP_NET_RAW պետք է ավելացվի հասանելի և ժառանգվող բազմություններին, և որ արդյունավետ բիթը նույնպես պետք է սահմանվի: Սա կվերացնի ֆայլի վրա նախկինում սահմանված ցանկացած թույլտվություն: Միանգամից մի քանի թույլտվություններ սահմանելու համար օգտագործեք ստորակետերով բաժանված ցուցակ.

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Թույլտվությունների ուղեցույց քննարկում է այս ամենն ավելի մանրամասն, բայց հուսով ենք, որ այս գրառումը մի փոքր ապակողմնորոշել է այն, ինչ կատարվում է: Մնում է նշել միայն մի քանի նախազգուշացումներ և հնարքներ:

Նախ, ֆայլի հնարավորությունները չեն աշխատում սիմհղումների հետ, դուք պետք է դրանք կիրառեք հենց երկուական ֆայլի վրա (այսինքն՝ սիմհղման թիրախը):

Երկրորդ, նրանք չեն աշխատում մեկնաբանված սցենարներով։ Օրինակ, եթե ունեք Python սկրիպտ, որին ցանկանում եք թույլտվություն տալ, դուք պետք է այն վերագրեք հենց Python թարգմանչին։ Ակնհայտ է, որ սա պոտենցիալ անվտանգության խնդիր է, քանի որ այդ դեպքում այդ թարգմանիչով կատարված բոլոր սկրիպտները կունենան նշված թույլտվությունը, թեև դա դեռ զգալիորեն ավելի լավ է, քան այն SUID դարձնելը: Ամենատարածված լուծումը, թվում է, C-ով կամ համարժեքով առանձին գործարկիչ գրելն է, որը կարող է կատարել անհրաժեշտ գործողությունները և զանգահարել այն սկրիպտից: Սա նման է Wireshark-ի կողմից օգտագործվող մոտեցմանը, որն օգտագործում է երկուական /usr/bin/dumpcap արտոնյալ գործողություններ իրականացնելու համար.

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Երրորդ, ֆայլի թույլտվությունները անջատված են, եթե դուք օգտագործում եք շրջակա միջավայրի փոփոխական LD_LIBRARY_PATH ակնհայտ անվտանգության նկատառումներով(1). Նույնը վերաբերում է LD_PRELOAD, որքան գիտեմ։

1. Քանի որ հարձակվողը կարող է ակնհայտորեն փոխարինել ստանդարտ գրադարաններից մեկը և օգտագործել LD_LIBRARY_PATHստիպել, որ իր գրադարանը կանչվի համակարգայինից նախընտրելի, և, հետևաբար, ունենա իր կամայական ծածկագիրը՝ նույն արտոնություններով, ինչ կանչող հավելվածը:

Այսքանը: Դասընթացի ծրագրի մասին լրացուցիչ մանրամասներ կարող եք գտնել այստեղ վեբինար, որը տեղի կունենա հունվարի 24-ին։

Source: www.habr.com

Добавить комментарий