Failų leidimai „Linux“.

Sveiki visi. Aktyviai kimbame į darbus ir jau ruošiame daug galingų startų sausio mėnesį. Be kita ko, buvo paskelbta registracija į naują visų mėgstamų kursų srautą. "Linux administratorius". Laukdami pristatymo tradiciškai dalijamės naudingos medžiagos vertimais.

Failų leidimai „Linux“.

Failų leidimai yra saugi alternatyva SUID vykdomiesiems failams, tačiau iš pradžių gali atrodyti šiek tiek painu.


Visi žinome, kad dvejetainiai SUID yra blogas sprendimas saugumo požiūriu. Laimei, jei jūsų programai reikia tam tikrų ribotų privilegijų, yra efektyvesnis būdas failų leidimai.

Sutaupysiu šiek tiek laiko, jei nenorėsite išsamiai skaityti aukščiau esančio straipsnio: Iš esmės failų teisės leidžia procesus, kurie veikia kaip root ir todėl jiems leidžiama daryti ką nors, kad išlaikytų tam tikras galimybes, ribotas. šį sąrašąkai jie praranda privilegijas ir juos valdo neprivilegijuotas vartotojas. Tai reiškia, kad jei užpuolikas sugebės pažeisti procesą naudodamas buferio perpildymą ar kitą išnaudojimą, jis negalės pasinaudoti niekuo, išskyrus tam tikras minimalias privilegijas, kurių procesui iš tikrųjų reikia.

Leidimai puikiai tinka paslaugoms, kurios paprastai visada paleidžiamos kaip root, bet kaip dėl komandų eilutės paslaugų? Laimei, tai taip pat palaikoma, jei esate įdiegę tinkamas paslaugas. Pavyzdžiui, jei naudojate Ubuntu, jums reikės paketo libcap2-bin. Taip pat turėsite paleisti nearchajišką branduolį (iš versijos 2.6.24).

Šios funkcijos leidžia susieti teises su vykdomaisiais failais, panašiai kaip nustatant SUID bitą, bet tik tam tikram leidimų rinkiniui. Naudingumas setcap naudojamas leidimams pridėti ir pašalinti iš failo.

Pirmas žingsnis yra pasirinkti reikiamus leidimus. Dėl šio straipsnio darau prielaidą, kad yra tinklo diagnostikos įrankis tracewalk, kurį turėtų galėti naudoti neapdoroti lizdai. Paprastai tam reikia, kad programa būtų paleista kaip root, bet peržiūrint sąrašą pasirodo, kad reikia tik leidimo CAP_NET_RAW.

Darant prielaidą, kad esate kataloge, kuriame yra dvejetainis failas tracewalk, galite pridėti šį leidimą taip:

sudo setcap cap_net_raw=eip tracewalk

Kol kas nekreipkite dėmesio į galūnę =eip dėl sprendimo pakalbėsiu apie tai po kelių sekundžių. Atminkite, kad leidimo pavadinimas rašomas mažosiomis raidėmis. Dabar galite patikrinti, ar tinkamai sukonfigūravote leidimus naudodami:

setcap -v cap_new_raw=eip tracewalk

Arba galite išvardyti visus tam tikram vykdomajam failui nustatytus leidimus:

getcap tracewalk

Taip pat galite pašalinti visus vykdomojo failo leidimus naudodami:

setcap -r tracewalk

Šiuo metu turėtumėte turėti galimybę paleisti vykdomąjį failą kaip neprivilegijuotas vartotojas ir jis turėtų dirbti su neapdorotais lizdais, bet neturėti jokių kitų privilegijų, kurias turi pagrindinis vartotojas.

Taigi, ką reiškia ši keista priesaga? =eip? Tam reikia šiek tiek suprasti leidimų prigimtį. Kiekvienas procesas turi tris leidimų rinkinius − veiksmingas, paveldimas ir leistinas:

  • Veiksmingas Leidimai yra tie, kurie apibrėžia, ką procesas iš tikrųjų gali padaryti. Pavyzdžiui, jis negali susidoroti su neapdorotais lizdais, jei CAP_NET_RAW nėra efektyviame rinkinyje.
  • Yra leidimai yra tie, kuriuos procesui leidžiama turėti, jei jis jų prašo naudodamas atitinkamą iškvietimą. Jie neleidžia procesui iš tikrųjų nieko daryti, nebent tai buvo specialiai parašyta norint paprašyti leidimo. Tai leidžia rašyti procesus, kad prie galiojančio rinkinio būtų pridėti svarbūs leidimai tik tuo laikotarpiu, kai jų iš tikrųjų reikia.
  • Paveldima leidimai yra tie, kurie gali būti paveldimi pasiekiamame sukurto antrinio proceso rinkinyje. Operacijos metu fork() arba clone() antriniam procesui visada suteikiama pirminio proceso leidimų kopija, nes tuo metu jis vis dar vykdo tą patį vykdomąjį failą. Paveldimas rinkinys naudojamas, kai exec() (arba lygiavertis) yra iškviečiamas pakeisti vykdomąjį failą kitu. Šiuo metu galimą proceso rinkinį užmaskuoja paveldimas rinkinys, kad būtų gautas pasiekiamas rinkinys, kuris bus naudojamas naujam procesui.

