linux 容器中的 setcap cap_net_admin 阻止用户访问每个文件

setcap cap_net_admin in linux containers prevents user access to every file

我在 CentOS 容器中有一个 tcpdump 应用程序。我试图 运行 tcpdump 作为非 root。在这个论坛 post: https://askubuntu.com/questions/530920/tcpdump-permissions-problem(以及其他一些强化这一点的文档)之后,我尝试在容器中使用 setcap cap_net_admin+eip /path/to/tcpdump。

在 运行 之后,我尝试 运行 tcpdump 作为不同的用户(具有 tcpdump 的权限)并且我得到了 "Operation Not Permitted"。然后我尝试以 root 身份 运行 它,它以前一直在工作并且也得到了 "Operation Not Permitted"。在 运行ning getcap 之后,我验证了权限是否正确。我认为这可能是我的特定用例,所以我尝试 运行 对其他几个可执行文件使用 setcap 命令。每个可执行文件返回 "Operation Not Permitted" 直到我 运行 setcap -r /filepath.

关于如何解决这个问题,甚至在不使用 root 运行 tcpdump 的情况下解决这个问题的任何想法?

默认情况下,NET_ADMIN 功能不包含在容器中,因为它可能允许容器进程修改和逃避应用在容器上的任何网络隔离设置。因此,使用 setcap 在二进制文件上显式设置此权限将会失败,因为容器中的 root 和其他所有用户都被阻止使用该功能。要 运行 具有此功能的容器,您需要使用用于启动容器的命令将此功能添加到容器中。例如

docker run --cap-add NET_ADMIN ...

不过,我相信您只需要包含在默认功能中的 NET_RAW (setcap cap_net_raw)。来自 man capabilities:

   CAP_NET_RAW
          * Use RAW and PACKET sockets;
          * bind to any address for transparent proxying.