Debian Docker安全策略如何设置
小樊
48
2025-12-22 20:47:45
Debian 上 Docker 安全策略落地指南
一 主机与守护进程安全基线
- 保持系统与 Docker 为最新:执行 apt update && apt upgrade,及时修补内核与容器运行时漏洞。仅允许可信用户加入 docker 组,避免将 /var/run/docker.sock 暴露给不可信主体或容器内,杜绝由此带来的主机 root 级风险。为 Docker 相关关键文件与目录设置严格权限与属主(如 /etc/docker、/var/lib/docker、docker.service、docker.socket 等),并纳入审计。启用 用户命名空间 remap(–userns-remap)以将容器内 root 映射到主机非特权用户,降低提权影响面。对外仅开放必要端口,使用 UFW 或 iptables 实施最小暴露面;加固 SSH(禁用 root 登录、使用密钥、可变更端口),并部署 fail2ban 缓解暴力破解。对 Docker 守护进程与主机侧关键活动配置 auditd 持续审计。
二 镜像与构建安全
- 仅使用来自官方或可信源的镜像,启用 Docker Content Trust(DCT) 验证镜像签名,避免供应链投毒。优先选择 Alpine/BusyBox 等最小化基础镜像并精简依赖,减少攻击面。在 Dockerfile 中创建并切换到非 root 用户运行应用,必要时通过 USER 指令或运行期 -u 指定 UID/GID。严禁在镜像或 Dockerfile 中存放明文密钥/凭据,使用卷挂载、Secret 管理或运行时注入机制替代。构建阶段移除 setuid/setgid 位,定期扫描镜像漏洞并拒绝使用过期或未扫描镜像进入构建/生产。
三 运行时最小权限与隔离
- 禁止特权容器:不使用 –privileged;通过 –security-opt no-new-privileges 阻止容器内获取新增特权。遵循最小能力原则:默认 CAP_DROP 大部分能力,仅按需 CAP_ADD(如 Web 服务仅添加 NET_BIND_SERVICE 以绑定 80/443)。根文件系统设为只读(–read-only),对临时目录使用 tmpfs 并配置 noexec,nosuid。严格限制资源:设置 –memory、–memory-swap、–cpus、–ulimit 等,防止 DoS 与资源争用。网络与命名空间隔离:避免使用默认 docker0 网桥,优先创建自定义桥接或 overlay 网络;不共享主机 network/pid/ipc/uts 命名空间,除非确有强需求。禁止将 /var/run/docker.sock 挂载进容器;谨慎挂载主机敏感目录(如 /、/proc、/sys、/dev),确需挂载时使用只读与最小权限。
四 Linux 安全模块与强制访问控制
- 在 Debian 上优先启用 AppArmor:为 Docker 守护进程与关键容器加载专用或系统提供的 AppArmor 配置,限制可执行文件、文件读写、网络访问等。可使用 bane 快速生成示例策略并加载,例如:
- 生成策略:bane sample.toml(生成名为 docker-nginx-sample 的策略)
- 运行容器:docker run --rm -it --security-opt=“apparmor:docker-nginx-sample” nginx bash
观察受限行为(如 shell 被拒),验证策略生效。若需更强隔离,可在支持的发行版上结合 SELinux 设置容器与主机对象的安全上下文与布尔值(Debian 默认以 AppArmor 为主)。
五 快速检查清单与示例命令
- 加固要点
- 更新系统与 Docker,最小化容器/镜像,非 root 运行,禁用 –privileged 与 –security-opt no-new-privileges 到位。
- 能力最小化(默认 DROP、按需 ADD),根文件系统只读,tmpfs 与卷挂载受控。
- 资源限额(内存/CPU/进程数/文件句柄),网络隔离(自定义网络、避免默认网桥与主机命名空间共享)。
- 守护进程与关键文件权限/属主正确,启用审计;仅开放必要端口,SSH 加固与 fail2ban 启用。
- AppArmor/SELinux 启用并验证策略命中,镜像内容信任与漏洞扫描常态化。
- 示例命令
- 非 root 运行并只读根文件系统:
docker run -d --name web --read-only --tmpfs /tmp:rw,noexec,nosuid
-u 10000:10000 -p 8080:80 nginx:1.25-alpine
- 能力最小化(仅允许绑定 80 端口):
docker run -d --name web
–cap-drop=ALL --cap-add=NET_BIND_SERVICE
-p 80:80 nginx:1.25-alpine
- 资源与重启策略:
docker run -d --name app
–memory=512m --cpus=1 --restart=on-failure:5
myapp:latest
- 启用 AppArmor 策略:
docker run --rm -it --security-opt=“apparmor:docker-nginx-sample” nginx bash
- UFW 最小暴露(示例开放 22222/TCP SSH 与 80/TCP):
ufw default deny incoming && ufw default allow outgoing
ufw allow 22222/tcp && ufw allow 80/tcp && ufw enable