解释在 air-gapped 环境离线运行安全审计的方法

解读

面试官想知道你在“完全断网、无法访问 npm 源与漏洞库”的中国企业内网场景下,如何用 Grunt 体系完成前端依赖的安全审计,并给出可落地的离线闭环流程。重点考察:

  1. 对 air-gapped 概念的理解深度
  2. 对 Grunt 插件生态的熟悉度
  3. 对国内常见离线安全规范(等保 2.0、关基、信创)的适配经验

知识点

  1. air-gapped 定义:物理隔离、无公网、USB 白名单、中间机杀毒、堡垒机审计
  2. Grunt 侧安全审计范围
    • 第三方 npm 包已知漏洞(CVE/CNVD)
    • 自定义 Grunt 插件代码注入风险
    • 构建产物是否夹带恶意资源(如 crypto-miner)
  3. 离线漏洞库来源
    • 国家信息安全漏洞共享平台(CNVD)离线 XML
    • 工信部信创漏洞库光盘
    • 企业私有 Nexus/Verdaccio 缓存的 npm 审计库(提前同步)
  4. Grunt 插件选型
    • grunt-yarn-audit-offline(调用本地漏洞库)
    • grunt-snyk-offline(支持 json 离线快照)
    • grunt-eslint-security(内置 OWASP Top10 规则包,可本地加载)
  5. 构建机加固
    • 使用国密算法对 Gruntfile.js、插件包做 SM3 摘要,存至堡垒机
    • 通过麒麟或统信 OS的 RPM 签名验证 grunt-cli 二进制

答案

步骤一:前置准备

  1. 能访问外网的中间机上运行 npm audit --json > audit-full.json,并调用 snyk-to-html 生成离线快照;把 snapshot 和 CNVD 离线库刻录到一次性光盘
  2. 将 Grunt 构建所需全部 tgz(含 grunt 插件及依赖)通过 npm pack 打为离线包,连同 package-lock.json 一并刻盘,防止在内网阶段二次下载

步骤二:air-gapped 内网流程

  1. 把光盘文件导入白名单 USB,经堡垒机杀毒后拷贝到构建机
  2. 在构建机本地搭建 Verdaccio 私有仓库,将光盘里的 tgz 发布上去;配置 .npmrc 指向 registry=http://localhost:4873
  3. 项目根目录运行 grunt audit-offline 任务,任务配置如下:
    • 使用 grunt-yarn-audit-offline 读取光盘里的 audit-full.json
    • 使用 grunt-snyk-offline 对比本地 node_modules 与快照,输出 vulnerabilities.md
    • 若发现高危 CVE,任务失败并返回非 0 退出码,CI 闸门直接阻断
  4. 通过 grunt-eslint-security 扫描 Gruntfile.js 及自定义插件,规则包提前放在 build/security-rules/ 目录,完全离线加载
  5. 最终把报告、SM3 摘要、构建日志一并打包,通过堡垒机审计通道上传到等保平台存档,完成闭环

步骤三:持续运营

  • 每月在中间机重新生成漏洞快照,走相同刻盘流程,保证离线库滞后不超过 30 天
  • 对 Grunt 插件升级采用蓝绿发布:先在测试 air-gapped 区验证,摘要比对无误后推进生产区

拓展思考

  1. 信创场景:若构建机为 ARM 架构麒麟 OS,需提前交叉编译 grunt-cli,并用国密 SM4 对磁盘镜像加密,防止物理搬运过程泄露源码
  2. 双因子审计:在 Grunt 任务链末端加入 grunt-gpg 插件,用硬件 USBKey 对产物做国密 SM2 签名,签名值写入 dist/manifest.sig,方便运维离线验签
  3. 与 DevSecOps 融合:即使 air-gapped,也可通过“光盘摆渡 + 堡垒机 API”把审计结果自动同步到内网 GitLab Issue,实现离线但自动化的漏洞跟踪闭环