Taigi naudingumas setcap leidžia mums atskirai pridėti šių trijų rinkinių leidimus tam tikram vykdomajam failui. Atminkite, kad grupių reikšmė failų leidimams interpretuojama šiek tiek kitaip:

  • Galima failo leidimai yra tie, kurie visada pasiekiami vykdomajam failui, net jei pirminis procesas, kuris jį iškvietė, jų neturėjo. Anksčiau jie buvo vadinami „priverstiniais“ leidimais.
  • Paveldėtas failo leidimai apibrėžia papildomą kaukę, kurią taip pat galima naudoti norint pašalinti leidimus iš skambinimo proceso rinkinio. Jie taikomi kartu su iškvietimo proceso paveldėtu rinkiniu, todėl leidimas paveldimas tik tuo atveju, jei jis yra abiejuose rinkiniuose.
  • Veiksmingas failo leidimai iš tikrųjų yra tik vienas bitas, o ne rinkinys, o jei nustatytas, tai reiškia, kad visas galimas rinkinys taip pat nukopijuojamas į naujo proceso efektyvų rinkinį. Tai gali būti naudojama norint pridėti leidimus procesams, kurie nebuvo specialiai parašyti jų prašymui. Kadangi tai yra vienas bitas, jei jį nustatote bet kokiam leidimui, jis turi būti nustatytas visiems leidimams. Galite galvoti apie tai kaip apie seną bitą, nes jis naudojamas leidimams leisti naudoti programoms, kurios jų nepalaiko.

Nurodant leidimus per setcap trys raidės e, i и p susieti su veiksmingas, paveldimas ir prieinamas rinkiniai atitinkamai. Taigi, ankstesnė specifikacija:

sudo setcap cap_net_raw=eip tracewalk

...nurodo, kad rezoliucija CAP_NET_RAW turi būti pridėtas prie turimų ir paveldimų rinkinių, taip pat turi būti nustatytas veiksmingas bitas. Tai nepaisys visų anksčiau nustatytų failo leidimų. Norėdami vienu metu nustatyti kelis leidimus, naudokite kableliais atskirtą sąrašą:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Leidimų vadovas visa tai aptariama išsamiau, bet tikimės, kad šis įrašas šiek tiek paaiškino, kas vyksta. Liko paminėti tik keletą įspėjimų ir gudrybių.

Pirma, failų galimybės neveikia su simbolinėmis nuorodomis – jas turite pritaikyti pačiam dvejetainiam failui (t. y. simbolinės nuorodos tikslui).

Antra, jie neveikia su interpretuotais scenarijais. Pavyzdžiui, jei turite Python scenarijų, kuriam norite priskirti leidimą, turite jį priskirti pačiam Python interpretatoriui. Akivaizdu, kad tai yra potenciali saugumo problema, nes tada visi su tuo interpretatoriumi vykdomi scenarijai turės nurodytą leidimą, nors tai vis tiek yra žymiai geriau nei padaryti jį SUID. Atrodo, kad labiausiai paplitęs sprendimas yra parašyti atskirą vykdomąjį failą C arba lygiaverčiu, kuris gali atlikti reikiamas operacijas ir iškviesti jį iš scenarijaus. Tai panašu į Wireshark naudojamą metodą, kuris naudoja dvejetainį kodą /usr/bin/dumpcap atlikti privilegijuotas operacijas:

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

Trečia, failų teisės išjungiamos, jei naudojate aplinkos kintamąjį LD_LIBRARY_PATH dėl akivaizdžių saugumo priežasčių(1). Tas pats pasakytina ir apie LD_PRELOAD, kiek aš žinau.

1. Kadangi užpuolikas akivaizdžiai gali pakeisti vieną iš standartinių bibliotekų ir naudoti LD_LIBRARY_PATHpriversti savo biblioteką iškviesti pirmenybę, o ne sisteminę, ir todėl turėti savo savavališką kodą, vykdomą su tomis pačiomis privilegijomis kaip ir skambinanti programa.

Tai viskas. Daugiau informacijos apie kursų programą rasite adresu webinaras, kuris vyks sausio 24 d.

Šaltinis: www.habr.com

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