Docker 是一种领先的容器化平台,可以简化应用程序的开发、部署和管理。通过使用 Docker,您可以创建一致、可移植且可扩展的环境,从而实现高效的开发和运营。本指南将介绍 Docker 的最佳实践,帮助您充分利用 Docker 的潜力并确保应用程序的安全性和性能。
一、安全性最佳实践
1、最小权限原则
容器运行权限
避免容器以 root 用户身份运行:
默认情况下,Docker 容器是以 root 用户身份运行的。
如果容器内的应用程序被攻破,攻击者将拥有容器内的 root 权限,可能对主机造成威胁。
在 Dockerfile 中使用 USER 指令,将容器默认用户设置为非特权用户,例如:
FROM ubuntu:latest RUN groupadd -r appgroup && useradd -r -g appgroup appuser USER appuser
以非特权用户身份运行:
- 可以在运行容器时使用
--user
标志指定非特权用户:
docker run --user 1000:1000 myimage
或者在 Docker Compose 文件中指定用户
version: '3' services: app: image: myimage user: "1000:1000"
Docker 守护进程权限
确保只有可信用户能访问 Docker 守护进程:
Docker 守护进程默认以 root 用户身份运行,具有较高的系统权限。
默认情况下,Docker 守护进程监听 Unix 套接字 /var/run/docker.sock,只有 docker 组的成员可以访问。
使用 chmod 或 chown 确保 /var/run/docker.sock 只允许可信用户访问:
sudo chown root:docker /var/run/docker.sock sudo chmod 660 /var/run/docker.sock
将可信用户添加到 docker
组:
sudo usermod -aG docker trusted_user
限制 Docker 守护进程的网络访问权限:
默认情况下,Docker 守护进程不监听 TCP 套接字。
如果需要通过网络远程访问 Docker 守护进程,应开启 TLS 并确保只接受来自可信客户端的连接。
2、网络安全
防火墙
限制 Docker 守护进程的网络访问:
使用防火墙(如 iptables 或 firewalld)确保 Docker 守护进程仅接受来自可信主机的连接
iptables -A INPUT -p tcp --dport 2375 -s TRUSTED_IP -j ACCEPT iptables -A INPUT -p tcp --dport 2375 -j DROP
隔离容器网络:
- 使用防火墙规则隔离不同容器之间的网络通信,例如:
iptables -A FORWARD -s 172.17.0.0/16 -d 172.18.0.0/16 -j DROP
Docker 网络模型
合理选择网络模型:
bridge 网络:适用于单主机上的容器通信,默认启用 NAT 转发。
host 网络:容器与主机共享网络命名空间,通信性能最佳,但存在安全风险。
overlay 网络:适用于多主机集群,提供跨主机的容器通信。
macvlan 网络:直接为容器分配主机网络中的 MAC 地址和 IP 地址,适用于需要直接访问局域网的容器。
配置网络策略:
使用网络策略(如 Kubernetes NetworkPolicy)控制不同容器之间的网络访问。
使用防火墙规则限制容器网络的入站和出站流量。
3、镜像安全
可信镜像
使用官方或可信来源的镜像:
官方镜像通常经过严格审核,优先选择官方镜像或来自可信组织的镜像。
Docker Hub 提供了官方镜像的认证标志(如官方或受信任的发布者)。
避免使用 latest 标签:
latest 标签指向最新版本的镜像,可能引入未知风险。
明确指定镜像版本,例如
docker run myimage:1.0.0
定期扫描
使用漏洞扫描工具:
使用工具(如 Clair、Trivy、Anchore)定期扫描镜像中的漏洞。
在 CI/CD 流程中集成漏洞扫描工具,确保每次构建都进行安全检查。
持续监控新漏洞:
持续关注镜像所依赖的软件包的漏洞公告,及时更新镜像。
4、主机安全
Docker 守护进程隔离
将 Docker 守护进程与主节点隔离:
在生产环境中,将 Docker 守护进程与主节点隔离,减少潜在攻击面。
使用专用虚拟机或裸金属服务器作为 Docker 守护进程的运行环境。
安全配置审计
定期进行配置审计:
使用工具(如 Docker Bench for Security)定期审计 Docker 守护进程的安全配置。
审查 Docker 守护进程和容器的配置文件,确保关键设置符合最佳实践。
5、资源限制
内存限制
使用 --memory 限制容器内存使用:
限制容器的最大内存使用量,例如:
docker run --memory 500m myimage
在 Docker Compose 文件中指定内存限制
version: '3' services: app: image: myimage deploy: resources: limits: memory: 500M