现在我正在cap_net_bind_service MY_USERNAME
/etc/security/capability.conf中使用。
现在我只需要设置cap_net_bind_service+i
我最喜欢的脚本语言的解释器就可以添加CAP_NET_BIND_SERVICE
到有效的通过 libcap[-ng] 设置。
这工作得很好,但我想知道是否有一种方法可以实现同样的事情,而不需要为解释器二进制文件设置任何上限。虽然这不是一个大问题(其他用户帐户没有上限,因此即使在解释器二进制文件上设置了位,他们也无法使用它),但这有点烦人,因为每次解释器打开时我都必须重新设置标志更新。
答案1
通常,这些能力会遗传给孩子。如中所述联机帮助页:
通过 fork(2) 创建的子级继承其父级功能集的副本。
脚本的问题是它们不能直接执行。内核会执行一系列检查(内核代码位于 fs/binfmt_*.c)。其中一个是“binfmt_script.c”,它检查第一行是否有 shebang,然后使用脚本作为参数调用真正的解释器(shebang 中的解释器)。因此,标准/通用解释器被调用,并且只是将您的脚本作为参数读取。
这意味着您必须在解释器上设置该功能,而不是在脚本上。同样的事情也适用于suid
位和其他特殊标志。
因此,要么你复制你的解释器,设置你想要的功能(还要检查没有人可以通过 chmod/chown 访问它),然后在你的 shebang 中调用这个复制的解释器。您还可以在脚本中执行 setcap 逻辑。