当我在 docker 容器中运行命令时,我看到:
# ip netns exec 9ee961d90990 ifconfig
setting the network namespace "9ee961d90990" failed: Operation not permitted
我可以直接启动具有扩展功能的容器(我已经添加了该net_admin
容器),但是有什么方法可以检查运行此命令需要什么系统功能?
可以启动容器来--privileged
执行此操作并践踏与 docker 相关的所有安全性,但如果可能的话,我宁愿避免这样做。这样做确实可以使上述命令成功。
答案1
根据setns(2) 手册页您需要CAP_SYS_ADMIN
加入目标网络命名空间。但您可能需要额外的功能,因为setns()
与文件描述符一起使用/run/netns/...
。您没有告诉您如何创建此网络名称空间,因此我假设它是通过创建的ip netns add ...
,因此它是一个绑定安装的网络名称空间,指向nsfs
(命名空间文件系统)无论如何。
由于/run/netns/...
通常是根区域,因此您可能也需要CAP_DAC_OVERRIDE
或CAP_DAC_READ_SEARCH
,另请参阅功能(7) 手册页。也可能是CAP_SYS_PTRACE
因为对许多 inode 的访问/proc
进一步受到 ptrace 功能的限制。