Docker安全实践
Docker安全实践
容器安全原则
- 最小权限原则
- 镜像安全扫描
- 网络隔离
- 资源限制
- 日志审计
镜像安全
使用可信镜像
# 使用官方镜像
docker pull nginx:alpine
# 验证镜像签名
docker trust inspect --pretty nginx
扫描漏洞
# 使用Trivy
trivy image nginx:latest
# 使用Snyk
snyk container test nginx:latest
# 在Dockerfile中集成
RUN trivy image --severity HIGH,CRITICAL myapp:latest
运行时安全
使用非root用户
FROM node:18-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
只读文件系统
docker run --read-only --tmpfs /tmp myapp
禁用特权模式
# 不要使用 --privileged
docker run --privileged myapp # 危险!
# 使用特定能力
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE myapp
资源限制
CPU限制
# 限制CPU
docker run --cpus=1.5 myapp
# CPU权重
docker run --cpu-shares=512 myapp
内存限制
# 限制内存
docker run --memory=512m myapp
# 内存和交换内存
docker run --memory=512m --memory-swap=1g myapp
IO限制
# 限制读写速度
docker run --device-read-bps /dev/sda:1mb myapp
网络安全
网络隔离
# docker-compose.yml
services:
frontend:
networks:
- public
backend:
networks:
- internal
networks:
public:
internal:
internal: true
禁用容器间通信
# 禁用icc
docker run --icc=false myapp
密钥管理
使用Docker Secrets
services:
db:
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: ./secrets/db_password.txt
使用环境变量(不推荐生产)
# 不要在docker run中直接使用-e传递敏感信息
docker run -e DB_PASSWORD=secret myapp # 不推荐
实践:安全容器配置
version: '3.8'
services:
app:
image: myapp:latest
user: "1000:1000"
read_only: true
tmpfs:
- /tmp
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
networks:
- backend
networks:
backend:
internal: true
审计和监控
# 启用Docker守护进程日志
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
# 查看容器事件
docker events
# 监控容器资源使用
docker stats
总结
Docker安全是一个系统工程,需要从镜像构建、运行时配置、网络隔离等多个层面进行防护。