核心是让服务在容器里以最小权限运行,不给攻击者提权或逃逸的机会;关键在于禁用特权模式、强制非root用户、只读根文件系统、精准丢弃并添加Linux capabilities、限制资源及阻止提权。

核心是让服务在容器里以最小权限运行,不给攻击者提权或逃逸的机会。关键不在“加功能”,而在“砍权限”——去掉所有不必要的能力、用户身份和挂载权限。
禁用特权模式与危险挂载
特权容器(--privileged)等于把宿主机 root 权限直接交出去,必须彻底禁用。Kubernetes 中要显式设 privileged: false,Docker 命令中绝不能出现 --privileged。
主机路径挂载是常见突破口,尤其 /proc、/sys、/dev、/etc 这类目录。禁止全盘挂载(如 -v /:/host),确需挂载时只读且限定范围,例如:
-v /etc/ssl/certs:/etc/ssl/certs:ro-v /run/dbus:/run/dbus:ro
强制非 root 用户 + 只读根文件系统
容器默认以 root 运行,一旦被攻破就全线失守。应在构建阶段创建普通用户,并在运行时强制切换:
- Dockerfile 中:
RUN adduser -u 1001 -D appuser && USER appuser - Kubernetes 中:
securityContext.runAsUser: 1001,并设runAsNonRoot: true - 加上
readOnlyRootFilesystem: true,根目录无法写入;需要日志或缓存的目录,单独用emptyDir或命名卷挂载,并通过fsGroup设好属组
精准控制 Linux capabilities
Docker 和 Kubernetes 默认启用大量内核能力(如 CAP_SYS_ADMIN、CAP_NET_RAW),多数应用根本用不到。应先全部丢弃,再按需添加:
-
--cap-drop=ALL(Docker)或capabilities.drop: ["ALL"](K8s) - 仅补充必需项,例如 Web 服务绑定 80/443 端口:加
CAP_NET_BIND_SERVICE - 绝对避免添加
CAP_SYS_ADMIN、CAP_DAC_OVERRIDE、CAP_SETUID等高危能力
加固运行时行为与上下文
光靠用户和能力还不够,要堵住提权路径和资源滥用可能:
- 设
allowPrivilegeEscalation: false,阻止进程通过setuid/setgid提权 - 启用
no-new-privileges:true(Docker 的--security-opt no-new-privileges:true) - 限制资源:如
--cpus 0.5 -m 256m或 K8s 的resources.limits,防 DoS 式耗尽 - 加载 AppArmor 或 SELinux profile(如
docker-default),对系统调用做细粒度拦截

















