Docker无原生设备黑名单机制,需通过禁用默认挂载、--cap-drop/ADD、no-new-privileges、cgroups v2 devices.deny、清理宿主机设备节点及专项拦截GPU/USB/KVM等组合策略实现。

Docker本身不提供直接的“设备访问黑名单”机制,而是采用白名单式控制:默认禁止所有设备访问,必须显式通过 --device 挂载才可使用。因此,“黑名单”需通过组合策略实现——即先关闭默认设备暴露能力,再主动剔除不需要的设备节点,并辅以能力限制与cgroups设备控制器加固。
禁用默认设备挂载并收缩初始设备集
Docker容器启动时默认会挂载部分基础设备(如 /dev/pts、/dev/shm),但不会自动挂载 /dev/sd*、/dev/nvidia* 等敏感设备。真正需要防范的是意外挂载或能力越权。关键操作包括:
- 始终避免使用
--privileged,它会绕过所有设备和能力限制 - 用
--cap-drop=ALL清空默认能力,再按需添加(如仅--cap-add=NET_ADMIN) - 通过
--security-opt=no-new-privileges:true阻止进程提权获取新设备访问权
用cgroups v2 device controller实施细粒度拒绝
若宿主机启用cgroups v2(Docker 20.10+ 默认),可配合 docker run --cgroup-parent 或直接在容器内写入 /sys/fs/cgroup/devices/ 规则,实现设备级黑名单效果。例如,在容器启动后执行:
echo 'a /dev/sdb rwm' > /sys/fs/cgroup/devices/devices.deny
这会禁止对 /dev/sdb 的任何读写执行操作。注意:devices.deny 仅在cgroups v2下生效,且需容器具备 sys_admin 能力(不推荐生产环境开启)。
移除宿主机上不必要的设备节点映射
即使未显式挂载,某些设备路径仍可能被容器间接访问(如通过 /dev 全量挂载)。稳妥做法是:
- 不使用
--device=/dev:/dev:rwm这类宽泛挂载 - 若必须挂载整个
/dev,先在宿主机侧清理冗余节点:rm -f /dev/sdb /dev/nvidia-uvm(确保不影响宿主机服务) - 结合
--read-only挂载根文件系统,防止容器内恶意重建设备节点
针对GPU/USB等高风险设备的专项拦截
对特定硬件,有更直接的屏蔽方式:
-
GPU:不加
--gpus或--runtime=nvidia,同时卸载宿主机nvidia驱动模块(sudo rmmod nvidia_uvm nvidia_drm nvidia)可彻底阻断访问 -
USB设备:避免挂载
/dev/bus/usb;如已挂载,可在容器内运行lsusb后,用echo 'deny' > /sys/bus/usb/devices/*/authorized(需sys_admin)动态禁用 -
KVM:不挂载
/dev/kvm,并确认cat /proc/sys/kernel/kptr_restrict为2,防止信息泄露辅助绕过


















