我想设置 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_raw
,cap_net_admin
和cap_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
运行时始终会覆盖整个功能集。大多数时候,您会看到使用setcap
with+
或-
语法的示例,我认为这是令人困惑的垃圾,并且不能像您期望的其他工具(如chmod
.您不能setcap
多次使用来添加不同的功能,它需要在单个命令中完成。