Debian Docker如何保障安全
小樊
32
2025-12-13 00:31:21
Debian 上 Docker 的安全保障实践
一 主机与 Docker 守护进程安全
- 保持系统与 Docker 引擎为最新:在 Debian 上定期执行 apt update && apt upgrade,及时修补内核与容器运行时漏洞。
- 最小化攻击面:仅开启必要服务,禁用不必要的端口与后台进程。
- 强化 SSH:禁用 root 登录、使用 SSH 密钥、可变更默认端口,降低暴力破解与横向移动风险。
- 防火墙与网络隔离:使用 ufw/iptables 仅开放 22/80/443 等必要端口,对管理口与业务口进行网段隔离。
- 保护 Docker API 与 Socket:避免将 /var/run/docker.sock 挂载进容器;对外仅开放必要端口,优先采用 TLS 保护远程 API(证书、密钥最小权限、绑定管理 IP)。
- 权限最小化:谨慎管理 docker 组成员,仅授权可信运维;对 /etc/docker、/var/lib/docker、/usr/bin/containerd、/usr/sbin/runc 等关键文件设置严格权限与属主。
- 审计与日志:启用 auditd 对 Docker 守护进程与关键目录进行审计;集中收集与分析 syslog/日志,配合 Nagios/Zabbix/logwatch 做异常告警。
二 镜像与构建安全
- 可信来源与内容信任:优先使用官方或受信仓库镜像,启用 Docker Content Trust(DCT) 验证镜像签名,避免供应链投毒。
- 最小化基础镜像:选择 Debian slim/Alpine 或 distroless,减少组件与潜在漏洞。
- 多阶段构建:分离构建与运行阶段,仅保留运行时依赖,降低镜像体积与攻击面。
- 漏洞扫描:在 CI/CD 中对镜像进行定期扫描(如 Trivy/Clair/Anchore),发现高危 CVE 即阻断上线。
- 密钥与凭据治理:禁止将 API Key/DB 密码 写入 Dockerfile/镜像;使用 环境变量、外部配置或 Docker Secrets/Secret Manager 管理敏感信息。
- 镜像签名与可信注册表:对内部镜像进行签名,使用 HTTPS 访问私有注册表,确保传输与来源可信。
三 容器运行时安全
- 非 root 运行:在 Dockerfile 中创建并切换到非特权用户(如 USER myuser),或在运行期指定 -u;必要时启用 用户命名空间 将容器内 root 映射为宿主机非特权用户。
- 禁用特权与提权:不使用 –privileged;启用 –security-opt no-new-privileges 防止权限升级。
- 能力最小化:默认 –cap-drop=ALL,仅按需 –cap-add(如 NET_BIND_SERVICE)。
- 资源与进程限制:设置 内存/CPU 限额(如 –memory=512m --cpus=1)、pids_limit、ulimit,防止 DoS 与 fork 炸弹。
- 文件系统与挂载:根文件系统 –read-only,仅对数据卷可写;避免挂载 /etc、/var/lib/docker 等敏感目录;不使用 –privileged 挂载 docker.sock。
- 网络与端口:仅暴露必要端口,优先使用自定义网络与隔离策略,避免共享主机网络命名空间。
- 安全模块与系统调用:启用 AppArmor/SELinux 与 seccomp 配置文件,限制容器可见资源与可调用的系统调用。
四 快速加固清单与示例命令
-
加固清单(可直接对照执行)
- 系统与 Docker:保持最新;仅开放 22/80/443;SSH 禁用 root、启用密钥;审计 /etc/docker、/var/lib/docker、/usr/bin/containerd、/usr/sbin/runc。
- 守护进程:启用 TLS 远程访问;限制 /var/run/docker.sock 权限;谨慎分配 docker 组。
- 镜像:启用 DCT;使用 slim/distroless;多阶段构建;CI 中 Trivy 扫描;密钥不入镜像。
- 运行时:非 root;no-new-privileges;cap-drop=ALL 且最小 cap-add;–read-only + 仅必要卷;–memory/–cpus/pids_limit;启用 AppArmor/SELinux/seccomp;不挂载 docker.sock。
- 网络:自定义网络;仅暴露必要端口;隔离管理面与业务面。
- 监控与日志:集中日志、指标与告警;定期复盘策略与做渗透/演练。
-
示例命令(按需调整)
- 系统与引擎更新
- sudo apt update && sudo apt upgrade
- sudo apt install --only-upgrade docker-ce docker-ce-cli containerd.io
- 非 root 运行容器
- docker run -d --user 1001:1001 --read-only -p 8080:80 myapp:latest
- 能力最小化与禁止提权
- docker run -d --cap-drop=ALL --cap-add=NET_BIND_SERVICE --security-opt no-new-privileges myapp:latest
- 资源与进程限制
- docker run -d --memory=512m --cpus=1 --pids-limit=64 myapp:latest
- 镜像签名与扫描
- export DOCKER_CONTENT_TRUST=1
- trivy image myapp:latest
- 保护 Docker Socket 与启用 TLS(示例思路)
- 不挂载 /var/run/docker.sock 到容器内
- 为 Docker daemon 配置 --tlsverify、–tlscacert、–tlscert、–tlskey 并绑定管理 IP 访问