docker - 为什么要求在 Kubernetes PodSecurityPolicy 冗余中删除所有功能,非 root + 禁止特权升级?
问题描述
PodSecurityPolicy 文档中的第二个示例策略包含以下 PodSecurityPolicy 片段
...
spec:
privileged: false
# Required to prevent escalations to root.
allowPrivilegeEscalation: false
# This is redundant with non-root + disallow privilege escalation,
# but we can provide it for defense in depth.
requiredDropCapabilities:
- ALL
...
为什么对于非 root + 禁止特权提升删除所有功能都是多余的?您可以拥有一个非 root 但具有有效功能的容器进程而无需提权?
Docker似乎无法做到这一点:
$ docker run --cap-add SYS_ADMIN --user 1000 ubuntu grep Cap /proc/self/status
CapInh: 00000000a82425fb
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 00000000a82425fb
CapAmb: 0000000000000000
即使尝试显式添加它们,所有有效功能也已被删除。但是其他容器运行时可以实现它,那么这个评论只是 Docker 特定的吗?
解决方案
为什么对于非 root + 禁止特权提升删除所有功能都是多余的?
因为您需要特权升级才能使用“新”功能,所以实际上是在execve系统调用中allowPrivilegeEscalation: false
禁用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
00000000a82425fb
在没有指定任何--cap-add
选项的情况下为什么相同是有道理的。
但是其他容器运行时可以实现它,那么这个评论只是 Docker 特定的吗?
我想,所以你可能会遇到这样一种情况,即privileged: false
没有allowPrivilegeEscalation: false
有效地禁用功能,并且可能会被丢弃requiredDropCapabilities:
(虽然,我不明白为什么另一个运行时会想要改变 Docker 行为)。
推荐阅读
- java - 如何恢复我的导入/接口并修复我的项目?
- javascript - 带有条件语句的嵌套过滤器,没有像我想要的那样显示
- java - 如何在 Servlet 响应中换行
- javascript - 有没有更有效的方法来排序这个数组?
- algorithm - 如何求解迭代替换方程?
- azure-devops - 限制谁可以批准拉取请求
- node.js - 在 npm 脚本中控制 Unix IPC 信号
- python - TypeError: object.__new__() 只接受一个参数(要实例化的类型)
- arrays - 根据列值在一个pdf中打印多张纸
- gnuplot - 来自标题注释的 gnuplot 自动标题矩阵