Rootless模式配合最小权限管理是从守护进程、容器运行时、应用进程三层同步收窄权限边界:守护进程以非root用户在user namespace中运行;运行时禁用提权、drop全部capabilities并按需add;应用层以非root用户运行且根文件系统只读,并辅以敏感路径只读、pids限制和seccomp过滤。

服务器 Rootless 模式配合最小权限管理,不是简单地“不用 root”,而是从守护进程、容器运行时、应用进程三层同步收窄权限边界。核心在于:让宿主机上没有一个环节以 root 身份执行关键操作,同时确保容器内进程也仅拥有功能必需的最小能力。
1. 先让 Docker 守护进程脱离 root
Rootless 模式本质是把 docker daemon 运行在普通用户命名空间下,不依赖系统级 root 权限:
- 安装时用非 root 用户执行:
curl -fsSL https://get.docker.com/rootless | sh,生成的dockerd-rootless.sh仅对当前用户生效 - 启动后,
DOCKER_HOST=unix:///run/user/$UID/docker.sock指向用户专属 socket,其他用户无法访问 - 所有容器进程实际运行在该用户的 user namespace 中,即使容器内 UID=0,映射到宿主机也是非特权 UID(如 100000+)
2. 容器运行时层禁用提权与默认能力
Rootless 只解决宿主机 daemon 层权限,还需在容器启动时切断提权路径:
- 强制禁用新权限获取:
--security-opt=no-new-privileges(Docker)或noNewPrivileges: true(K8s securityContext) - 默认移除全部 capabilities:
--cap-drop=ALL,仅按需添加,例如绑定 80 端口只需--cap-add=NET_BIND_SERVICE - 禁止特权模式:
--privileged=false(默认已关闭,但显式声明更稳妥)
3. 应用进程层坚持非 root + 只读根文件系统
这是最小权限落地的最后一环,直接决定攻击者突破应用后的横向能力:
- Dockerfile 中创建专用低权用户并切换:
RUN adduser -u 1001 -D appuser && chown -R appuser /app→USER appuser - Compose 或 K8s 中显式指定用户:
user: "1001:1001"或runAsUser: 1001,避免依赖容器内用户名解析 - 启用只读根文件系统:
read_only: true(Compose)或readOnlyRootFilesystem: true(K8s),对日志、缓存等可写路径用tmpfs或volume单独挂载
4. 补充隔离:敏感路径只读 + 进程限制
Rootless 本身不自动保护宿主机路径,需主动加固:
- 挂载
/proc、/sys、/dev时加:ro后缀,防止容器读取宿主机硬件或内核信息 - 限制容器内进程数:
--pids-limit=50,防 fork bomb 类攻击 - 结合 seccomp profile(如
builtin-restrictive.json)过滤危险系统调用,例如mount、ptrace、chroot

















