首页 > 解决方案 > --cap-add=NET_ADMIN 和在 .yml 中添加功能之间的区别

问题描述

我有一个关于能力的问题。

为什么我的程序在我运行时工作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 有什么区别?

标签: linuxdockerkuberneteskubectl

解决方案


正如David Maze和根据 docker docs 所述:运行时特权和 Linux 功能

默认情况下,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 功能。

根据文档:

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

注意

为了减少系统调用攻击,最好只为容器提供所需的权限。另请参阅启用 Pod 安全策略

从容器可以通过使用来实现:

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

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

资源

希望这有帮助。


推荐阅读