Dovoljenja za datoteke v Linuxu

Pozdravljeni vsi skupaj. Aktivno se lotevamo dela in že v januarju pripravljamo veliko močnih lansiranj. Med drugim je bil objavljen vpis v nov tok vsem priljubljenega tečaja. "Linux Administrator". V pričakovanju lansiranja že tradicionalno delimo prevode uporabnega gradiva.

Dovoljenja za datoteke v Linuxu

Dovoljenja za datoteke ponujajo varno alternativo izvršljivim datotekam SUID, vendar se lahko na začetku zdijo nekoliko zmedena.


Vsi vemo, da binarne datoteke Suid so z varnostnega vidika slaba odločitev. Na srečo, če vaša aplikacija zahteva nekatere omejene privilegije, obstaja učinkovitejši način dovoljenja za datoteke.

Prihranil vam bom nekaj časa, če se želite izogniti podrobnemu branju zgornjega članka: dovoljenja za datoteke v bistvu dovoljujejo procesom, ki se izvajajo kot root in jim je zato dovoljeno narediti nekaj, da obdržijo določene zmožnosti, omejene ta seznamko izgubijo privilegije in jih vodi neprivilegiran uporabnik. To pomeni, da če napadalcu uspe ogroziti proces s prekoračitvijo medpomnilnika ali drugim izkoriščanjem, ne bo mogel izkoristiti ničesar drugega kot določene minimalne privilegije, ki jih proces dejansko potrebuje.

Dovoljenja so odlična za storitve, ki se običajno vedno izvajajo kot root, kaj pa pripomočki ukazne vrstice? Na srečo je tudi to podprto, če imate nameščene ustrezne pripomočke. Če uporabljate Ubuntu, boste na primer potrebovali paket libcap2-bin. Zagnati boste morali tudi nearhaično jedro (od različice 2.6.24).

Te funkcije omogočajo povezovanje dovoljenj z izvedljivimi datotekami, podobno kot nastavitev bita SUID, vendar le za določen nabor dovoljenj. Pripomoček setcap uporablja se za dodajanje in odstranjevanje dovoljenj iz datoteke.

Prvi korak je, da izberete dovoljenja, ki jih potrebujete. Za namene tega članka predvidevam, da obstaja orodje za diagnostiko omrežja, imenovano tracewalk, ki naj bi ga znali uporabljati neobdelane vtičnice. To običajno zahteva, da se aplikacija izvaja kot root, vendar med ogledovanjem seznam izkaže se, da je potrebno samo dovoljenje CAP_NET_RAW.

Ob predpostavki, da ste v imeniku, kjer se nahaja dvojiška datoteka tracewalk, lahko to dovoljenje dodate takole:

sudo setcap cap_net_raw=eip tracewalk

Zaenkrat prezrite pripono =eip za rešitev, o tem bom govoril čez nekaj sekund. Upoštevajte, da je ime dovoljenja napisano z malimi črkami. Zdaj lahko preverite, ali ste pravilno konfigurirali dovoljenja z:

setcap -v cap_new_raw=eip tracewalk

Lahko pa navedete vsa dovoljenja, nastavljena za dano izvršljivo datoteko:

getcap tracewalk

Za referenco lahko tudi odstranite vsa dovoljenja iz izvršljive datoteke z:

setcap -r tracewalk

Na tej točki bi morali imeti možnost zagnati izvršljivo datoteko kot neprivilegirani uporabnik in mora imeti možnost dela z neobdelanimi vtičnicami, vendar ne sme imeti nobenih drugih pravic, ki jih ima korenski uporabnik.

Kaj torej pomeni ta čudna pripona? =eip? To zahteva nekaj razumevanja narave dovoljenj. Vsak proces ima tri nize dovoljenj − učinkovito, dedno in dovoljeno:

  • Učinkovito Dovoljenja so tista, ki določajo, kaj lahko proces dejansko počne. Na primer, ne more obravnavati neobdelanih vtičnic, če CAP_NET_RAW ni v efektivnem kompletu.
  • Na voljo dovoljenja so tista, ki jih sme imeti proces, če jih zahteva z ustreznim klicem. Preprečujejo procesu, da bi dejansko naredil kar koli, razen če je bilo posebej napisano, da zahteva omenjeno dovoljenje. To omogoča pisanje procesov za dodajanje kritičnih dovoljenj dejanskemu nizu samo za obdobje, ko so dejansko potrebna.
  • Dedno dovoljenja so tista, ki jih je mogoče podedovati v dostopnem nizu ustvarjenega podrejenega procesa. Med operacijo fork() ali clone() podrejeni proces vedno dobi kopijo dovoljenj nadrejenega procesa, saj na tej točki še vedno izvaja isto izvršljivo datoteko. Podedovani niz se uporablja, ko exec() (ali enakovreden) se pokliče za zamenjavo izvršljive datoteke z drugo. Na tej točki je razpoložljivi niz procesa zamaskiran s podedovanim nizom, da se pridobi dostopni niz, ki bo uporabljen za nov proces.

Torej uporabnost setcap nam omogoča dodajanje dovoljenj teh treh nizov neodvisno za dano izvršljivo datoteko. Upoštevajte, da se pomen skupin razlaga nekoliko drugače za dovoljenja datotek:

  • Na voljo dovoljenja za datoteke so tista, ki so vedno na voljo za izvršljivo datoteko, tudi če jih nadrejeni proces, ki jo je poklical, ni imel. Včasih so jim rekli "prisilna" dovoljenja.
  • Podedovano dovoljenja za datoteke določajo dodatno masko, ki jo je mogoče uporabiti tudi za odstranitev dovoljenj iz nabora klicnega procesa. Veljajo poleg podedovanega niza klicnega procesa, zato je dovoljenje podedovano le, če obstaja v obeh nizih.
  • Učinkovito dovoljenja za datoteke so pravzaprav samo en bit, ne nabor, in če so nastavljena, to pomeni, da je celoten razpoložljiv nabor tudi prekopiran v učinkovit nabor novega procesa. To lahko uporabite za dodajanje dovoljenj procesom, ki niso bili posebej napisani za njihovo zahtevo. Ker je en bit, mora biti nastavljen za vsa dovoljenja, če ga nastavite za katero koli dovoljenje. Lahko si ga predstavljate kot podedovani bit, ker se uporablja za omogočanje uporabe dovoljenj aplikacijam, ki jih ne podpirajo.

Pri določanju dovoljenj prek setcap tri črke e, i и p se nanašajo na učinkovit, podedljiv in dostopen nizov oz. Torej, prejšnja specifikacija:

sudo setcap cap_net_raw=eip tracewalk

... označuje, da je ločljivost CAP_NET_RAW je treba dodati razpoložljivim in dednim nizom in da mora biti nastavljen tudi efektivni bit. To bo preglasilo vsa predhodno nastavljena dovoljenja za datoteko. Če želite nastaviti več dovoljenj hkrati, uporabite seznam, ločen z vejicami:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Vodnik po dovoljenjih razpravlja o vsem tem podrobneje, a upajmo, da je ta objava nekoliko demistificirala dogajanje. Omeniti je treba le še nekaj opozoril in trikov.

Prvič, zmožnosti datoteke ne delujejo s simbolnimi povezavami – uporabiti jih morate za samo binarno datoteko (tj. cilj simbolne povezave).

Drugič, ne delujejo z interpretiranimi skripti. Na primer, če imate skript Python, ki mu želite dodeliti dovoljenje, ga morate dodeliti samemu tolmaču Python. Očitno je to potencialna varnostna težava, ker bodo potem vsi skripti, ki se izvajajo s tem tolmačem, imeli določeno dovoljenje, čeprav je to še vedno bistveno bolje, kot da bi bilo SUID. Zdi se, da je najpogostejša rešitev pisanje ločene izvedljive datoteke v C ali enakovrednem jeziku, ki lahko izvede potrebne operacije in jo pokliče iz skripta. To je podobno pristopu, ki ga uporablja Wireshark, ki uporablja binarno /usr/bin/dumpcap za izvajanje privilegiranih operacij:

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

Tretjič, dovoljenja za datoteke so onemogočena, če uporabljate spremenljivko okolja LD_LIBRARY_PATH iz očitnih varnostnih razlogov(1). Enako velja za LD_PRELOAD, kolikor vem.

1. Ker lahko napadalec očitno zamenja eno od standardnih knjižnic in uporabi LD_LIBRARY_PATHda prisili, da se njegova knjižnica kliče prednostno kot sistemska knjižnica, in ima zato svojo lastno poljubno kodo, ki se izvaja z enakimi privilegiji kot aplikacija, ki kliče.

To je vse. Več podrobnosti o programu tečaja najdete na webinarja, ki bo 24. januarja.

Vir: www.habr.com

Dodaj komentar