基线包含什么
这套组合把常见加固项放在一条命令里:以非 root 用户运行、根文件系统只读、需要写入的目录用 tmpfs、丢弃全部内核能力、禁止提权、限制内存与进程数。它适合无状态服务与静态站点类负载,也能一一映射到 Compose 的对应字段。上线前建议先跑观察模式,确认应用没有依赖额外的写入路径,再逐步收紧。
基本信息
| 组合项 | --user / --read-only / --tmpfs / --cap-drop / --security-opt no-new-privileges / --memory / --pids-limit |
|---|---|
| 适用范围 | 无状态服务、静态站点 |
| 验证方式 | docker inspect 查看 HostConfig 对应字段 |
| 落地方式 | 可映射到 Compose 的同名字段 |
| 前提 | 不使用特权模式、不挂载容器运行时套接字 |
典型使用场景
- 新服务上线时的安全起点配置
- 把既有服务逐步收敛到最小权限
- 审计时作为对照基准,找出偏离项
- 静态站点与只读服务的最简加固
- 排查容器内不应发生的写入行为
组合命令与核实
组合命令与核实
docker run -d --name web --user 10001:10001 --read-only --tmpfs /tmp:size=64m --cap-drop=ALL --security-opt no-new-privileges --memory=512m --pids-limit=256 --restart=unless-stopped web/static:1.0
docker inspect -f '{{.HostConfig.ReadonlyRootfs}} {{.HostConfig.CapDrop}} {{.HostConfig.SecurityOpt}} {{.Config.User}}' web
docker logs web --tail=20 # 确认应用在只读根文件系统下能正常启动加固项与常见冲突
| 加固项 | 作用 | 常见冲突 |
|---|---|---|
| --read-only | 根文件系统只读 | 应用需要临时文件或锁文件 |
| --tmpfs | 为指定目录提供可写内存盘 | 数据不持久化,重启即丢 |
| --cap-drop=ALL | 清空内核能力 | 需要绑定低端口或改文件属主 |
| no-new-privileges | 禁止通过 setuid 提权 | 少数依赖提权的工具会失败 |
| --user | 以非 root 运行 | 镜像内目录属主不匹配时写入失败 |
启用只读根文件系统前要做一次完整回归:时区缓存、临时目录、锁文件与日志目录都可能是写入点。
这套基线的前提是不挂载容器运行时套接字、不使用特权模式;把这两项加回去等于绕开了整组加固。
把这条命令与 Compose 的对应字段一起写进模板,新服务直接套用模板,比每次逐项配置更不容易遗漏。