← 返回首页
🔒

Docker安全实践

📂 devops ⏱ 2 min 225 words

Docker安全实践

容器安全原则

  1. 最小权限原则
  2. 镜像安全扫描
  3. 网络隔离
  4. 资源限制
  5. 日志审计

镜像安全

使用可信镜像

# 使用官方镜像
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安全是一个系统工程,需要从镜像构建、运行时配置、网络隔离等多个层面进行防护。