乐闻世界logo
搜索文章和话题

npm audit 是如何工作的?npm 安全的最佳实践有哪些? -

2月17日 23:25

npm 提供了内置的安全审计功能来检测和修复项目依赖中的安全漏洞。了解 npm 安全机制对于维护应用程序安全至关重要。

npm audit 命令

基本用法

bash
# 扫描项目依赖中的安全漏洞 npm audit # 显示审计结果的 JSON 格式 npm audit --json # 只显示生产依赖的漏洞 npm audit --production

审计报告示例

shell
found 3 vulnerabilities (2 moderate, 1 high) ┌───────────────┬──────────────────────────────────────┐ │ Low │ Prototype Pollution │ ├───────────────┼──────────────────────────────────────┤ │ Moderate │ Regular Expression Denial of Service │ ├───────────────┼──────────────────────────────────────┤ │ High │ Command Injection │ └───────────────┴──────────────────────────────────────┘

漏洞严重级别

npm 将漏洞分为以下严重级别:

  1. Low(低):影响有限,需要特定条件
  2. Moderate(中):有一定影响,需要用户交互
  3. High(高):严重影响,可能导致数据泄露
  4. Critical(严重):极高影响,可能导致系统完全被控制

自动修复漏洞

npm audit fix

bash
# 自动修复可修复的漏洞 npm audit fix # 只修复生产依赖的漏洞 npm audit fix --production # 强制修复(可能引入破坏性更改) npm audit fix --force

修复策略

npm audit fix 会:

  1. 识别可以安全更新的依赖
  2. 更新到修复了漏洞的版本
  3. 更新 package-lock.json
  4. 报告无法自动修复的漏洞

手动修复漏洞

1. 更新特定包

bash
# 更新到最新版本 npm update <package-name> # 安装特定版本 npm install <package-name>@<version>

2. 使用 overrides(npm 8+)

在 package.json 中使用 overrides 强制使用特定版本:

json
{ "overrides": { "vulnerable-package": "1.2.3" } }

3. 使用 resolutions(Yarn)

如果使用 Yarn,可以使用 resolutions:

json
{ "resolutions": { "vulnerable-package": "1.2.3" } }

npm audit 配置

配置审计级别

bash
# 设置审计级别(默认为 low) npm config set audit-level moderate # 可选值:low, moderate, high, critical

禁用审计

bash
# 全局禁用审计 npm config set audit false # 安装时跳过审计 npm install --no-audit

安全最佳实践

1. 定期审计

bash
# 在 CI/CD 流程中添加审计 npm audit

2. 锁定依赖版本

json
{ "dependencies": { "package": "1.2.3" } }

使用精确版本而不是范围版本。

3. 提交 package-lock.json

确保团队使用相同的依赖版本。

4. 使用 .npmrc 配置

ini
# .npmrc audit=true audit-level=moderate

5. 监控依赖更新

bash
# 查看过期的包 npm outdated # 查看包的安全公告 npm view <package> security-advisories

CI/CD 集成

GitHub Actions 示例

yaml
name: Security Audit on: push: branches: [main] pull_request: branches: [main] schedule: - cron: '0 0 * * 0' # 每周运行 jobs: audit: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' - name: Install dependencies run: npm ci - name: Run security audit run: npm audit - name: Attempt to fix vulnerabilities run: npm audit fix continue-on-error: true - name: Check for remaining vulnerabilities run: | if [ $(npm audit --json | jq '.metadata.vulnerabilities.high + .metadata.vulnerabilities.critical') -gt 0 ]; then echo "High or critical vulnerabilities found!" exit 1 fi

使用第三方工具

bash
# 使用 Snyk npm install -g snyk snyk test # 使用 npm-check-updates npm install -g npm-check-updates ncu -u

供应链安全

1. 验证包完整性

npm 使用 SHA-512 校验和验证包完整性:

json
{ "integrity": "sha512-..." }

2. 使用 npm provenance

npm provenance 提供包的来源验证:

bash
npm publish --provenance

3. 检查包维护者

bash
# 查看包的维护者 npm view <package> maintainers # 查看包的发布历史 npm view <package> time

常见安全问题

1. 依赖混淆攻击

攻击者发布与内部包同名的恶意包。

预防措施

  • 使用 scoped 包:@company/package
  • 配置私有 registry
  • 审查新安装的包

2. Typosquatting 攻击

攻击者发布拼写错误的包名。

预防措施

  • 仔细检查包名
  • 使用官方 registry
  • 审查包的下载量和维护者

3. 恶意代码注入

攻击者在包中注入恶意代码。

预防措施

  • 审查包的源代码
  • 使用 npm audit 定期检查
  • 限制包的权限

安全工具

1. npm audit

内置的安全审计工具。

2. Snyk

提供更全面的安全扫描:

bash
npm install -g snyk snyk auth snyk test

3. Dependabot

GitHub 的依赖更新和安全警报工具。

4. WhiteSource

企业级开源安全管理平台。

5. OWASP Dependency-Check

扫描项目依赖中的已知漏洞。

.npmignore 和安全性

确保不将敏感信息发布到 npm:

shell
# .npmignore .env *.key *.pem secrets/ config/production.json

许可证合规

检查依赖的许可证:

bash
# 使用 license-checker npm install -g license-checker license-checker # 使用 npm-license-crawler npm install -g npm-license-crawler npm-license-crawler

安全配置示例

package.json

json
{ "name": "my-secure-app", "version": "1.0.0", "engines": { "node": ">=16.0.0", "npm": ">=8.0.0" }, "scripts": { "audit": "npm audit", "audit:fix": "npm audit fix", "check-licenses": "license-checker" }, "dependencies": { "express": "^4.18.0" }, "overrides": { "vulnerable-package": "1.2.3" } }

.npmrc

ini
# 安全配置 audit=true audit-level=moderate fetch-retries=3 fetch-retry-mintimeout=20000 fetch-retry-maxtimeout=120000 strict-ssl=true

常见问题解决

1. 无法自动修复的漏洞

bash
# 手动查找替代包 npm search <package-name> # 联系包维护者 npm view <package> author

2. 依赖冲突

bash
# 使用 overrides 解决冲突 npm install --force

3. 误报

bash
# 查看漏洞详情 npm audit --json # 查看包的安全公告 npm view <package> security-advisories

npm 安全审计是保护应用程序免受已知漏洞攻击的重要工具。定期审计和及时更新依赖是维护安全性的关键。

标签:NPM