TL;DR
@gkiely/safe-install — npm-утилита для безопасной установки пакетов с whitelist’ом доверенных build-скриптов и блокировкой экзотических sub-deps. Альтернатива нативному npm install с защитой от supply-chain атак.
Введение: контекст проблемы
После череды npm supply-chain атак (помните event-stream?) безопасность зависимостей стала must-have для senior-разработчиков. Традиционный npm install слепо доверяет всем postinstall и preinstall скриптам, что превращает ваш CI/CD в потенциальный attack vector.
Основная часть: как работает safe-install
Базовый use-case
Установка с отключёнными скриптами:
npx @gkiely/safe-install --no-scripts
Whitelist доверенных пакетов
Конфигурация через .npmrc:
# .npmrc
safe_install_whitelist=react,vite,esbuild
Или через CLI:
npx @gkiely/safe-install --whitelist=react,vite,esbuild
Блокировка экзотических зависимостей
Аналог pnpm’s blockExoticSubdeps:
// safe-install.config.js
module.exports = {
blockExotic: {
protocols: ['git+ssh', 'file:'],
hosts: ['*.internal.company.com']
}
}
Практическое применение в CI/CD
Интеграция с GitHub Actions:
- name: Safe install
run: |
npx @gkiely/safe-install \
--whitelist=$(jq -r '.safeInstallWhitelist | join(",")' ./.config.json) \
--audit-level=high
Важные фичи:
- Preflight-проверки — анализ дерева зависимостей до выполнения install
- Strict SemVer — запрет на wildcard-версии (
^/~) - Integrity checking — верификация checksum’ов через lockfile
Бенчмарки безопасности
Сравнение с альтернативами:
| Feature | npm | safe-install | Bun | pnpm |
|---|---|---|---|---|
| Script whitelisting | ❌ | ✅ | ✅ | ❌ |
| Exotic deps blocking | ❌ | ✅ | ❌ | ✅ |
| Zero-install support | ❌ | ❌ | ✅ | ✅ |
Заключение
Для enterprise-проектов с высокими security-требованиями safe-install становится обязательным звеном в toolchain. Комбинируя его с npm audit и dependency-cruiser, вы получаете полноценную защиту supply chain без существенных overheads.
Pro tip: Для монолитов стоит рассмотреть переход на Bun с его встроенным trusted dependencies — но только если готовы к vendor lock-in.
Источник: https://www.npmjs.com/package/@gkiely/safe-install