performing-container-image-hardening

本技能涵盖通过最小化攻击面、移除不必要软件包、实施多阶段构建、配置非 root 用户, 以及应用 CIS Docker 基准建议来加固容器镜像,生成安全的生产就绪镜像。

9 stars

Best use case

performing-container-image-hardening is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

本技能涵盖通过最小化攻击面、移除不必要软件包、实施多阶段构建、配置非 root 用户, 以及应用 CIS Docker 基准建议来加固容器镜像,生成安全的生产就绪镜像。

Teams using performing-container-image-hardening should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/performing-container-image-hardening/SKILL.md --create-dirs "https://raw.githubusercontent.com/killvxk/cybersecurity-skills-zh/main/skills/performing-container-image-hardening/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/performing-container-image-hardening/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How performing-container-image-hardening Compares

Feature / Agentperforming-container-image-hardeningStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

本技能涵盖通过最小化攻击面、移除不必要软件包、实施多阶段构建、配置非 root 用户, 以及应用 CIS Docker 基准建议来加固容器镜像,生成安全的生产就绪镜像。

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# 执行容器镜像加固

## 适用场景

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

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

## 前置条件

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

## 工作流程

### 步骤 1:使用多阶段构建最小化镜像体积

```dockerfile
# 构建阶段,包含所有依赖
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"]
```

### 步骤 2:使用 Distroless 基础镜像

```dockerfile
# 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"]
```

### 步骤 3:移除不必要的组件

```dockerfile
# 加固镜像清单
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
```

### 步骤 4:配置只读文件系统

```yaml
# 配置只读根文件系统的 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
```

### 步骤 5:通过摘要锁定基础镜像

```dockerfile
# 通过精确摘要固定镜像以确保可重复性
FROM python:3.12-slim-bookworm@sha256:abcdef1234567890 AS production
# 确保每次使用完全相同的基础镜像
```

### 步骤 6:通过自动化扫描验证加固效果

```bash
# 使用 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/容器级别的安全设置,控制权限、文件系统和能力 |

## 工具与系统

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

## 典型场景

### 场景:将 1.2GB 的 Python 镜像缩减至 150MB 以下

**背景**:数据科学团队使用 `python:3.12` 作为基础镜像(1.2GB),其中包含科学计算软件包。该镜像因不必要的系统软件包导致已知 CVE 超过 200 个。

**方案**:
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 存在兼容性问题。

## 输出格式

```
容器镜像加固报告
==================================
镜像: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%
```

Related Skills

securing-container-registry-with-harbor

9
from killvxk/cybersecurity-skills-zh

Harbor 是一个开源容器镜像仓库,提供安全功能包括漏洞扫描(集成 Trivy)、镜像签名(Notary/Cosign)、RBAC、内容信任策略(Content Trust)、复制和审计日志。配置这些功能以强制执行镜像来源验证、防止有漏洞镜像部署并维护仓库访问控制。

securing-container-registry-images

9
from killvxk/cybersecurity-skills-zh

通过使用 Trivy 和 Grype 实施漏洞扫描、使用 Cosign 和 Sigstore 强制执行镜像签名、配置镜像仓库访问控制,以及构建阻止部署未扫描或未签名镜像的 CI/CD 流水线,来保护容器仓库(Container Registry)中的镜像安全。

scanning-docker-images-with-trivy

9
from killvxk/cybersecurity-skills-zh

Trivy 是 Aqua Security 开源的综合性漏洞扫描器,用于检测容器镜像中操作系统软件包、语言特定依赖项的漏洞、错误配置、密钥和许可证违规,并集成到 CI/CD 流水线,支持 SARIF、CycloneDX 和 SPDX 等多种输出格式。

scanning-containers-with-trivy-in-cicd

9
from killvxk/cybersecurity-skills-zh

本技能涵盖将 Aqua Security 的 Trivy 扫描器集成到 CI/CD 流水线中,用于全面的容器镜像漏洞检测。包括扫描 Docker 镜像中的操作系统包和应用依赖 CVE、检测 Dockerfile 中的错误配置、扫描文件系统和 Git 仓库,以及建立基于严重性的质量门禁以阻止有漏洞的镜像部署。

scanning-container-images-with-grype

9
from killvxk/cybersecurity-skills-zh

使用 Anchore Grype 扫描容器镜像的已知漏洞(Vulnerability),支持基于 SBOM 的匹配和可配置的严重性阈值。

performing-yara-rule-development-for-detection

9
from killvxk/cybersecurity-skills-zh

通过识别可执行文件中的唯一字节模式、字符串和行为指标,开发精准的 YARA 恶意软件检测规则,同时将误报率降至最低。

performing-wireless-security-assessment-with-kismet

9
from killvxk/cybersecurity-skills-zh

使用 Kismet 通过被动射频监控进行无线网络安全评估,检测流氓接入点(Rogue AP)、隐藏 SSID、弱加密和未授权客户端。

performing-wireless-network-penetration-test

9
from killvxk/cybersecurity-skills-zh

执行无线网络渗透测试,通过捕获握手包、破解 WPA2/WPA3 密钥、检测流氓接入点以及使用 Aircrack-ng 和相关工具测试无线网络分段,评估 WiFi 安全性。

performing-windows-artifact-analysis-with-eric-zimmerman-tools

9
from killvxk/cybersecurity-skills-zh

使用 Eric Zimmerman 的开源 EZ Tools 套件(包括 KAPE、MFTECmd、PECmd、LECmd、JLECmd 和 Timeline Explorer)执行全面的 Windows 取证制品分析,解析注册表 hive、预取文件、事件日志和文件系统元数据。

performing-wifi-password-cracking-with-aircrack

9
from killvxk/cybersecurity-skills-zh

在授权无线安全评估中捕获 WPA/WPA2 握手包,并使用 aircrack-ng、hashcat 和字典攻击进行离线密码破解, 以评估密码短语强度和无线网络安全状况。

performing-web-cache-poisoning-attack

9
from killvxk/cybersecurity-skills-zh

在授权安全测试期间,通过未纳入缓存键的头部和参数毒化缓存响应,利用 Web 缓存机制向其他用户投递恶意内容。

performing-web-cache-deception-attack

9
from killvxk/cybersecurity-skills-zh

通过利用 CDN 缓存层与源服务器之间的路径规范化差异,执行 Web 缓存欺骗攻击,从而缓存并获取敏感的已认证内容。