setcap 是否已弃用?

setcap 是否已弃用?

我正在使用非 root 身份启动网络服务器系统单元文件。

listen tcp :80: bind: permission denied即使我已经跑了,我还是得到了

setcap cap_net_bind_service=+ep

在可执行文件上。

在互联网上的一个示例单元文件中我发现

CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE

在单元文件中使用。所以我尝试了一下,突然应用程序可以绑定端口 80。

这告诉我什么?setcap是否已过时/已弃用/已被忽略?只有通过系统还是一般的Linux?

答案1

正确的说法是,一般来说,systemd 不会使用所管理的文件功能setcap,而是需要您将它们配置为服务单元的一部分。

所以它并不是setcap完全被弃用......(它可能在 systemd 启动的服务之外有有效的用途。)但它至少不适用于 systemd 服务。

事实上,文件功能(由 设定setcap)从一开始就一直是可疑的……它们需要使用“可继承”的功能,而这种功能的构思有些糟糕,并且有很多缺点……“环境”的内核功能引入功能是为了解决其中许多问题,这也是较新的系统正在采用的功能(此处包括 systemd,如您所见,您正在将AmbientCapabilities=服务设置为能够绑定到低端口。)

功能主题相当复杂......对于这个问题的更温和的介绍,您可能需要检查“继承能力”在LWN。有关完整的详细信息(包括功能集的一些代数符号),请参阅能力(7)手册页。

相关内容