安全最佳实践 #

安全威胁 #

常见安全威胁 #

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的性能优化方法。