使用 Docker Compose + Ubuntu 的安全部署
· 阅读需 6 分钟
在硅谷的创业公司中,Docker Compose 是快速部署和管理容器化应用的首选工具之一。然而,便利往往伴随安全风险。作为站点可靠性工程师(SRE),我深知安全漏洞可能导致灾难性后果。本文将分享我在实际工作中结合 Docker Compose 与 Ubuntu 系统总结的最佳安全实践,帮助你在享受 Docker Compose 便利的同时,确保系统安全。
I. 加固 Ubuntu 系统安全
在部署容器之前,确保 Ubuntu 主机本身的安全至关重要。以下是关键步骤:
1. 定期更新 Ubuntu 和 Docker
确保系统和 Docker 均保持最新,以修复已知漏洞:
sudo apt update && sudo apt upgrade -y
sudo apt install docker-ce docker-compose-plugin
2. 限制 Docker 管理权限
严格控制 Docker 管理权限,防止特权提升攻击:
sudo usermod -aG docker deployuser
# 防止普通用户轻易获取 Docker 管理权限
3. 配置 Ubuntu 防火墙 (UFW)
合理限制网络访问,防止未授权访问:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
4. 正确配置 Docker 与 UFW 的交互
默认情况下,Docker 会绕过 UFW 直接配置 iptables,建议手动控制:
修改 Docker 配置文件:
sudo nano /etc/docker/daemon.json
添加以下内容:
{
"iptables": false,
"ip-forward": true,
"userland-proxy": false
}
重启 Docker 服务:
sudo systemctl restart docker
在 Docker Compose 中显式绑定地址:
services:
webapp:
ports:
- "127.0.0.1:8080:8080"
II. Docker Compose 安全最佳实践
以下配置适用于 Docker Compose v2.4 及以上。请注意非 Swarm 与 Swarm 模式的差异。
1. 限制容器权限
容器默认以 root 运行风险极高,建议切换为非 root 用户:
services:
app:
image: your-app:v1.2.3
user: "1000:1000" # 非 root 用户
read_only: true # 只读文件系统
volumes:
- /tmp/app:/tmp # 如需写入,仅挂载必要目录
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
说明:
- 只读文件系统可防止容器内部被篡改。
- 确保挂载卷仅限必要目录。
2. 网络隔离与端口管理
精准划分内部网络与外部网络,避免将敏感服务暴露给公网:
networks:
frontend:
internal: false
backend:
internal: true
services:
nginx:
networks: [frontend, backend]
database:
networks:
- backend
- 前端网络:可对外开放。
- 后端网络:严格受限,仅内部通信。
3. 安全的 Secrets 管理
敏感数据绝不能直接写入 Compose 文件:
单机模式:
services:
webapp:
environment:
- DB_PASSWORD_FILE=/run/secrets/db_password
volumes:
- ./secrets/db_password.txt:/run/secrets/db_password:ro
Swarm 模式