安全最佳实践 #
安全威胁 #
常见安全威胁 #
text
┌─────────────────────────────────────────────────────┐
│ 安全威胁 │
├─────────────────────────────────────────────────────┤
│ │
│ 1. 镜像漏洞 - 镜像包含已知漏洞 │
│ 2. 权限提升 - 容器获取主机权限 │
│ 3. 敏感信息泄露 - 密码密钥泄露 │
│ 4. 网络攻击 - 容器间未授权访问 │
│ 5. 资源滥用 - 容器消耗过多资源 │
│ 6. 供应链攻击 - 恶意镜像注入 │
│ │
└─────────────────────────────────────────────────────┘
镜像安全 #
使用可信镜像 #
dockerfile
# 使用官方镜像
FROM nginx:alpine
# 使用特定版本
FROM nginx:1.25.0-alpine
# 不使用latest
# FROM nginx:latest # 不推荐
最小化镜像 #
dockerfile
# 使用Alpine镜像
FROM alpine:3.18
# 使用多阶段构建
FROM node:18 AS builder
# ...
FROM node:18-alpine
COPY --from=builder /app/dist /app/dist
镜像扫描 #
bash
# 使用docker scout
docker scout quickview myapp:v1.0
docker scout cves myapp:v1.0
# 使用trivy
trivy image myapp:v1.0
# CI/CD集成
trivy image --exit-code 1 --severity HIGH,CRITICAL myapp:v1.0
镜像签名 #
bash
# 启用内容信任
export DOCKER_CONTENT_TRUST=1
# 推送签名镜像
docker push myapp:v1.0
# 验证签名
docker trust inspect myapp:v1.0
容器安全 #
非root用户运行 #
dockerfile
# 创建用户
RUN groupadd -r appuser && useradd -r -g appuser appuser
# 切换用户
USER appuser
# 或使用UID
USER 1000:1000
只读文件系统 #
bash
# 只读根文件系统
docker run --read-only myapp
# 配合tmpfs
docker run --read-only --tmpfs /tmp myapp
限制能力 #
bash
# 删除所有能力
docker run --cap-drop ALL myapp
# 只添加需要的能力
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE myapp
禁用特权 #
bash
# 不使用特权模式
# docker run --privileged myapp # 不推荐
# 使用--security-opt
docker run --security-opt=no-new-privileges myapp
资源限制 #
bash
# 限制CPU和内存
docker run \
--cpus=1 \
--memory=512m \
--memory-swap=1g \
--pids-limit=100 \
myapp
网络安全 #
网络隔离 #
yaml
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx
networks:
- frontend
ports:
- "80:80"
app:
image: myapp
networks:
- frontend
- backend
db:
image: mysql
networks:
- backend
networks:
frontend:
backend:
internal: true # 隔离外部访问
端口安全 #
bash
# 只绑定本地
docker run -p 127.0.0.1:8080:80 nginx
# 不暴露不必要的端口
# 只暴露应用需要的端口
禁用ICC #
json
// /etc/docker/daemon.json
{
"icc": false
}
敏感信息管理 #
使用Secrets #
yaml
# docker-compose.yml (Swarm模式)
version: '3.8'
services:
db:
image: mysql:8.0
secrets:
- db_password
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
secrets:
db_password:
file: ./secrets/db_password.txt
使用环境变量文件 #
bash
# .env文件(不提交到版本控制)
DB_PASSWORD=secret_password
API_KEY=secret_key
# 使用
docker run --env-file .env myapp
不在镜像中存储密钥 #
dockerfile
# 不推荐
# ENV DB_PASSWORD=secret
# 推荐: 运行时注入
# docker run -e DB_PASSWORD=secret myapp
主机安全 #
启用用户命名空间 #
json
// /etc/docker/daemon.json
{
"userns-remap": "default"
}
启用Live Restore #
json
// /etc/docker/daemon.json
{
"live-restore": true
}
日志审计 #
json
// /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
安全配置清单 #
Dockerfile安全清单 #
dockerfile
# 1. 使用特定版本基础镜像
FROM alpine:3.18
# 2. 不安装不必要的包
RUN apk add --no-cache curl
# 3. 使用非root用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
# 4. 设置只读文件系统
# docker run --read-only
# 5. 健康检查
HEALTHCHECK CMD curl -f http://localhost:8080/health || exit 1
# 6. 不存储敏感信息
# 使用环境变量或secrets
# 7. 最小化层数
RUN apk add --no-cache curl && \
rm -rf /var/cache/apk/*
运行时安全清单 #
bash
docker run \
--user 1000:1000 \ # 非root用户
--read-only \ # 只读文件系统
--cap-drop ALL \ # 删除所有能力
--cap-add NET_BIND_SERVICE \ # 添加需要的能力
--security-opt=no-new-privileges \ # 禁止提权
--cpus=1 \ # CPU限制
--memory=512m \ # 内存限制
--pids-limit=100 \ # 进程限制
--network isolated \ # 网络隔离
myapp
主机安全清单 #
text
┌─────────────────────────────────────────────────────┐
│ 主机安全清单 │
├─────────────────────────────────────────────────────┤
│ │
│ [ ] 启用用户命名空间 │
│ [ ] 启用Live Restore │
│ [ ] 配置日志审计 │
│ [ ] 禁用ICC │
│ [ ] 启用TLS │
│ [ ] 定期更新Docker │
│ [ ] 定期扫描镜像 │
│ [ ] 限制API访问 │
│ [ ] 启用内容信任 │
│ [ ] 配置资源限制 │
│ │
└─────────────────────────────────────────────────────┘
安全工具 #
安全扫描工具 #
| 工具 | 说明 |
|---|---|
| Docker Scout | Docker官方扫描工具 |
| Trivy | 开源漏洞扫描器 |
| Clair | 容器漏洞扫描 |
| Anchore | 镜像安全分析 |
运行时安全工具 #
| 工具 | 说明 |
|---|---|
| Falco | 运行时安全监控 |
| Sysdig | 容器监控和安全 |
| Aqua | 容器安全平台 |
| Twistlock | 云原生安全 |
小结 #
本节学习了Docker安全最佳实践:
- 镜像安全配置
- 容器安全配置
- 网络安全配置
- 敏感信息管理
- 主机安全配置
- 安全配置清单
下一步 #
接下来,让我们学习 性能优化,了解Docker的性能优化方法。