safe-install: защищённые npm-инсталляции с доверенными build-зависимостями

#npm#security#frontend#supply-chain

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

Важные фичи:

  1. Preflight-проверки — анализ дерева зависимостей до выполнения install
  2. Strict SemVer — запрет на wildcard-версии (^/~)
  3. Integrity checking — верификация checksum’ов через lockfile

Бенчмарки безопасности

Сравнение с альтернативами:

Featurenpmsafe-installBunpnpm
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