如何使用setcap命令设置功能?

如何使用setcap命令设置功能?

我想设置 wpa_supplicant 和开放VPN以非root用户身份运行,就像推荐的设置一样线鲨。我找不到任何文档来说明 +eip此示例中的含义:

sudo setcap cap_net_raw,cap_net_admin,cap_dac_override+eip /usr/bin/dumpcap

答案1

Linux 中功能的工作方式记录在man 7 capabilities

流程能力在里面有效集反对哪个权限检查完成。文件功能期间使用执行程序调用(当您想要运行另一个程序1时发生)来计算进程的新功能集。

文件有两组功能,允许的可继承的有效位

流程具有三个功能集:有效的,允许的可继承的。还有一个边界集,它限制稍后可以将哪些功能添加到进程的继承集中,并影响在调用过程中如何计算功能执行程序。能力只能从边界集,未添加。

进程的权限检查是根据进程进行检查的”有效集。一个流程可以从以下方面提高其能力:允许的有效集(使用 卡盖特帽盖syscalls,推荐的API分别是cap_get_proc上限设置过程)。

可继承边界集和文件功能期间发挥作用执行程序系统调用。期间执行程序, 新的有效的允许的计算集合并且遗传边界集保持不变。该算法在手册页中描述capabilities

P'(permitted) = (P(inheritable) & F(inheritable)) |
                (F(permitted) & cap_bset)

P'(effective) = F(effective) ? P'(permitted) : 0

P'(inheritable) = P(inheritable)    [i.e., unchanged]

在哪里是旧的能力集,P'是之后设置的能力执行程序F是文件能力集。

如果一个能力同时存在于两个进程中'可继承的设置和文件的可继承的集合(交集/逻辑与),它被添加到允许集。文件允许集添加(联合/逻辑或)到它(如果它在边界集中)。

如果有效位在文件功能设置中,所有允许的能力提升至有效的执行程序

内核中的功能实际上是为线程设置的,但对于文件功能,这种区别通常仅在进程更改其自身功能时才相关。

在您的示例功能中cap_net_rawcap_net_admincap_dac_override被添加到遗传允许的集和有效的位已设置。当您的二进制文件被执行时,该进程将在有效的允许的集,如果它们不受边界集限制。

[1] 对于系统调用,所有功能和边界集都是从父进程复制的。 uid 的更改对于如何在中设置功能也有其自己的语义有效的允许的套。

答案2

设置文件的能力

sudo setcap 'cap_net_bind_service=ep' file_name

在一个文件上设置多个功能

sudo setcap 'cap_net_bind_service=ep cap_sys_admin=ep' file_name

从文件中删除所有功能

sudo setcap -r file_name

检查文件的功能

getcap file_name

可能的功能列表(有些功能非常有趣)

https://linux.die.net/man/7/capability

陷阱:设置功能实际上对脚本不起作用。如果您希望 Python 脚本正常工作,则需要设置 Python 可执行文件本身的功能。这并不理想。

笔记: setcap运行时始终会覆盖整个功能集。大多数时候,您会看到使用setcapwith+-语法的示例,我认为这是令人困惑的垃圾,并且不能像您期望的其他工具(如chmod.您不能setcap多次使用来添加不同的功能,它需要在单个命令中完成。

相关内容