我希望使系统可以使用,而不需要setuid
,文件“+ p”function,而且一般情况下,当我设置PR_SET_NO_NEW_PRIVS时没有禁用的东西。
通过这种方法( init
设置PR_SET_NO_NEW_PRIVS
和基于文件系统的能力提升不再可能),你不能“重新填充”你的能力,只需要注意不要“溅”它们。
如何执行一些其他进程而不“溅”任何授予的function(例如,如果新程序的文件是setcap =ei
)? 只是“我相信这个新的过程,因为我相信自己”。 例如,给用户一个能力(用户希望在他开始的任何程序中运用它)…
我可以使整个文件系统永久=ei
吗? 我想保持文件系统不干扰计划,不能授予或撤销能力; 通过父母 – 孩子的事物控制一切。
我并不是说我推荐你这样做,但是在这里。
从手册中提取出来,有一些变化。 据此: fork
不改变能力。 现在在Linux内核4.3中增加了一个环境集 ,看起来这是你正在做的事情。
Ambient (since Linux 4.3): This is a set of capabilities that are preserved across an execve(2) of a program that is not privileged. The ambient capability set obeys the invariant that no capability can ever be ambient if it is not both permitted and inheritable. The ambient capability set can be directly modified using prctl(2). Ambient capabilities are automatically lowered if either of the corresponding permitted or inheritable capabilities is lowered. Executing a program that changes UID or GID due to the set- user-ID or set-group-ID bits or executing a program that has any file capabilities set will clear the ambient set. Ambient capabilities are added to the permitted set and assigned to the effective set when execve(2) is called. A child created via fork(2) inherits copies of its parent's capability sets. See below for a discussion of the treatment of capabilities during execve(2). Transformation of capabilities during execve() During an execve(2), the kernel calculates the new capabilities of the process using the following algorithm: P'(ambient) = (file is privileged) ? 0 : P(ambient) P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & cap_bset) | P'(ambient) P'(effective) = F(effective) ? P'(permitted) : P'(ambient) P'(inheritable) = P(inheritable) [ie, unchanged] where: P denotes the value of a thread capability set before the execve(2) P' denotes the value of a thread capability set after the execve(2) F denotes a file capability set cap_bset is the value of the capability bounding set (described below). A privileged file is one that has capabilities or has the set-user-ID or set-group-ID bit set.
目前还没有简单的方法来做到这一点,如果你参考了能力的手册页:
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) [ie, 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给用户一些功能,但是你不能让他们执行任何他们刚刚编译的文件。 功能是为了给程序而不是给用户设计的,你可以阅读Hallyn的论文 :
一个关键的洞察是观察到程序而不是人们行使特权。 也就是说,在电脑上完成的所有事情都是通过代理程序进行的,只有当这些程序知道如何处理特权时,才可以信任它们。
另请参阅定义POSIX功能的POSIX草案 1003.1e,第310页:
建立一个过程链(一个过程中的一系列程序)也是不恰当的,这个过程链在整个生命周期中都保持固定和活跃。 […]这是最小权限原则的应用,它同样适用于用户和进程。
有人要求在最近的这个 Linux内核邮件列表中介绍你想做的功能,并给出了一些非常有意思的答案。 有些人认为,通过exec
删除文件功能的继承规则会引入一些安全问题,并且这些功能并不是针对这样的功能而设计的,尽管没有给出关于哪个安全问题的解释:
目前唯一的方法是修改Linux内核中的能力继承方式(2个文件需要修改,我已经在3.7内核上成功测试过了),但是不清楚上面提到的是否安全。
在旧内核(在2.6.33之前)有一个选项来编译没有文件的能力( CONFIG_SECURITY_FILE_CAPABILITIES
),但我怀疑这样一个旧的内核是一个选项。
我认为(我的理解),使用功能的最佳方式是:
chmod
set继承CAP_FOWNER,如果用户需要超级权力(通常由root用户拥有的权力),那么他们需要使用setpriv
(或等效的,这可以被卷成sudo
),否则它在非特权模式下工作。 环境的使用: