Docker 生产安全指南:镜像扫描、非 root 运行、Secret 管理与 Registry

Docker 生产环境安全加固完整方案:镜像漏洞扫描(Trivy/Snyk)、非 root 用户运行、只读文件系统、Secret 管理(BuildKit)、私有 Registry(Harbor)、运行时安全(seccomp/AppArmor)。

Docker 容器不是天然安全的:默认以 root 运行、镜像可能包含漏洞、构建时 Secret 泄露。本文覆盖 Docker 生产环境的安全加固全套方案。


一、镜像安全扫描

# Trivy(最受欢迎的开源扫描器)
trivy image my-app

# Snyk(商业, generous free tier)
snyk container test my-app

# Docker Scout(Docker 官方)
docker scout quickview my-app
docker scout cves my-app

扫描内容:OS 包漏洞(CVE)、npm/pip 依赖漏洞、不安全的配置(如 root 运行)。


二、运行时安全加固

2.1 非 root 运行

RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
CMD ["node", "server.js"]

2.2 只读文件系统

docker run --read-only -v /tmp:/tmp my-app

2.3 资源限制(防 DoS)

docker run --memory=512m --cpus=1.0 my-app

2.4 禁用特权模式

# ❌ 危险:容器获得宿主机 root 权限
docker run --privileged my-app

# ✅ 只授予需要的 cap
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app

三、Secret 管理

3.1 BuildKit Secret(构建时密钥不写入镜像)

# syntax=docker/dockerfile:1
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc \
    npm ci
COPY . .
RUN npm run build
# 构建时传入 secret(不写入镜像层)
DOCKER_BUILDKIT=1 docker build --secret id=npmrc,src=$HOME/.npmrc .

3.2 运行时 Secret(Docker Swarm / K8s Secret)

# Docker Swarm
echo "my-password" | docker secret create db_password -
docker service create --secret db_password my-api

四、私有 Registry(Harbor)

# 自建 Harbor(企业级 Registry + 漏洞扫描 + RBAC)
docker-compose -f harbor.yml up -d

# 推送镜像到私有 Registry
docker tag my-app harbor.example.com/my-project/my-app:v1.0
docker push harbor.example.com/my-project/my-app:v1.0

常见问题(FAQ)

Docker 容器会被黑客攻击吗?

会。如果容器以 root 运行且应用程序存在漏洞,攻击者可能获得容器内 root 权限。虽然突破到宿主机需要额外的内核漏洞(容器逃逸),但不应轻视容器安全。

扫描出漏洞怎么办?

  1. 更新基础镜像(docker pull node:20-alpine
  2. 更新应用依赖(npm audit fix
  3. 如果漏洞无修复版本,评估风险(有些 CVE 不影响实际使用场景)

相关阅读

下一篇 →

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「saas」更多文章