为什么对于非root用户和禁止特权升级来说,放弃所有功能是多余的?
因为你需要特权升级才能使用“新”的功能,有效地allowPrivilegeEscalation: false
就是在execve系统调用中禁用setuid,这会阻止使用任何新功能。
此外,正如文档中所示:“一旦设置了该位,它将在fork、clone和execve之间继承,并且无法取消设置”。更多信息请参见此处。
与privileged: false
相结合,requiredDropCapabilities: [ALL]
变得多余。
这里的等效Docker选项是:
--user=whatever
=> privileged: false
--security-opt=no-new-privileges
=> allowPrivilegeEscalation: false
--cap-drop=all
=> requiredDropCapabilities: [ALL]
看起来 Docker 不支持此操作
当你指定一个非特权用户时,Docker 会删除所有有效能力 (CapEff: 0000000000000000
),即使你使用 --cap-add SYS_ADMIN
这个与选项 --security-opt=no-new-privileges
结合使用将使 --cap-drop=all
失效。
请注意,Docker 的默认能力掩码似乎包括 SYS_ADMIN
$ docker run --rm ubuntu grep Cap /proc/self/status
CapInh: 00000000a80425fb
CapPrm: 00000000a80425fb
CapEff: 00000000a80425fb
CapBnd: 00000000a80425fb
CapAmb: 0000000000000000
$ capsh --decode=00000000a82425fb
0x00000000a82425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_sys_admin,cap_mknod,cap_audit_write,cap_setfcap
这就解释了为什么不指定
--cap-add
选项时,
00000000a82425fb
是相同的。
但其他容器运行时可能会实现它,那么这个评论只是针对Docker吗?
我想是的,所以你可能会遇到这种情况:
privileged: false
和
allowPrivilegeEscalation: false
并没有有效地禁用功能,这可以通过
requiredDropCapabilities:
来丢弃(尽管我不明白为什么另一个运行时会想要更改Docker的行为)。
privileged: false
结合使用就可以使requiredDropCapabilities: ALL
失效了。我想当你指定--user 1000
时,Docker 就是这样做的。 - Ricoprivileged: true
,因此您可以拥有功能而不必具备特权。我认为这仅适用于 Docker 将非 root 用户的所有有效功能都删除的情况,因此将其与禁止特权升级相结合可以防止它们获得任何功能,但并非所有运行时都会这样做,在这种情况下,要求在容器启动时放弃所有功能实际上是不同的 - 您同意吗? - dippynarkpriviledged: false
+allowPrivilegeEscalation: false
的情况下不会丢失有效能力,并保留一些能够通过requiredDropCapabilities: <something>
丢弃的能力。 - Rico