Файлавыя дазволы ў Linux

Ўсім прывітанне. Мы актыўна ўліваемся ў работу і ўжо ў студзені рыхтуем шмат магутных запускаў. Сярод іншых, абвешчаны набор на новы струмень упадабанага ўсім курсу "Адміністратар Linux". У перадпачатку запуску традыцыйна дзелімся перакладам карыснага матэрыялу.

Файлавыя дазволы ў Linux

Файлавыя дазволы прапануюць бяспечную альтэрнатыву выкананым файлам SUID, але могуць здацца трохі заблытанымі на першы погляд.


Усе мы ведаем, што двайковыя файлы СУІД з'яўляюцца дрэнным рашэннем з пункту гледжання бяспекі. На шчасце, калі вашаму з дадаткам патрабуюцца некаторыя абмежаваныя прывілеі, існуе больш эфектыўны спосаб, названы файлавымі дазволамі.

Я зэканомлю вам час, калі вы жадаеце пазбегнуць падрабязнага чытання артыкула вышэй: у сутнасці, файлавыя дазволы дазваляюць працэсам, якія запускаюцца ад імя root-карыстача і, такім чынам, маюць права штосьці рабіць, захоўваць вызначаныя магчымасці, абмежаваныя. гэтым спісам, калі яны скідаюць прывілеі і запускаюцца непрывілеяваным карыстальнікам. Гэта азначае, што калі зламысніку атрымаецца скампраметаваць працэс з дапамогай перапаўнення буфера ці іншага эксплойта, ён не зможа скарыстацца нічым, акрамя вызначаных мінімальных прывілеяў, якія сапраўды патрэбныя працэсу.

Дазволы выдатна падыходзяць для сэрвісаў, якія звычайна заўсёды запускаюцца ад імя root-карыстача, але як наконт утыліт каманднага радка? На шчасце, гэта таксама падтрымліваецца пры ўмове, што ў вас устаноўлены правільныя ўтыліты. Калі вы карыстаецеся Ubuntu, вам, напрыклад, спатрэбіцца пакет libcap2-bin. Вам таксама трэба будзе запусціць ня архаічнае ядро ​​(пачынаючы з версіі 2.6.24).

Гэтыя функцыі дазваляюць звязваць дазволы з выкананымі файламі аналагічна наладзе біта SUID, але толькі для вызначанага набору дазволаў. Утыліта setcap выкарыстоўваецца для дадання і выдаленні дазволаў з файла.

Першы крок - абраць патрэбныя вам дазволы. Для гэтага артыкула я мяркую, што існуе прылада дыягностыкі сеткі, званы tracewalk, які павінен умець выкарыстоўваць неапрацаваныя сокеты. Звычайна для гэтага патрабуецца, каб праграма запускалася ад імя root-карыстача, але пры праглядзе спісу высвятляецца, што патрабуецца толькі дазвол CAP_NET_RAW.

Мяркуючы, што вы знаходзіцеся ў каталогу, дзе размешчаны двайковы файл tracewalk, вы можаце дадаць гэты дазвол наступным чынам:

sudo setcap cap_net_raw=eip tracewalk

Пакуль праігнаруйце суфікс =eip для дазволу, я раскажу пра гэта праз пару секунд. Звярніце ўвагу, што імя дазволу ў ніжнім рэгістры. Цяпер вы можаце праверыць, ці правільна вы наладзілі дазволы, з дапамогай:

setcap -v cap_new_raw=eip tracewalk

Ці вы можаце вывесці спіс усіх дазволаў, усталяваных для дадзенага выкананага файла:

getcap tracewalk

Для даведкі, вы таксама можаце выдаліць усе дазволы з выкананага файла з дапамогай:

setcap -r tracewalk

На гэтым этапе вы павінны мець магчымасць запускаць выкананы файл як непрывілеяваны карыстач, і ён павінен мець магчымасць працаваць з неапрацаванымі сокетамі, але не мець ніякіх іншых прывілеяў, якімі валодае root-карыстач.

Такім чынам, што азначае гэты дзіўны суфікс =eip? Тут спатрэбіцца доля разумення прыроды дазволаў. Кожны працэс мае тры наборы дазволаў. эфектыўныя, спадчынныя і даступныя (effective, inheritable і permitted):

  • Эфектыўныя (Effective) дазволы - гэта тыя, якія вызначаюць, што працэс можа на самой справе рабіць. Напрыклад, ён не можа мець справу з неапрацаванымі сокетамі, калі CAP_NET_RAW не знаходзіцца ў эфектыўным наборы.
  • Даступныя (Permitted) дазволы - гэта тыя, якія дазволена мець працэсу, калі ён запытвае іх з дапамогай адпаведнага выкліку. Яны не дазваляюць працэсу фактычна штосьці рабіць, калі толькі ён не быў спецыяльна напісаны для запыту названага дазволу. Гэта дазваляе пісаць працэсы для дадання асоба важных дазволаў у эфектыўны набор толькі на той перыяд, калі яны сапраўды патрабуюцца.
  • Успадкоўваныя (Inheritable) дазволы - гэта тыя, якія могуць быць атрыманы ў спадчыну ў даступным наборы спароджанага даччынага працэсу. Падчас аперацыі 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 студзеня.

Крыніца: habr.com

Дадаць каментар