Docker-Compose:cap_drop 和 cap_add 的顺序应该是怎样的?

13
Docker Compose 文件参考 中对于 cap_addcap_drop 的说明较为简洁:

增加或删除容器的能力。请参阅 man 7 capabilities 获取完整列表。

这些元素有顺序吗?比如先添加再删除?或者说顺序是否重要(在 YAML 字典中是否支持)?

cap_add 或者 cap_drop 中包含了 ALL 会发生什么?

我知道 Docker Linux 默认的一组能力,定义在 https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L4

1个回答

28
在浏览了moby源代码之后,我终于找到了TweakCapabilities():它需要两个能力集合来添加和删除,强制执行下面的方案;因此可以在docker-compose.yaml中使用,在该文件中YAML不会为cap_addcap_drop键定义顺序。下面的第一个匹配项将终止列表。
  • 容器设置了 privileged: true:完全忽略 cap_addcap_drop,返回所有可用的权限
  • cap_addcap_drop 都是空的:返回 Docker 默认的权限集合。
  • cap_add 包含 ALL:返回除了 cap_drop 中列出的权限之外的所有权限(忽略后者中的 ALL)。
  • cap_drop 包含 ALL:仅返回 cap_add 中的权限,忽略任何 Docker 默认的权限。
  • 默认情况下:首先从 cap_drop 中的默认权限集合中删除所有权限,然后添加 cap_add 中的权限,最后返回结果。

如果我没记错的话,这也可以更加易懂地表示如下...

cap_add/cap_drop

privileged: true
所有特权:忽略cap_addcap_drop(老板模式)
没有 cap_add cap_add: ['CAP_A'] cap_add: ['ALL']
没有cap_drop 默认的能力 默认的能力 + CAP_A 全部的能力
cap_drop: ['CAP_Z'] 默认的能力 -CAP_Z 默认的能力 -CAP_Z +CAP_A 全部的能力 -CAP_Z
cap_drop: ['ALL'] 没有能力 CAP_A 全部的能力
最后,只有以下两种“确定性”组合始终包括cap_drop: ALL并遵循最小特权原则:

cap-drop

cap_add cap_add: ['CAP_A']
 
 
cap_drop: ['ALL'] 无特权 CAP_A

谢谢您的回答。只有一个评论。分享TweakCapabilities()的永久链接是一个好习惯,以避免指向错误的位置:https://github.com/moby/moby/blob/ad9d70b0e6833b746eecccc08a17459ba8bb31c4/oci/caps/utils.go#L83 - nav
我不知怎么搞错了链接,但现在已经修复了;当然,一开始就应该是永久链接。 - TheDiveO

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