You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统一管理audit-ci、Trivy、Dependabot的漏洞豁免规则?

统一管理Node.js Docker应用漏洞豁免的最优方案

针对你在三个检测环节分散维护漏洞白名单的痛点,核心解决方案是用单一配置文件集中管理所有豁免规则,配合自动化脚本同步到各检测工具,同时通过CI强制合规检查,具体步骤如下:

1. 定义统一的豁免配置文件

在代码库根目录创建.vulnerability-ignore.yml,用YAML格式支持注释和结构化信息,每个条目包含必要字段:

# 示例配置:每个条目需明确漏洞ID、适用工具、忽略原因、复查截止时间
- id: GHSA-xxxx-xxxx-xxxx
  tools: [audit-ci, dependabot]
  reason: "依赖包xxx无法升级至修复版本,当前应用未使用该漏洞涉及的文件读取API,无利用风险"
  expires: 2024-12-31

- id: CVE-2024-xxxx
  tools: [trivy, dependabot]
  reason: "基础镜像自带的系统依赖,镜像维护方已标记为误报,暂无修复计划"
  expires: 2024-10-31

2. 自动化同步到各检测工具

编写脚本将统一配置转换成对应工具的格式,集成到CI流程中:

针对audit-ci

用Node.js脚本提取适用的GHSA ID,生成audit-ci的配置文件(audit-ci支持--config参数读取JSON/YAML):

// scripts/generate-audit-ci-config.js
const fs = require('fs');
const yaml = require('js-yaml');

const ignoreList = yaml.load(fs.readFileSync('./.vulnerability-ignore.yml', 'utf8'));
const allowlist = ignoreList
  .filter(item => item.tools.includes('audit-ci') && item.id.startsWith('GHSA-'))
  .map(item => item.id);

fs.writeFileSync('./.audit-ci-config.json', JSON.stringify({ allowlist }, null, 2));

CI中替换原命令为:

npm run generate-audit-ci-config && audit-ci --config .audit-ci-config.json

针对Trivy

用Shell脚本提取适用的CVE ID,生成带注释的.trivyignore文件:

#!/bin/bash
# scripts/generate-trivyignore.sh
> .trivyignore # 清空旧文件

while IFS= read -r line; do
  if [[ $line == "- id: CVE-"* ]]; then
    cve=$(echo "$line" | cut -d' ' -f3)
    # 读取下一行的reason作为注释
    while IFS= read -r next_line; do
      if [[ $next_line == "  reason:"* ]]; then
        reason=$(echo "$next_line" | sed 's/  reason: "//;s/"$//')
        echo "# $reason" >> .trivyignore
        echo "$cve" >> .trivyignore
        break
      fi
    done
  fi
done < .vulnerability-ignore.yml

CI中构建镜像前执行:

chmod +x scripts/generate-trivyignore.sh && scripts/generate-trivyignore.sh

针对Dependabot

用GitHub Actions自动调用API,根据统一配置dismiss匹配的告警:

# .github/workflows/dependabot-auto-dismiss.yml
name: Auto-dismiss Dependabot alerts
on:
  schedule:
    - cron: '0 0 * * *' # 每日同步一次
  workflow_dispatch: # 支持手动触发

jobs:
  dismiss:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20 }
      - run: npm install @octokit/rest js-yaml
      - run: node scripts/dismiss-dependabot-alerts.js
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          REPO_OWNER: ${{ github.repository_owner }}
          REPO_NAME: ${{ github.event.repository.name }}

对应的处理脚本:

// scripts/dismiss-dependabot-alerts.js
const { Octokit } = require('@octokit/rest');
const fs = require('fs');
const yaml = require('js-yaml');

const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
const ignoreList = yaml.load(fs.readFileSync('./.vulnerability-ignore.yml', 'utf8'));
const dependabotIgnores = ignoreList.filter(item => item.tools.includes('dependabot'));

async function processAlerts() {
  const { data: alerts } = await octokit.rest.dependabot.listAlertsForRepo({
    owner: process.env.REPO_OWNER,
    repo: process.env.REPO_NAME,
    state: 'open'
  });

  for (const alert of alerts) {
    const match = dependabotIgnores.find(item => 
      item.id === alert.security_advisory.id || item.id === alert.cve_id
    );
    if (match) {
      await octokit.rest.dependabot.updateAlert({
        owner: process.env.REPO_OWNER,
        repo: process.env.REPO_NAME,
        alert_number: alert.number,
        state: 'dismissed',
        dismissal_reason: 'won\'t_fix',
        dismissal_comment: match.reason
      });
      console.log(`Dismissed alert ${alert.number}: ${match.reason}`);
    }
  }
}

processAlerts().catch(err => {
  console.error('Error:', err);
  process.exit(1);
});

3. 强制合规检查

在CI预合并步骤中添加验证脚本,确保每个豁免条目都包含必要字段:

// scripts/validate-ignore-list.js
const fs = require('fs');
const yaml = require('js-yaml');

try {
  const ignoreList = yaml.load(fs.readFileSync('./.vulnerability-ignore.yml', 'utf8'));
  const errors = [];

  ignoreList.forEach((item, idx) => {
    const entryNum = idx + 1;
    if (!item.id) errors.push(`条目${entryNum}缺少漏洞ID`);
    if (!item.tools?.length) errors.push(`条目${entryNum}未指定适用工具`);
    if (!item.reason?.trim()) errors.push(`条目${entryNum}缺少忽略原因`);
  });

  if (errors.length) {
    console.error('漏洞豁免列表验证失败:');
    errors.forEach(err => console.error(`- ${err}`));
    process.exit(1);
  }
  console.log('漏洞豁免列表验证通过');
} catch (err) {
  console.error('配置文件解析失败:', err.message);
  process.exit(1);
}

CI中执行:

npm run validate-ignore-list

方案优势

  • 单一数据源:所有豁免规则集中维护,无需跨三个平台操作
  • 可追溯性:每个条目附带原因和复查时间,避免无理由忽略
  • 自动化同步:脚本自动适配各工具格式,减少手动重复工作
  • 强制合规:CI检查确保规则完整性,避免遗漏必要信息

内容的提问来源于stack exchange,提问作者cis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:21:21