mcpField
P
performing-container-image-hardening

performing-container-image-hardening

github.com/mukul975安全35.2k100 次安装8 周前更新
代码仓库

关于 performing-container-image-hardening

面向生产工作负载团队的容器镜像加固技能,将镜像精简、运行限制、基础镜像固定和扫描验证组织为一套流程。

主要功能

  1. 01多阶段构建指引
  2. 02精简与 distroless 基础镜像
  3. 03移除未使用组件
  4. 04只读文件系统与非 root 运行
  5. 05按摘要固定基础镜像
  6. 06使用 Trivy 和 CIS 检查验证

适用场景

  1. 01缩小容器镜像攻击面
  2. 02准备生产用镜像
  3. 03检查 CIS Docker Benchmark 符合情况
  4. 04迁移至精简或 distroless 镜像

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill performing-container-image-hardening

安装后在 Claude Code 中输入/performing-container-image-hardening确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

详细介绍

执行容器镜像加固

何时使用

  • 在构建需要最小攻击面的生产容器镜像时
  • 当合规性要求容器配置遵循 CIS Docker Benchmark 时
  • 在减小镜像体积以尽量减少未使用软件包带来的漏洞暴露时
  • 在为容器化工作负载实施纵深防御时
  • 在从臃肿的基础镜像迁移到 distroless 或最小化镜像时

不要使用于运行时容器安全监控(使用 Falco)、主机级 Docker 守护进程加固(使用 CIS Docker Benchmark 主机检查),或容器编排安全(使用 Kubernetes 安全扫描)。

前置条件

  • 用于多阶段构建的 Docker 或 BuildKit
  • 基础镜像选项:distroless、Alpine、slim 或 scratch
  • 用于验证的容器扫描工具(Trivy)
  • CIS Docker Benchmark 参考

工作流

步骤 1:使用多阶段构建以最小化镜像体积
# Build stage with all dependencies
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/

# Production stage with minimal base
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"]
步骤 2:使用 Distroless 基础镜像
# Go application with 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"]
步骤 3:移除不必要的组件
# Hardened image checklist
FROM ubuntu:24.04 AS base

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
      ca-certificates \
      libssl3 && \
    # Remove package manager to prevent runtime package installation
    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

# Remove shells if not needed
RUN rm -f /bin/sh /bin/bash /usr/bin/sh 2>/dev/null || true

# Remove setuid/setgid binaries
RUN find / -perm /6000 -type f -exec chmod a-s {} + 2>/dev/null || true
步骤 4:配置只读文件系统
# Kubernetes deployment with read-only root filesystem
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
步骤 5:通过摘要固定基础镜像
# Pin to exact image digest for reproducibility
FROM python:3.12-slim-bookworm@sha256:abcdef1234567890 AS production
# This ensures the exact same base image is used every time
步骤 6:使用自动化扫描验证加固效果
# Scan hardened image with Trivy
trivy image --severity HIGH,CRITICAL hardened-app:latest

# Check CIS Docker Benchmark compliance
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  aquasec/docker-bench-security

# Verify no root processes
docker run --rm hardened-app:latest whoami
# Expected: appuser (NOT root)

# Verify read-only filesystem
docker run --rm hardened-app:latest touch /test 2>&1
# Expected: Read-only file system error

关键概念

术语定义
多阶段构建使用多个 FROM 阶段将构建与运行时分离的 Docker 构建技术,可减小最终镜像体积
DistrolessGoogle 维护的最小化容器镜像,仅包含应用程序和运行时依赖
非 Root 用户以非特权用户身份运行容器进程,以限制容器逃逸漏洞的影响
只读根文件系统将容器根文件系统挂载为只读,以防止运行时修改
镜像摘要唯一标识确切镜像版本的 SHA256 哈希值,比可变标签更精确
Scratch 镜像用于无需操作系统的静态编译二进制的空 Docker 基础镜像
安全上下文Kubernetes Pod/容器级安全设置,用于控制权限、文件系统和能力

工具与系统

  • Docker BuildKit:支持多阶段构建和构建密钥的高级 Docker 构建引擎
  • Distroless Images:Google 的最小化容器基础镜像(static、base、java、python、nodejs)
  • docker-bench-security:检查 CIS Docker Benchmark 合规性的脚本
  • Trivy:容器镜像漏洞和错误配置扫描器
  • Hadolint:强制执行最佳实践的 Dockerfile 代码检查工具

常见场景

场景:将 1.2GB 的 Python 镜像减小到 150MB 以下

背景:一个数据科学团队使用 python:3.12 作为基础镜像(1.2GB),并安装了科学计算软件包。该镜像因不必要的系统软件包而存在 200 多个已知 CVE。

方法:

  1. 切换到 python:3.12-slim-bookworm 作为基础镜像(150MB),仅安装所需的系统库
  2. 使用多阶段构建:在构建阶段编译 C 扩展,将 wheel 复制到生产环境
  3. 将 numpy、pandas 和 scipy 固定为预构建的 wheel,以避免生产环境中出现构建依赖
  4. 从最终镜像中移除 pip、setuptools 和 wheel
  5. 创建非 root 用户并设置文件系统权限
  6. 使用 Trivy 验证:预期 CVE 数量从 200 多个降至 20 个以下

陷阱:某些 Python 软件包在运行时需要共享库(libgomp、libstdc++)。移除系统软件包后,请彻底测试应用程序。基于 Alpine 的镜像使用 musl libc,这可能会导致与 numpy 和 pandas 的兼容性问题。

输出格式

Container Image Hardening Report
==================================
Image: app:hardened
Base: python:3.12-slim-bookworm
Date: 2026-02-23

SIZE COMPARISON:
  Before hardening: 1,247 MB (python:3.12)
  After hardening:  143 MB  (python:3.12-slim + multi-stage)
  Reduction: 88.5%

SECURITY CHECKS:
  [PASS] Non-root user configured (appuser:1000)
  [PASS] HEALTHCHECK instruction present
  [PASS] No setuid/setgid binaries found
  [PASS] Package manager removed
  [PASS] Base image pinned by digest
  [PASS] No shell access (/bin/sh removed)
  [WARN] /tmp writable (emptyDir mounted)

VULNERABILITY COMPARISON:
  Before: 234 CVEs (12 Critical, 45 High)
  After:  18 CVEs (0 Critical, 3 High)
  Reduction: 92.3%

评论

支持 Markdown