6月2日 23:45
Docker 容器权限怎么管?rootless 模式、用户映射和安全加固
Docker 容器默认以 root 运行——如果容器被攻破,攻击者获得容器内的 root 权限,可能逃逸到宿主机。安全的第一步:不要用 root 跑应用。
不要用 root 跑应用
USER appuser 之后的所有操作(CMD、ENTRYPOINT)都以 appuser 身份执行。即使应用有漏洞,攻击者只有普通用户权限。
docker run 指定用户
如果 Dockerfile 里没有 USER,运行时指定:
覆盖 Dockerfile 里的 USER 指令。UID 1000 通常是宿主机的第一个普通用户。
只读文件系统
把容器文件系统挂载为只读,攻击者无法写入恶意文件。 给 /tmp 临时写入空间(很多应用需要)。
限制能力(Capabilities)
Linux capabilities 是细粒度的权限控制。Docker 默认给容器少量 capability,但还可以更严格:
删掉所有能力, 只加回绑定 1024 以下端口的能力。按需添加,不给多余的权限。
Rootless Docker
Docker 默认以 root 运行 daemon——即使容器里不是 root,daemon 本身是 root。Rootless 模式让整个 Docker daemon 以普通用户运行:
Rootless 模式的限制:不能绑定 80/443 端口(需要 1024 以上),没有 cgroup 资源限制,网络功能受限。适合 CI/CD 和开发环境,生产环境不成熟。
资源限制
防止恶意或失控的容器吃光宿主机资源:
限制容器最多 100 个进程,防止 fork bomb。
安全检查清单
- 容器不以 root 运行(USER 指令或 --user 参数)
- 文件系统只读(--read-only)
- 最小 capability(--cap-drop ALL + 按需 cap-add)
- 资源限制(memory、cpus、pids)
- 不挂载 Docker socket(-v /var/run/docker.sock 是最危险的操作)
- 镜像来自可信源(不用来历不明的镜像)