--cap-add=NET_ADMIN和在.yml中添加能力的区别

9 人关注

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

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

2 个评论
"不工作 "是什么意思? 通常情况下,Docker和Kubernetes都会为你管理网络环境,需要这种能力是非常不寻常的;这表明该工具在非Docker环境中运行可能更好。
你有没有可能找到这个原因呢?
linux
docker
kubernetes
kubectl
Julie
Julie
发布于 2019-10-14
1 个回答
Mark
Mark
发布于 2019-10-15
已采纳
0 人赞同

如描述的那样 大卫-马泽 并根据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中设置一些配置,允许容器几乎与主机上运行的外部容器的进程一样,对主机进行访问。

除了--特权,操作者还可以使用--cap-add和--cap-drop对能力进行细粒度控制。

你可以发现有两种能力。

  • Docker with default list of capabilities that are kept.
  • capabilities which are not granted by default and may be added.
  • 这个命令docker run --cap-add=NET_ADMIN将应用额外的Linux能力。

    按照文件规定。

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

    Note:

    为了减少系统调用攻击,好的做法是只给容器必要的权限。 也请参考启用Pod安全策略.

    从容器中,它可以通过使用来实现。

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

    要查看你的容器内的应用能力,你可以使用。 替换代码4】要列出并探索Linux的功能,你可以使用capsh --print

    Resources:

  • Linux capibilities,
  • docker labs,
  • capsh
  •