--cap-add=NET_ADMIN与在.yml文件中添加权限的区别

12

我有一个关于权限的问题和问题。

为什么当我运行docker run --cap-add=NET_ADMIN ...时,我的程序能够正常工作?

但是如果我使用文件.yml运行我的程序,则无法正常工作,文件内容如下:

      containers:
      - name: snake
        image: docker.io/kelysa/snake:lastest
        imagePullPolicy: Always
        securityContext:
          privileged: true
          capabilities:
            add: ["NET_ADMIN","NET_RAW"]

使用--cap-add运行Docker和使用具有相同功能的Pod有什么区别?

“不起作用”是什么意思?通常情况下,Docker和Kubernetes都会为您管理网络环境,需要这种能力非常罕见;这表明该工具最好在非Docker环境中运行。 - David Maze
你可能找到了这个问题的原因吗? - Chris Stryczynski
1个回答

17

根据David Maze的描述和Docker的文档:Runtime privilege and Linux capabilities,默认情况下,Docker容器是“非特权”的,不能在Docker容器中运行Docker守护程序。这是因为默认情况下容器不允许访问任何设备,但是“特权”容器被授予访问所有设备的权限(请参阅cgroups设备的文档)。

--cap-add: Add Linux capabilities,
--cap-drop: Drop Linux capabilities,
--privileged=false: Give extended privileges to this container
--device=[]: Allows you to run devices inside the container without the --privileged flag.

当操作员执行 docker run --privileged 时,Docker 将启用对主机上所有设备的访问,并在 AppArmor 或 SELinux 中设置一些配置,以允许容器几乎获得与主机上运行在容器外的进程相同的访问权限。

除了--privileged之外,操作员可以使用--cap-add和--cap-drop对能力进行细粒度控制。

您可以在此处找到两种能力:

  • 具有默认保留列表的 Docker 能力。
  • 默认未授予并可能添加的功能。

此命令 docker run --cap-add=NET_ADMIN 将应用附加的 Linux 能力。

根据文档:

与网络堆栈交互时,应使用 --cap-add=NET_ADMIN 来修改网络接口,而不是使用 --privileged。

注意:

为了减少系统调用攻击,在容器中仅授予所需的特权是一个好的实践。请参考启用 Pod 安全策略

从容器中可以通过以下方式实现:

securityContext:
  capabilities:
    drop: ["all"]
    add: ["NET_BIND"]

要查看容器内应用的能力,您可以使用以下命令:getpcaps process_id or $(pgrep your-proces_name)来列出和探索Linux的能力,您可以使用capsh --print

资源:

希望这可以帮助到您。


13
这并没有突出这两者之间的差异。 - Chris Stryczynski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接