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 是最危险的操作)
  • 镜像来自可信源(不用来历不明的镜像)
标签:Docker