安全无虞
一个以安全为重点的 npm 安装器, 保护您的工程不受新损坏的软件包的影响 .
这为什么存在?
对npm包的供应链攻击是一个日益增长的威胁. 攻击者有时以下列方式损害合法包裹:
- 偷窃维护者证书
- 向流行软件包发布恶意更新
- 接收废弃的软件包
这些攻击往往突然发生——昨天安全的一揽子计划今天可能会被破坏. 安全无虞 保护您只需安装已公开时间(默认为90天)的软件包版本。 安全部门有时间发现并报告恶意释放, 然后再进入您的项目.
如何运作
当你跑的时候 safe-npm install,则:
- 从
package.json命令行参数 - 查询 npm 注册以找到所有可用的版本
- 过滤最近发布的超过您最低年龄的版本
- 选择既符合您组装要求又符合年龄要求的最新版本
- 使用 npm 安装安全版本
例如,如果您指定 react@^18 和恶意的 [email protected] safe-npm将安装最新版本.
安装
从 npm 安装( 建议)
# Install globally
npm install -g @kevins8/safe-npm
# Now you can use it anywhere
safe-npm install
从源头构建
# Clone and build
git clone <repository-url>
cd safe-npm
npm install
npm run build
# Link the binary globally
npm link
基本用途
从 package.json 安装依赖性
# Use the minimum age of 90 days (default)
safe-npm install
# Or specify your own minimum age
safe-npm install --min-age-days 120
安装特定软件包
# Install packages directly with version constraints
safe-npm install react@^18 lodash@^4.17.0
# These will be filtered to only use versions at least 90 days old
safe-npm install express --min-age-days 60
干跑看将安装什么
# Preview which versions would be installed without actually installing
safe-npm install --dry-run
配置选项
--min-age-days <n>
默认 : 90
一个软件包版本在安装前必须已经发布的最低天数.
示例 --min-age-days 120 要求包龄至少4个月.
何时调整 :
- 提高最高安全性(例如关键生产系统180天)
- 如果需要更新特性并接受略多的风险(如30天),则减少
--ignore <pkg1,pkg2>
一个绕过年龄要求的以逗号分隔的包列表. 这些包仍然会尊重 semver 范围,但忽略了最低年龄.
示例 --ignore typescript,@types/node
何时使用 :
- 您信任的快速移动包( 如 TypeScript 或构建工具)
- 贵组织的内部包裹
- 急需最新功能的软件包
--strict
如果任何依赖性无法解决到符合年龄要求的版本,则有错误退出.
示例 safe-npm install --strict
何时使用 :
- CI/CD 管道,如果您想在其中建造失败,而不是跳过问题包
- 需要确定性的生产部署
--dev 编号 : --prod-only
控制哪些依赖性来自 package.json 进行处理.
实例:
safe-npm install --dev- 只安装依赖性safe-npm install --prod-only- 只安装生产依赖
何时使用 :
- 安装要求更严格的发展工具
- 生产会建在您想要不同年龄政策的地方 dev vs 依赖性
--strategy <direct|overrides>
默认 : direct
安全 npm 如何安装解析版本 :
direct - 使用 npm install package@version
- 简单明了
- 适合一次性安装或脚本
overrides - 将已解决的版本写入 package.json 覆盖字段,然后运行 npm install
- 在整个依赖树上执行版本(包括过渡依赖)
- 说明: 此特性目前已禁用, 因为它尚未正确工作
--registry <url>
默认 : https://registry.npmjs.org
指定替代 npm 登记册.
示例 --registry https://registry.company.com
何时使用 :
- 私人npm登记
- 镜像或缓存
--dry-run
显示将安装什么而不做任何修改 .
示例 safe-npm install --dry-run
何时使用 :
- 测试您的配置
- 了解现有哪些版本
- 在改变生产系统之前
共同工作流程
保护新项目
# Create a new project
mkdir my-project && cd my-project
npm init -y
# Install dependencies safely
safe-npm install express@^4 lodash
# This creates package-lock.json with versions at least 90 days old
审计现有项目
# Check what versions would be installed with age requirements
safe-npm install --dry-run
# If you're happy, install them
safe-npm install
CI/CD一体化
# In your CI pipeline, fail the build if any package can't meet age requirements
safe-npm install --strict --min-age-days 120
# Or allow newer packages for dev dependencies only
safe-npm install --prod-only --strict
紧急更新
# Need to urgently update a specific package? Add it to ignore list
safe-npm install --ignore package-with-critical-fix
测试
该项目包括一个可以运行的测试套房:
npm test
为了进行自动化测试,可以使用固定装置模拟登记答复:
export SAFE_NPM_FIXTURES=/path/to/fixtures.json
safe-npm install
定着文件应包含JSON,它反映每个包的npm注册响应.
如何保护你
现实世界情景:
- 一个流行的软件包
popular-lib由信任的开发者维护 - 攻击者损害维护者的 npm 证书
- 攻击者出版物
[email protected]恶意软件 - 使用的项目
^5.0.0将立即安装恶意版本 - 有了安全,你会继续使用
4.9.0(最新版本来自90多天前) - 安全研究者发现妥协并报告
- 恶意版本未发布
- 你从未安装过已关闭的版本
限制
- 从一开始就不会保护那些恶意的软件包
- 延迟访问合法的新功能和错误修正
- 需要相信旧版本没有未发现的弱点
- 基于年龄的过滤是高压的,不是保证
哲学
安全是取舍 安全无虞交易 血流成河的更新 以防供应链突然妥协 它是一个防御深度战略的一层,它也应该包括:
- 定期安保审计
npm audit(中文(简体) ) - 在添加新软件包之前进行依赖性审查
- 安全咨询监测
- 使用锁文件确保可复制的构建
- 在沙箱或集装箱环境中运行
所需资源
- 节点.js 18或以上
- npm(用于基础安装)
许可证
公务员制度委员会