Дозволе за датотеке у Линук-у

Здраво свима. Активно улазимо у посао и већ припремамо многа моћна лансирања у јануару. Између осталог, најављен је упис за нови стрим свима омиљених курсева. "Линук администратор". У ишчекивању лансирања, традиционално делимо преводе корисног материјала.

Дозволе за датотеке у Линук-у

Дозволе за датотеке нуде безбедну алтернативу извршним СУИД датотекама, али у почетку могу изгледати мало збуњујуће.


Сви знамо да бинарности СУИД су лоша одлука са безбедносне тачке гледишта. На срећу, ако ваша апликација захтева неке ограничене привилегије, постоји ефикаснији начин који се зове дозволе за фајлове.

Уштедећу вам мало времена ако желите да избегнете детаљно читање горњег чланка: У суштини, дозволе за фајл дозвољавају процесе који се покрећу као роот и стога им је дозвољено да ураде нешто да задрже одређене могућности, ограничене ову листукада одбаце привилегије и покреће их непривилеговани корисник. То значи да ако нападач успе да компромитује процес помоћу прекорачења бафера или другог експлоатације, неће моћи да искористи било шта осим одређених минималних привилегија које су процесу заиста потребне.

Дозволе су одличне за услуге које обично увек раде као роот, али шта је са услужним програмима командне линије? Срећом, ово је такође подржано под условом да имате инсталиране одговарајуће услужне програме. Ако користите Убунту, биће вам потребан пакет libcap2-bin. Такође ћете морати да покренете не-архаично језгро (од верзије 2.6.24).

Ове функције дозвољавају да се дозволе придруже извршним датотекама, слично постављању бита СУИД, али само за одређени скуп дозвола. Корисност 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

Водич за дозволе расправља о свему овоме детаљније, али надамо се да је овај пост мало демистификовао шта се дешава. Остало је само неколико упозорења и трикова за поменути.

Прво, могућности датотеке не функционишу са симболичким везама - морате их применити на саму бинарну датотеку (тј. циљ симболичне везе).

Друго, не раде са интерпретираним скриптама. На пример, ако имате Питхон скрипту којој желите да доделите дозволу, морате је доделити самом Питхон тумачу. Очигледно је ово потенцијални безбедносни проблем јер ће тада све скрипте које се извршавају са тим тумачем имати наведену дозволу, иако је то ипак знатно боље него да буде СУИД. Чини се да је најчешће заобилазно решење да се напише засебан извршни програм у Ц или еквивалент који може да изврши неопходне операције и да га позове из скрипте. Ово је слично приступу који користи Виресхарк који користи бинарни фајл /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. јануара.

Извор: ввв.хабр.цом

Додај коментар