В настоящее время нет простого способа сделать это, если вы обратитесь к справочной странице возможностей:
During an execve(2), the kernel calculates the new capabilities of the process
using the following algorithm:
P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & cap_bset)
P'(effective) = F(effective) ? P'(permitted) : 0
P'(inheritable) = P(inheritable) [i.e., unchanged]
where:
P denotes the value of a thread capability set before the execve(2)
P' denotes the value of a capability set after the execve(2)
F denotes a file capability set
cap_bset is the value of the capability bounding set
Если файл, который вы хотите выполнить, не имеет установленного бита fP или если его биты fI не установлены, ваш процесс не будет иметь разрешенных и, следовательно, эффективных возможностей.
Разрешение всей файловой системы и битов наследования было бы технически возможно, но это не имело бы большого смысла, поскольку сильно снизило бы безопасность системы (изменить: и, как вы упомянули, это не будет работать для новых исполняемых файлов).
Вы действительно можете дать пользователю некоторые возможности с помощью pam_cap, но вы не можете позволить ему выполнять какой-либо файл, который он только что скомпилировал с его помощью. Возможности предназначены для предоставления возможностей программам, а не пользователям, вы можете прочитать в Бумага Халлина:
Ключевым моментом является наблюдение, что привилегиями пользуются программы, а не люди. То есть все, что делается на компьютере, осуществляется через агентов — программы, и только если эти программы знают, что делать с привилегиями, им можно доверять.
См. также проект POSIX 1003.1e, определяющий возможности POSIX, стр. 310. :
Также нецелесообразно устанавливать для цепочки процессов (последовательности программ внутри одного процесса) набор возможностей, который остается фиксированным и активным на протяжении всего жизненного цикла этой цепочки. [...] Это применение принципа наименьших привилегий, и оно в равной степени относится как к пользователям, так и к процессам.
Кто-то попросил представить, что вы хотите сделать в качестве функции в этот список рассылки ядра Linux недавно (декабрь 2012 г.), и есть несколько очень интересных ответов. Некоторые люди утверждают, что удаление файловых возможностей в правилах наследования через exec
вызовет некоторые проблемы с безопасностью, и что возможности не предназначены для такой функции, хотя не дается никакого объяснения, какую проблему безопасности это вызовет:/
В настоящее время единственный способ сделать это — изменить способ наследования возможностей в ядре Linux (2 файла для изменения, я успешно протестировал его на ядре 3.7), но неясно, защищено ли это или нет, как указано выше.
В старых ядрах (до 2.6.33) была возможность компилировать без файловых возможностей (CONFIG_SECURITY_FILE_CAPABILITIES
), но я сомневаюсь, что работа с таким старым ядром подойдет вам.
person
Étienne
schedule
07.05.2013