安全审计与合规

What — 是什么

安全审计与合规是确保 Node.js 应用及其依赖无已知漏洞的流程,涵盖依赖扫描、代码审计、合规检查和持续监控。

核心概念:

  • npm audit:npm 内置的依赖漏洞扫描,对照漏洞数据库检查 package-lock.json
  • Snyk:商业依赖安全扫描平台,覆盖 npm/Docker/Kubernetes 等
  • OWASP Top 10:Web 应用十大安全风险清单,安全审计的标准参考
  • 依赖扫描:检查直接和传递依赖的已知漏洞(CVE)
  • 日志审计:记录关键操作(登录/权限变更/数据访问)供审计追踪
  • 敏感信息检测:扫描代码和配置中的密钥/密码/Token 泄露

关键特性:

  • npm audit 自动检查依赖漏洞,npm audit fix 自动修复
  • Snyk 集成 CI/CD,PR 时自动扫描新依赖
  • .npmrcaudit-level 控制报错级别

Why — 为什么

适用场景:

  • 每次安装新依赖时检查安全性
  • CI/CD 流水线中的安全门禁
  • 合规审计(金融/医疗/政务)
  • 定期安全巡检

对比方案:

维度npm auditSnykSocket.dev
漏洞数据库npm advisory更全面供应链安全
自动修复有限支持有限
CI 集成内置完善支持
费用免费免费版+付费免费版+付费

How — 怎么用

快速上手

# 扫描漏洞
npm audit

# 自动修复
npm audit fix

# 强制修复(可能有破坏性变更)
npm audit fix --force

# 设置报错级别
npm config set audit-level high

代码示例

// 审计日志中间件
function auditLog(action) {
    return (req, res, next) => {
        req.log.info({
            audit: true,
            action,
            userId: req.user?.id,
            resource: req.path,
            ip: req.ip,
            timestamp: new Date().toISOString()
        });
        next();
    };
}

app.delete('/users/:id', auditLog('DELETE_USER'), deleteUser);
app.put('/users/:id/role', auditLog('CHANGE_ROLE'), changeRole);

// 敏感信息检测(CI 中使用)
// grep -rn "password\|secret\|api_key\|token" --include="*.js" --include="*.ts" src/

常见问题与踩坑

问题原因解决方案
audit fix 破坏兼容性修复版本可能不兼容逐个评估,用 overrides 指定版本
传递依赖漏洞直接依赖未更新提 issue 给维护者,或用 overrides
CI 中 audit 失败低级漏洞也报错audit-level=high 只在高危时失败

最佳实践

  • 每次安装依赖后执行 npm audit
  • CI 流水线设 npm audit --audit-level=high 门禁
  • 定期执行 npm outdated 更新依赖
  • 关键操作记录审计日志
  • 代码中不硬编码密钥和密码

面试题

Q1: npm audit 的工作原理?

npm audit 读取 package-lock.json 中的依赖树(含传递依赖),将每个包的名称和版本发送到 npm advisory 数据库,比对已知漏洞(CVE),返回漏洞详情(严重程度/影响范围/修复版本)。npm audit fix 根据建议更新依赖到安全版本,但可能破坏兼容性。

Q2: OWASP Top 10 哪些与 Node.js 最相关?

最相关的 5 项:① A03 注入——SQL 注入/NoSQL 注入/命令注入;② A01 权限控制失效——越权访问/IDOR;③ A07 身份认证失败——弱密码/Session 固定/JWT 误用;④ A05 安全配置错误——CORS 过宽/Helmet 缺失/敏感信息泄露;⑤ A09 安全日志与监控不足——无审计日志/无告警。


相关链接: