Mga Pahintulot sa File sa Linux

Kamusta kayong lahat. Aktibo na kaming pumasok sa trabaho at naghahanda na kami ng maraming makapangyarihang paglulunsad sa Enero. Sa iba pa, ang pagpapatala ay inihayag para sa isang bagong stream ng paboritong kurso ng lahat. "Linux Administrator". Bilang pag-asam sa paglulunsad, tradisyonal kaming nagbabahagi ng mga pagsasalin ng kapaki-pakinabang na materyal.

Mga Pahintulot sa File sa Linux

Nag-aalok ang mga pahintulot ng file ng isang ligtas na alternatibo sa mga SUID executable, ngunit maaaring mukhang medyo nakakalito sa simula.


Alam nating lahat na binaries TIMOG ay masamang desisyon mula sa isang punto ng seguridad. Sa kabutihang palad, kung ang iyong aplikasyon ay nangangailangan ng ilang limitadong mga pribilehiyo, mayroong isang mas mahusay na paraan na tinatawag mga pahintulot sa file.

Makakatipid ako sa iyo ng ilang oras kung gusto mong iwasang basahin ang artikulo sa itaas nang detalyado: Sa pangkalahatan, pinapayagan ng mga pahintulot ng file ang mga prosesong tumatakbo bilang ugat at samakatuwid ay pinapayagang gumawa ng isang bagay upang mapanatili ang ilang partikular na kakayahan, limitado listahang itokapag nag-alis sila ng mga pribilehiyo at pinapatakbo ng isang walang pribilehiyong user. Nangangahulugan ito na kung ang isang umaatake ay namamahala na ikompromiso ang isang proseso gamit ang isang buffer overflow o iba pang pagsasamantala, hindi nila magagawang samantalahin ang anumang bagay maliban sa ilang mga kaunting pribilehiyo na talagang kailangan ng proseso.

Ang mga pahintulot ay mahusay para sa mga serbisyo na karaniwang palaging tumatakbo bilang ugat, ngunit paano ang tungkol sa mga utility ng command line? Sa kabutihang palad, ito ay sinusuportahan din kung mayroon kang tamang mga utility na naka-install. Kung gumagamit ka ng Ubuntu, halimbawa ay kakailanganin mo ang package libcap2-bin. Kakailanganin mo ring magpatakbo ng isang non-archaic kernel (mula sa bersyon 2.6.24).

Ang mga function na ito ay nagpapahintulot sa mga pahintulot na maiugnay sa mga executable na file, katulad ng pagtatakda ng SUID bit, ngunit para lamang sa isang partikular na hanay ng mga pahintulot. Kagamitan setcap ginagamit upang magdagdag at mag-alis ng mga pahintulot mula sa isang file.

Ang unang hakbang ay piliin ang mga pahintulot na kailangan mo. Para sa kapakanan ng artikulong ito, ipinapalagay ko na mayroong isang network diagnostic tool na tinatawag tracewalk, na dapat ay magagamit mga hilaw na saksakan. Ito ay karaniwang nangangailangan ng application na tumakbo bilang root, ngunit kapag tinitingnan ang listahan permiso lang pala ang kailangan CAP_NET_RAW.

Ipagpalagay na ikaw ay nasa direktoryo kung saan matatagpuan ang binary tracewalk, maaari mong idagdag ang pahintulot na ito tulad nito:

sudo setcap cap_net_raw=eip tracewalk

Huwag pansinin ang suffix sa ngayon =eip para sa paglutas, pag-uusapan ko iyan sa loob ng ilang segundo. Tandaan na ang pangalan ng pahintulot ay nasa lowercase. Maaari mo na ngayong suriin kung na-configure mo nang tama ang mga pahintulot gamit ang:

setcap -v cap_new_raw=eip tracewalk

O maaari mong ilista ang lahat ng mga pahintulot na itinakda para sa isang naibigay na executable:

getcap tracewalk

Para sa sanggunian, maaari mo ring alisin ang lahat ng mga pahintulot mula sa executable gamit ang:

setcap -r tracewalk

Sa puntong ito, dapat mong patakbuhin ang executable bilang isang unprivileged user, at dapat itong gumana sa mga raw socket, ngunit wala itong anumang iba pang mga pribilehiyo na mayroon ang root user.

Kaya ano ang ibig sabihin ng kakaibang suffix na ito? =eip? Nangangailangan ito ng ilang pag-unawa sa uri ng mga pahintulot. Ang bawat proseso ay may tatlong set ng mga pahintulot βˆ’ mabisa, namamana at pinahihintulutan:

  • Epektibo Ang mga pahintulot ay ang mga tumutukoy kung ano talaga ang magagawa ng isang proseso. Halimbawa, hindi ito maaaring makitungo sa mga hilaw na socket kung CAP_NET_RAW ay wala sa epektibong hanay.
  • Available Ang mga pahintulot ay ang mga pinapayagang magkaroon ng isang proseso kung hihilingin nito ang mga ito gamit ang naaangkop na tawag. Pinipigilan nila ang isang proseso mula sa aktwal na paggawa ng anuman maliban kung ito ay partikular na isinulat upang humiling ng nasabing pahintulot. Nagbibigay-daan ito sa mga proseso na maisulat upang magdagdag ng mga kritikal na pahintulot sa epektibong hanay lamang para sa panahon kung kailan talagang kinakailangan ang mga ito.
  • Mamanahin ang mga pahintulot ay ang mga maaaring mamana sa naa-access na hanay ng proseso ng spawned child. Sa panahon ng operasyon fork() o clone() ang proseso ng bata ay palaging binibigyan ng kopya ng mga pahintulot ng proseso ng magulang dahil tumatakbo pa rin ito sa parehong executable sa puntong iyon. Ang isang inheritable set ay ginagamit kapag exec() (o katumbas) ay tinatawag upang palitan ang executable file ng isa pa. Sa puntong ito, ang available na hanay ng proseso ay tinatakpan ng inheritable set para makuha ang accessible na set na gagamitin para sa bagong proseso.

