权限最小化分配的核心是限定容器对宿主机目录的访问权限:使用非root用户(如UID 1001)、宿主机目录预设对应属主、挂载时启用ro/noexec/nodev选项、优先采用带权限控制的命名卷,并结合seccomp/AppArmor/SELinux限制敏感系统调用。

容器挂载宿主机目录时,权限最小化分配的核心是:只赋予容器进程运行所需的最低文件系统权限,避免以 root 或高权限用户身份访问宿主机路径,同时限制读写范围与执行能力。
明确容器内进程的运行用户(非 root)
不要依赖默认的 root 用户启动容器。在 Dockerfile 中使用 USER 指令指定非特权用户,并确保该用户在宿主机挂载目录中具备精确对应的 UID/GID 权限。
- 构建镜像时创建专用用户,例如:
RUN adduser -u 1001 -D appuser - 镜像末尾添加:
USER appuser - 宿主机挂载目录需提前设置属主为相同 UID:
sudo chown -R 1001:1001 /host/data
挂载时启用只读或受限读写模式
根据实际用途选择挂载选项,避免无差别赋予读写权。多数配置类、静态资源类目录应设为只读。
- 只读挂载:
docker run -v /host/config:/app/config:ro ... - 若需写入,仅开放必要子路径,如日志目录单独挂载并可写:
-v /host/logs:/app/logs:rw - 禁用执行权限(noexec)和设备文件挂载(nodev)可进一步加固:
:ro,noexec,nodev
使用命名卷替代直接绑定挂载(适用状态数据场景)
对于数据库、缓存等有状态服务,优先用命名卷管理数据,由 Docker 控制底层存储权限,避免暴露宿主机路径结构与权限细节。
- 创建受控卷:
docker volume create --driver local --opt o=uid=1001,gid=1001,mode=0750 mydata - 运行时挂载:
-v mydata:/var/lib/mysql - 相比 bind mount,命名卷天然隔离宿主机文件系统,且支持驱动级权限控制
配合 seccomp、AppArmor 或 SELinux 限制文件系统调用
在 Linux 宿主机上,通过安全模块限制容器能执行的系统调用,即使挂载了目录,也无法进行 unlink、chmod、chown 等敏感操作。
- 启用默认 seccomp 配置(Docker 20.10+ 默认启用)已屏蔽约 40+ 危险系统调用
- 自定义策略可进一步禁用
openat的O_CREAT标志,或限制mkdirat调用 - SELinux 标签示例:
docker run --security-opt label=type:svirt_sandbox_file_t ... -v /host/data:/data:z










