Hardens Docker container images using multi-stage builds, distroless bases, non-root users, package removal, and CIS benchmarks for minimal attack surface and production security.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
- 构建需要最小攻击面的生产容器镜像时
Hardens Docker container images via multi-stage builds, distroless bases, non-root users, package removal, and CIS benchmarks for minimal attack surface in production.
Hardens Docker container images using multi-stage builds, distroless bases, non-root users, and CIS Benchmark to minimize attack surface for production deployments.
Hardens Docker containers for production per CIS Docker Benchmark v1.8.0, covering daemon config, secure Dockerfiles with multi-stage builds, and runtime flags for least privilege and isolation.
Share bugs, ideas, or general feedback.
不适用于:运行时容器安全监控(使用 Falco)、主机级 Docker 守护进程加固(使用 CIS Docker 基准主机检查)或容器编排安全(使用 Kubernetes 安全扫描)。
# 构建阶段,包含所有依赖
FROM python:3.12-bookworm AS builder
WORKDIR /build
COPY requirements.txt .
RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
COPY src/ ./src/
RUN python -m compileall src/
# 生产阶段,使用最小基础镜像
FROM python:3.12-slim-bookworm AS production
RUN apt-get update && \
apt-get install -y --no-install-recommends libpq5 && \
rm -rf /var/lib/apt/lists/* && \
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false
COPY --from=builder /install /usr/local
COPY --from=builder /build/src /app/src
RUN groupadd -r appuser && useradd -r -g appuser -d /app -s /sbin/nologin appuser
RUN chown -R appuser:appuser /app
USER appuser
WORKDIR /app
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8080/health')" || exit 1
EXPOSE 8080
ENTRYPOINT ["python", "-m", "src.main"]
# Go 应用使用 distroless
FROM golang:1.22 AS builder
WORKDIR /app
COPY go.* ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o /server .
FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=builder /server /server
USER nonroot:nonroot
ENTRYPOINT ["/server"]
# 加固镜像清单
FROM ubuntu:24.04 AS base
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates \
libssl3 && \
# 移除包管理器以防止运行时安装软件包
apt-get purge -y --auto-remove apt dpkg && \
rm -rf /var/lib/apt/lists/* \
/var/cache/apt/* \
/tmp/* \
/var/tmp/* \
/usr/share/doc/* \
/usr/share/man/* \
/usr/share/info/* \
/root/.cache
# 如不需要,移除 shell
RUN rm -f /bin/sh /bin/bash /usr/bin/sh 2>/dev/null || true
# 移除 setuid/setgid 二进制文件
RUN find / -perm /6000 -type f -exec chmod a-s {} + 2>/dev/null || true
# 配置只读根文件系统的 Kubernetes Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: hardened-app
spec:
template:
spec:
securityContext:
runAsNonRoot: true
runAsUser: 65534
fsGroup: 65534
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: app:hardened
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
volumeMounts:
- name: tmp
mountPath: /tmp
- name: cache
mountPath: /app/cache
volumes:
- name: tmp
emptyDir:
sizeLimit: 100Mi
- name: cache
emptyDir:
sizeLimit: 50Mi
# 通过精确摘要固定镜像以确保可重复性
FROM python:3.12-slim-bookworm@sha256:abcdef1234567890 AS production
# 确保每次使用完全相同的基础镜像
# 使用 Trivy 扫描已加固的镜像
trivy image --severity HIGH,CRITICAL hardened-app:latest
# 检查 CIS Docker 基准合规性
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/docker-bench-security
# 验证无 root 进程
docker run --rm hardened-app:latest whoami
# 预期输出:appuser(非 root)
# 验证只读文件系统
docker run --rm hardened-app:latest touch /test 2>&1
# 预期输出:只读文件系统错误
| 术语 | 定义 |
|---|---|
| 多阶段构建(Multi-Stage Build) | Docker 构建技术,使用多个 FROM 阶段分离构建和运行时,减小最终镜像体积 |
| Distroless | Google 维护的最小化容器镜像,仅包含应用程序和运行时依赖 |
| 非 Root 用户(Non-Root User) | 以非特权用户运行容器进程,降低容器逃逸漏洞的影响 |
| 只读根文件系统(Read-Only Root) | 将容器根文件系统挂载为只读,防止运行时修改 |
| 镜像摘要(Image Digest) | 唯一标识确切镜像版本的 SHA256 哈希,比可变标签更精确 |
| Scratch 镜像 | 空 Docker 基础镜像,用于无需操作系统的静态编译二进制文件 |
| 安全上下文(Security Context) | Kubernetes Pod/容器级别的安全设置,控制权限、文件系统和能力 |
背景:数据科学团队使用 python:3.12 作为基础镜像(1.2GB),其中包含科学计算软件包。该镜像因不必要的系统软件包导致已知 CVE 超过 200 个。
方案:
python:3.12-slim-bookworm 基础镜像(150MB),仅安装所需系统库常见陷阱:部分 Python 软件包运行时需要共享库(libgomp、libstdc++)。移除系统软件包后要对应用进行全面测试。基于 Alpine 的镜像使用 musl libc,可能与 numpy 和 pandas 存在兼容性问题。
容器镜像加固报告
==================================
镜像:app:hardened
基础镜像:python:3.12-slim-bookworm
日期:2026-02-23
体积对比:
加固前:1,247 MB(python:3.12)
加固后:143 MB(python:3.12-slim + 多阶段构建)
缩减比例:88.5%
安全检查:
[通过] 已配置非 root 用户(appuser:1000)
[通过] 已配置 HEALTHCHECK 指令
[通过] 未发现 setuid/setgid 二进制文件
[通过] 已移除包管理器
[通过] 基础镜像已通过摘要锁定
[通过] 无 shell 访问(已移除 /bin/sh)
[警告] /tmp 可写(已挂载 emptyDir)
漏洞对比:
加固前:234 个 CVE(12 个严重,45 个高危)
加固后:18 个 CVE(0 个严重,3 个高危)
减少比例:92.3%