Docker 容器并非绝对安全,Rootless 才是正解

Securing Services with Rootless Containers

很多后端开发者误以为 Docker 或 OCI 容器本身就能提供足够的安全防护,但这其实是个危险的误区。虽然 cgroups 和 Linux namespaces 能构建基础隔离,但面对内核漏洞或配置失误,传统 rootful 容器一旦被攻破,攻击者就能以 root 权限控制宿主机。本文详细介绍了如何通过 Rootless 容器技术来降低这种风险,利用 Podman 和 systemd 实现无守护进程、非特权用户的容器运行环境。通过 PostgreSQL 和 Anubis 的实际案例,展示了如何配置 lingering users、systemd service unit 文件以及处理权限映射,确保即使容器被突破,攻击者的权限也被严格限制在普通用户范围内,从而大幅提升服务安全性。

如果攻击者突破了容器,通过内核漏洞、运行时漏洞、随意的 bind mount 或配置错误的 capability,他们将以 root 身份登陆宿主机。
  1. firasd

    有意思……如果你把 Docker 看作一种快速搭建环境的便捷方式,那倒是一回事;但如果你指望它能做到滴水不漏的隔离,确保容器内的进程无法“逃逸”,那么我认为大多数常规用法和讨论其实并没有真正聚焦于这一点。

  2. kayson

    我依然更倾向于使用 Docker。我并不介意 daemon 以 root 身份运行,因为有些操作本来就需要 root 权限!比如绑定特权端口或配置网络(使用 `internal: true`,daemon 会自动设置限制流量的 iptables 规则)。

    我通过 ansible 部署 docker compose 文件,因此所有服务都内置了安全默认设置,比如 rootless、丢弃能力(dropped caps)、禁止提权(no new privileges)等等。我希望能有更多容器支持以只读模式运行(通常添加起来很容易,只是常被忽视),以及使用 distroless 镜像(Go 应用很常见,其他语言则较少)。

    Reddit 上之前有个不错的评论,列出了 compose 文件的加固清单 [1]

    1. https://www.reddit.com/r/selfhosted/comments/1pr74r4/comment...

  3. seemaze

    '--userns=auto' 参数在 rootless 和 rootful 的 Podman 容器中都是非常有用的隔离方法。它允许 rootful 的 Podman 编排特权能力,同时将容器内的进程运行在非特权命名空间中。

    详见此处的讨论:

    https://github.com/podman-container-tools/podman/discussions...

同日更多故事

2026-07-27