应以非特权用户运行容器并严格管控挂载权限:Dockerfile中创建UID 1001用户并USER切换,宿主机目录chown 1001:1001,禁用:Z/:z,Compose中指定user: "1001:1001",敏感路径只读挂载,最小化挂载范围,启用--read-only与--cap-drop=ALL。

核心思路是避免容器内进程以 root(UID 0)身份访问宿主机文件系统,同时严格控制挂载路径的访问粒度和权限边界。
明确指定非特权用户运行容器
在 Dockerfile 中创建专用用户并固定 UID/GID,不要依赖默认 root:
- 用 adduser --uid 1001 --disabled-password appuser 创建确定 UID 的用户
- 紧随其后执行 USER 1001 切换上下文,确保所有后续指令及运行时进程都以此 UID 执行
- 避免使用 sudo、--privileged 或 cap-add=ALL 等提权方式
绑定挂载时匹配宿主机目录所有权
挂载前确保宿主机目标路径归该 UID 所有,而非依赖宽松权限:
- 在宿主机上运行:sudo chown -R 1001:1001 /host/data
- 挂载命令中不加 :Z 或 :z(这些 SELinux 标签会自动重标安全上下文,可能扩大访问面)
- 若用 Docker Compose,写明 user: "1001:1001" 字段,与挂载目录 UID 保持一致
启用只读挂载隔离敏感路径
对配置文件、证书、静态资源等无需修改的内容,强制设为只读:
- Docker CLI:-v /host/conf:/app/conf:ro
- Docker Compose:volumes: ["./conf:/etc/app:ro"]
- 即使容器被突破,攻击者也无法篡改配置或注入恶意脚本
限制挂载范围与能力
不挂载整个家目录或根路径,只暴露最小必要子目录:
- 禁用递归挂载父目录,例如不要用 -v /home:/home,而用 -v /home/user/appdata:/app/data
- 配合 --read-only 启动参数,使整个容器根文件系统只读(应用数据卷仍可单独 rw 挂载)
- 通过 --cap-drop=ALL --cap-add=NET_BIND_SERVICE 精确授权,移除 SETUID、CHOWN 等危险能力











