在程序中,我通过扫描(符号)链接来枚举网络名称/proc/pid/
空间ns/net
。该程序在主机本身的“根”命名空间(原始 init)内运行。通常,我需要以 root 身份运行扫描仪部分,否则我对其他进程/proc/pid/
信息的访问权限将受到限制。如果可能的话,我想避免以 root 身份运行扫描仪,并且我想避免删除权限的麻烦。
我需要为我的扫描程序设置哪些 Linux 功能,以便它可以由非 root 用户运行,并且仍然可以看到完整的/proc/pid/
树并读取网络命名空间链接?
答案1
经过一番尝试和错误,我发现实际上CAP_SYS_PTRACE
是需要的。
相反,CAP_DAC_READ_SEARCH
不CAP_DAC_OVERRIDE
提供所需的访问权限,其中包括readlink()
和 类似的操作。
我所看到的情况可以相互印证:首先,ptrace.c给出了必要的线索__ptrace_may_access()
:
/* May we inspect the given task?
* This check is used both for attaching with ptrace
* and for allowing access to sensitive information in /proc.
*
* ptrace_attach denies several cases that /proc allows
* because setting up the necessary parent/child relationship
* or halting the specified task is impossible.
*/
其次是nsfs相关的函数,比如proc_ns_readlink()(间接)调用__ptrace_may_access()
.
最后,人7命名空间提到:
该子目录中的符号链接如下: [...] 取消引用或读取 (readlink(2)) 这些符号链接的权限由 ptrace 访问模式 PTRACE_MODE_READ_FSCREDS 检查控制;请参阅 ptrace(2)。
答案2
准确地说:进入网络命名空间需要CAP_SYS_PTRACE和CAP_SYS_ADMIN,这里是一个例子:
# docker run -it --rm --pid host --cap-add CAP_SYS_PTRACE --cap-add CAP_SYS_ADMIN debian:bullseye-slim bash
root@8b40f2f48808:/# nsenter --net=/proc/1/ns/net bash
也可以看看这个答案