Kaya ang utility setcap nagbibigay-daan sa amin na idagdag ang mga pahintulot ng tatlong set na ito nang nakapag-iisa para sa isang naibigay na executable. Tandaan na ang kahulugan ng mga pangkat ay bahagyang naiiba para sa mga pahintulot ng file:

  • Magagamit Ang mga pahintulot ng file ay ang mga palaging available sa isang executable na file, kahit na wala ang mga ito sa proseso ng magulang na tumawag dito. Ang mga ito ay tinatawag na "sapilitang" permit.
  • Minana Ang mga pahintulot ng file ay tumutukoy sa isang karagdagang mask na maaari ding magamit upang alisin ang mga pahintulot mula sa hanay ng proseso ng pagtawag. Nalalapat ang mga ito bilang karagdagan sa minanang hanay ng proseso ng pagtawag, kaya namamana lang ang pahintulot kung mayroon ito sa parehong hanay.
  • Epektibo Ang mga pahintulot ng file ay talagang isang bit lamang, hindi isang set, at kung nakatakda, nangangahulugan ito na ang buong magagamit na hanay ay kinopya din sa mabisang hanay ng bagong proseso. Magagamit ito upang magdagdag ng mga pahintulot sa mga prosesong hindi partikular na isinulat upang hilingin ang mga ito. Dahil ito ay isang bit, kung itatakda mo ito para sa anumang pahintulot, dapat itong itakda para sa lahat ng mga pahintulot. Maaari mong isipin ito bilang isang legacy bit dahil ginagamit ito upang payagan ang mga pahintulot na magamit ng mga application na hindi sumusuporta sa kanila.

Kapag tinukoy ang mga pahintulot sa pamamagitan ng setcap tatlong letra e, i ΠΈ p sumangguni sa mabisa, namamana at naa-access set ayon sa pagkakabanggit. Kaya, ang naunang pagtutukoy:

sudo setcap cap_net_raw=eip tracewalk

...nagsasaad na ang resolusyon CAP_NET_RAW dapat idagdag sa available at inheritable set at dapat ding itakda ang effective bit. I-o-override nito ang anumang naunang itinakda na mga pahintulot sa file. Upang magtakda ng maraming pahintulot nang sabay-sabay, gumamit ng listahang pinaghihiwalay ng kuwit:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Gabay sa Pahintulot Tinatalakay ang lahat ng ito nang mas detalyado, ngunit sana ay na-demystified ng post na ito kung ano ang nangyayari nang kaunti. Mayroong ilang mga caveat at trick na natitira upang banggitin.

Una, ang mga kakayahan ng file ay hindi gumagana sa mga symlink - kailangan mong ilapat ang mga ito sa binary file mismo (ibig sabihin, ang target ng symlink).

Pangalawa, hindi sila gumagana sa mga na-interpret na script. Halimbawa, kung mayroon kang script ng Python na gusto mong bigyan ng pahintulot, dapat mong italaga ito sa mismong interpreter ng Python. Malinaw na ito ay isang potensyal na isyu sa seguridad dahil ang lahat ng mga script na isinagawa kasama ng interpreter na iyon ay magkakaroon ng tinukoy na pahintulot, bagama't ito ay mas mahusay pa rin kaysa gawin itong SUID. Ang pinakakaraniwang workaround ay tila magsulat ng isang hiwalay na executable sa C o katumbas na maaaring magsagawa ng mga kinakailangang operasyon at tawagan ito mula sa isang script. Ito ay katulad ng diskarte na ginamit ng Wireshark na gumagamit ng binary /usr/bin/dumpcap upang magsagawa ng mga privileged operations:

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

Pangatlo, hindi pinagana ang mga pahintulot ng file kung gumagamit ka ng environment variable LD_LIBRARY_PATH para sa malinaw na mga kadahilanang pangseguridad(1). Ang parehong naaangkop sa LD_PRELOAD, sa pagkakaalam ko.

1. Dahil malinaw na mapapalitan ng isang umaatake ang isa sa mga karaniwang aklatan at gamitin LD_LIBRARY_PATHupang pilitin ang library nito na tawagin bilang kagustuhan sa system, at samakatuwid ay magkaroon ng sarili nitong di-makatwirang code na naisakatuparan na may parehong mga pribilehiyo gaya ng application sa pagtawag.

Iyon lang. Higit pang mga detalye tungkol sa programa ng kurso ay matatagpuan sa webinar, na magaganap sa Enero 24.

Pinagmulan: www.habr.com

Magdagdag ng komento