Docker已成为云原生时代的标配,但"容器不等于安全"——默认配置下的Docker存在大量安全隐患。据统计,超过60%的容器安全事件源于错误配置。本文提供一套完整的容器安全加固方案。
一、镜像安全:从源头把控
1.1 使用可信基础镜像
# 优先使用官方镜像(Docker Official Images) docker pull nginx:alpine docker pull python:3.12-slim # 避免使用 latest 标签(不确定版本) # 错误示例: docker pull node # 不推荐 # 正确示例: docker pull node:20.12-alpine3.20 # 使用 distroless 镜像(最小攻击面) # distroless镜像只包含应用和运行时依赖,没有shell、包管理器等 FROM gcr.io/distroless/base-debian12
1.2 镜像漏洞扫描
# 使用 Trivy(推荐,开源免费) trivy image nginx:alpine trivy image --severity HIGH,CRITICAL nginx:alpine # 使用 Docker Scout(Docker内置) docker scout quickview nginx:alpine docker scout cves nginx:alpine # 集成到CI/CD # .github/workflows/scan.yml name: Container Scan on: [push] jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build image run: docker build -t app:latest . - name: Scan with Trivy uses: aquasecurity/trivy-action@master with: image-ref: 'app:latest' format: 'sarif' output: 'trivy-results.sarif'
1.3 镜像签名验证
# 使用cosign签名和验证 cosign sign --key cosign.key your-registry/app:latest cosign verify --key cosign.pub your-registry/app:latest # Docker Content Trust(DCT) export DOCKER_CONTENT_TRUST=1 docker pull nginx:alpine # 只拉取已签名的镜像
二、Dockerfile安全编写规范
2.1 最小化层数
# ❌ 不推荐:每个命令一层 FROM ubuntu:22.04 RUN apt-get update RUN apt-get install -y curl RUN apt-get install -y nginx RUN rm -rf /var/lib/apt/lists/* # ✅ 推荐:合并命令,减少层数 FROM ubuntu:22.04 RUN apt-get update && apt-get install -y \ curl \ nginx \ && rm -rf /var/lib/apt/lists/*
2.2 不以root运行
# ❌ 不推荐:默认root运行 FROM node:20-alpine COPY app /app CMD ["node", "app.js"] # ✅ 推荐:创建专用用户 FROM node:20-alpine RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser COPY --chown=appuser:appgroup app /app CMD ["node", "app.js"]
2.3 多阶段构建
# 构建阶段 FROM golang:1.22-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 go build -o server # 运行阶段(仅包含二进制文件) FROM alpine:3.20 RUN addgroup -S appgroup && adduser -S appuser -G appgroup COPY --from=builder /app/server /server USER appuser CMD ["/server"]
三、容器运行时安全
3.1 最小权限原则
# 禁止特权模式 docker run --security-opt=no-new-privileges \ --cap-drop=ALL \ --cap-add=NET_BIND_SERVICE \ -p 8080:80 nginx:alpine # Docker Compose配置 services: app: image: app:latest security_opt: - no-new-privileges:true cap_drop: - ALL cap_add: - NET_BIND_SERVICE read_only: true tmpfs: - /tmp
3.2 资源限制
docker run \ --memory=512m \ --memory-swap=1g \ --cpus=1.5 \ --pids-limit=100 \ --restart=on-failure:5 \ nginx:alpine
3.3 只读文件系统
docker run --read-only --tmpfs /tmp --tmpfs /var/run nginx:alpine
四、主机安全配置
# 配置文件 /etc/docker/daemon.json
{
"icc": false,
"userland-proxy": false,
"no-new-privileges": true,
"live-restore": true,
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"userns-remap": "default"
}
五、网络安全
5.1 网络隔离
# 创建自定义网络 docker network create --driver bridge --internal backend-net # 前端可访问外网,后端隔离 docker network create frontend-net docker run --network frontend-net --name web nginx:alpine docker run --network backend-net --name db postgres:16-alpine # 仅允许web访问db docker network connect backend-net web
5.2 TLS证书管理
# 使用反向代理统一管理TLS services: traefik: image: traefik:v3.0 command: - "--providers.docker" - "--entrypoints.websecure.address=:443" - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true" - "--certificatesresolvers.letsencrypt.acme.email=admin@example.com" - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" ports: - "443:443" volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" - "./letsencrypt:/letsencrypt"
六、日志与监控
# 配置容器日志轮转 docker run --log-opt max-size=10m --log-opt max-file=3 nginx # 使用 Falco 做运行时安全监控 docker run -d --name falco \ --security-opt apparmor:unconfined \ --cap-add=SYS_PTRACE \ -v /var/run/docker.sock:/host/var/run/docker.sock \ -v /proc:/host/proc:ro \ falcosecurity/falco:latest # Falco规则示例:检测容器内启动shell # /etc/falco/rules.d/shell-detection.yaml - rule: Shell in Container desc: Detect shell execution inside container condition: >spawned_process and container and proc.name in (bash, sh, zsh, dash) output: >Shell spawned in container (user=%user.name command=%proc.cmdline) priority: WARNING
七、Docker Bench Security 自动化检查
# 一键安全评估 docker run --rm \ --net host \ --pid host \ --userns host \ --cap-add audit_control \ -e DOCKER_CONTENT_TRUST=1 \ -v /etc:/etc \ -v /var/lib:/var/lib \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/lib/systemd:/usr/lib/systemd \ -v /etc/kubernetes:/etc/kubernetes \ docker/docker-bench-security # 重点关注输出中的 [WARN] 项目 # 常见WARN项目解决: # 1. WARN: 使用non-root用户 → USER appuser # 2. WARN: 开启资源限制 → --memory --cpus # 3. WARN: 使用只读文件系统 → --read-only # 4. WARN: 限制capabilities → --cap-drop=ALL
八、生产环境安全清单
| 类别 | 检查项 | 优先级 |
|---|---|---|
| 镜像 | 使用slim/alpine/distroless基础镜像 | 高 |
| 镜像 | 定期扫描已知漏洞(Trivy每周) | 高 |
| 镜像 | 多阶段构建减少体积 | 中 |
| Dockerfile | 非root用户运行 | 高 |
| Dockerfile | 不安装多余软件包 | 中 |
| 运行时 | 禁止特权模式 | 高 |
| 运行时 | 设置资源限制 | 高 |
| 运行时 | 只读文件系统 | 中 |
| 网络 | 自定义网络隔离 | 高 |
| 网络 | TLS证书管理 | 高 |
| 主机 | 用户命名空间隔离 | 中 |
| 监控 | Falco运行时监控 | 中 |
| 监控 | 日志轮转配置 | 低 |
容器安全不是单一维度的防护,而是从镜像构建到运行时监控的全链路工程。建议每周运行一次 Docker Bench Security,并将安全扫描集成到CI/CD流水线中。
推荐工具清单:Trivy(镜像扫描)、Cosign(签名验证)、Falco(运行时监控)、Docker Bench(安全基线)
相关文章:Linux服务器安全加固 | Nginx安全配置
原文链接:https://shibaolong.com/90/
更多安全技术文章请访问 月梦沉冰的安全博客

