Права на файловете в Linux

Здравейте на всички. Активно се включваме в работата и вече през януари подготвяме много мощни старта. Сред тях е обявен набор за нов поток на обичания курс «Администратор Linux». В навечерието на старта традиционно споделяме превод на полезен материал.

Права на файловете в Linux

Файловите разрешения предлагат безопасна алтернатива на изпълними файлове SUID, но на пръв поглед могат да изглеждат малко объркващи.


Всички знаем, че двоичните файлове SUID са са лошо решение от гледна точка на сигурността. За щастие, ако вашето приложение изисква ограничени привилегии, съществува по-ефективен начин, наречен файлови разрешения.

Ще ви спестя време, ако искате да избегнете подробното четене на статията по-горе: по същество, файловите разрешения позволяват на процесите, които се изпълняват от името на потребителя root и следователно имат право да правят каквото и да е, да запазват определени възможности, ограничени от този списък, когато свалят привилегиите и се изпълняват от непривилегирован потребител. Това означава, че ако злоумышленик успее да компрометира процеса чрез препълване на буфер или друга експлоатация, той няма да може да се възползва от нищо освен от определени минимални привилегии, които действително са необходими на процеса.

Разрешенията са идеални за услуги, които обикновено винаги се изпълняват от името на потребителя root, но какво да кажем за командни инструменти? За щастие, това също е поддържано при условие, че имате инсталирани правилните инструменти. Ако използвате Ubuntu, например, ще ви е необходим пакет libcap2-bin. Също така ще трябва да стартирате не архаично ядро (от версията 2.6.24).

Тези функции позволяват свързването на разрешения с изпълними файлове по подобие на настройката на бита SUID, но само за определен набор от разрешения. Инструментът setcap се използва за добавяне и премахване на разрешения от файла.

Първата стъпка е да изберете необходимите разрешения. За тази статия приемам, че съществува инструмент за диагностика на мрежата, наречен tracewalk, който трябва да може да използва необработени сокети. Обикновено за това е необходимо приложението да се изпълнява от името на потребителя root, но при прегледа списъка става ясно, че е нужно само разрешението CAP_NET_RAW.

Предполагайки, че се намирате в директорията, където е разположен двоичният файл tracewalk, можете да добавите това разрешение по следния начин:

sudo setcap cap_net_raw=eip tracewalk

Засега пренебрегнете суфиксa =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

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster