mcpField
C
container-security

container-security

github.com/snyk安全68147 次安装1 周前更新
代码仓库

关于 container-security

container-security 是一项容器镜像扫描技能,可发现漏洞和 Dockerfile 问题并指导修复。它涵盖操作系统软件包、应用依赖及基础镜像问题。

主要功能

  1. 01扫描本地、镜像仓库或归档镜像
  2. 02检查操作系统软件包和应用依赖
  3. 03区分基础镜像漏洞
  4. 04按严重性筛选问题
  5. 05提供修复及 Dockerfile 建议
  6. 06重建镜像后重新扫描

适用场景

  1. 01部署前检查容器镜像
  2. 02判断漏洞来自基础镜像还是新增层
  3. 03规划软件包、依赖或基础镜像更新
  4. 04重建镜像后验证修复

MCP 相关

该技能说明如何调用 `mcp_snyk_snyk_container_scan` 扫描容器镜像。

安装

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

$npx skills add https://github.com/snyk/studio-recipes --skill container-security

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

附带文件references/base-image-recommendations.mdreferences/dockerfile-best-practices.md

详细介绍

容器安全扫描器

容器镜像全面安全分析指南,涵盖操作系统漏洞、应用依赖项和 Dockerfile 最佳实践。

核心原则:从基础开始保护容器——使用安全的基础镜像、尽量减少软件包数量、不存在漏洞。


快速开始

1. Identify image to scan (local, registry, or archive)
2. Run snyk_container_scan with image name
3. Analyze results: OS packages + application deps
4. Provide remediation guidance
5. Optionally fix Dockerfile issues

阶段 1:识别镜像

步骤 1.1:解析用户输入

从用户请求中提取镜像引用(例如,myapp:latest、nginx:1.25、gcr.io/project/app:v1、sha256:abc123... 或 ./image.tar)。

步骤 1.2:确定扫描范围

询问或推断:

  • 应用漏洞:是否包含应用依赖项?(默认:v1.1090.0+ 中包含)
  • 基础镜像:是否单独分析基础镜像漏洞?(有助于了解哪些部分由你控制)
  • 平台:对于多架构镜像,使用哪个平台?(linux/amd64、linux/arm64)

阶段 2:执行扫描

步骤 2.1:基本扫描

调用 mcp_snyk_snyk_container_scan,并传入:

  • image:镜像名称或路径
步骤 2.2:高级扫描选项

如需更全面的分析,请调用 mcp_snyk_snyk_container_scan,并传入:

  • image:镜像名称
  • file:Dockerfile 路径(可提供更好的修复建议)
  • app_vulns:true(扫描应用依赖项)
  • severity_threshold:"high"(仅筛选高危和严重漏洞)
步骤 2.3:基础镜像分析

要区分继承而来的漏洞和新增漏洞:

  1. 调用 mcp_snyk_snyk_container_scan,传入 image 和 exclude_base_image_vulns: true——仅显示由你添加的层引入的漏洞。
  2. 不传入该标记再次调用——显示包含基础操作系统在内的完整情况。

阶段 3:分析结果

步骤 3.1:分类调查结果
来源描述你的控制方式
基础操作系统软件包由基础镜像安装更换基础镜像
其他操作系统软件包通过 apt/yum 安装更新或移除
应用依赖项Node 模块、Python 软件包更新版本
Dockerfile 问题配置错误直接修复
步骤 3.2:生成摘要
## Container Scan Results: [image:tag]

### Overview
| Category | Critical | High | Medium | Low |
|----------|----------|------|--------|-----|
| OS Packages | X | Y | Z | W |
| App Dependencies | A | B | C | D |
| **Total** | X+A | Y+B | Z+C | W+D |

### Base Image Analysis
- **Base**: [base image detected]
- **Vulnerabilities from base**: [count]
- **Vulnerabilities you added**: [count]

### Top Priority Issues

| Severity | Package | Vulnerability | Fix Available |
|----------|---------|---------------|---------------|
| Critical | openssl | CVE-2024-XXXX | Yes - 3.0.12 |
| High | libcurl | CVE-2024-YYYY | Yes - 8.5.0 |
步骤 3.3:确定修复策略

操作系统软件包:在 Dockerfile 中更新软件包、升级基础镜像,或使用 distroless/精简基础镜像。

应用依赖项:更新源清单中的版本,并使用更新后的依赖项重新构建镜像。

没有可用的修复方案:记录已接受的风险,考虑使用替代软件包,或等待上游修复。


阶段 4:修复指导

步骤 4.1:升级基础镜像

如果基础镜像存在漏洞:

## Base Image Recommendation

**Current**: node:16-alpine
**Vulnerabilities**: 15 (3 Critical, 5 High)

**Recommended**: node:20-alpine
**Vulnerabilities**: 2 (0 Critical, 1 High)

### Dockerfile Change
```dockerfile
# Before
FROM node:16-alpine

# After
FROM node:20-alpine
迁移说明
  • Node 20 在 [list] 中存在不兼容变更
  • 部署前进行全面测试

### Step 4.2: Package Updates

For individual package vulnerabilities:

软件包修复:openssl

当前版本:3.0.8 存在漏洞:CVE-2024-XXXX(严重) 修复版本:3.0.12

添加到 Dockerfile
# Add before your application layer
RUN apk update && apk upgrade openssl

### Step 4.3: Application Dependency Fixes

应用依赖项修复

软件包:lodash(通过 npm 安装) 当前版本:4.17.15 修复版本:4.17.21

步骤
  1. 更新 package.json: "lodash": "^4.17.21"
  2. 重新构建镜像:docker build -t myapp:fixed .
  3. 验证修复:snyk container test myapp:fixed

### Step 4.4: Dockerfile Best Practices

Key improvements to recommend:

```dockerfile
# 1. Pin specific tags (not latest)
FROM node:20.10.0-alpine3.19

# 2. Run as non-root
RUN addgroup -g 1001 appgroup && \
    adduser -u 1001 -G appgroup -D appuser
USER appuser

# 3. Multi-stage builds (smaller image, fewer vulns)
FROM node:20 AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build

FROM node:20-alpine
COPY --from=builder /app/dist /app
CMD ["node", "/app/index.js"]

# 4. Minimize packages
RUN apt-get install -y --no-install-recommends curl

阶段 5:验证

步骤 5.1:重新构建镜像
# Rebuild with no cache to ensure fresh packages
docker build --no-cache -t myapp:fixed .
步骤 5.2:重新扫描

调用 mcp_snyk_snyk_container_scan,并传入:

  • image:myapp:fixed
  • file:./Dockerfile
步骤 5.3:比较结果
## Fix Verification

| Metric | Before | After | Change |
|--------|--------|-------|--------|
| Critical | 3 | 0 | -3 ✅ |
| High | 5 | 1 | -4 ✅ |
| Medium | 12 | 8 | -4 ✅ |
| Total | 20 | 9 | -11 ✅ |

### Remaining Issues
- 1 High: No fix available upstream (document risk)
- 8 Medium: Low priority (schedule for next sprint)

端到端示例

用户:“扫描我的 app:latest 镜像并帮我修复。”

步骤 1 — 运行扫描:

mcp_snyk_snyk_container_scan(image="app:latest", app_vulns=true)

步骤 2 — 工具返回(输出示例):

{
  "summary": "Found 18 vulnerabilities (2 Critical, 6 High, 10 Medium)",
  "baseImage": "node:16-alpine",
  "vulnerabilities": [
    { "severity": "critical", "pkgName": "openssl", "version": "3.0.8",
      "fixedIn": "3.0.12", "id": "CVE-2024-0001" },
    { "severity": "high", "pkgName": "lodash", "version": "4.17.15",
      "fixedIn": "4.17.21", "id": "CVE-2021-23337" }
  ]
}

步骤 3 — 提供结构化回复:

## Scan Results: app:latest
Base image: node:16-alpine | 2 Critical · 6 High · 10 Medium

### Immediate Actions
1. Upgrade base image → node:20-alpine (eliminates ~14 vulns)
2. Pin openssl ≥ 3.0.12 in Dockerfile (CVE-2024-0001, Critical)
3. Update lodash to ^4.17.21 in package.json (CVE-2021-23337, High)

### Dockerfile patch
FROM node:20-alpine        # was node:16-alpine
RUN apk add --no-cache openssl>=3.0.12

步骤 4 — 应用修复后,重新构建并扫描以确认问题已解决。


常见场景

场景 1:“扫描我的 Docker 镜像”
1. Invoke snyk_container_scan(image="app:latest")
2. Summarize findings by category
3. Recommend highest-priority fixes
4. Provide Dockerfile changes
场景 2:“保护我的 Dockerfile”
1. Review Dockerfile for best practices
2. Build image if not already built
3. Invoke snyk_container_scan(image=..., file="./Dockerfile")
4. Combine scan results with Dockerfile review
5. Provide unified remediation
场景 3:“寻找更安全的基础镜像”
1. Identify current base image and vulnerabilities
2. Scan alternative base images
3. Compare vulnerability counts
4. Recommend best option with migration notes

基础镜像快速参考

运行时推荐基础镜像说明
Node.jsnode:20-alpine最小,但可能缺少某些库
Node.jsnode:20-slim基于 Debian,兼容性更好
Pythonpython:3.12-slim平衡性良好
Pythonpython:3.12-alpine最小
Javaeclipse-temurin:21-jre-alpine仅包含 JRE
Gogcr.io/distroless/static无 shell,攻击面最小
.NETmcr.microsoft.com/dotnet/aspnet:8.0-alpine仅包含运行时

Distroless 选项(gcr.io/distroless/):static(Go/Rust)、base(大多数语言)、java、nodejs——均无 shell,攻击面最小。


错误处理

错误解决方案
本地未找到镜像docker pull <image> · 检查名称拼写 · 确认可访问镜像仓库
需要镜像仓库身份验证docker login <registry> · 确认凭据和权限
扫描超时重试 · 先在本地拉取镜像 · 改为扫描 .tar 归档文件

约束

  1. 部署前扫描:切勿部署未经扫描的镜像
  2. 固定版本:使用特定镜像标签,而非 latest
  3. 记录例外情况:如果漏洞无法修复,请记录原因
  4. 定期重新扫描:应每周重新扫描镜像,以发现新的 CVE
  5. 多阶段构建:优先使用更小的生产镜像

评论

支持 Markdown