
Безопасная установка NPM-пакетов
Установщик npm, ориентированный на безопасность и защищающий ваши проекты от недавно скомпрометированных пакетов.
Атаки на цепочку поставок npm-пакетов представляют собой растущую угрозу. Злоумышленники иногда компрометируют легитимные пакеты:
Такие атаки часто происходят внезапно — пакет, который вчера был безопасным, сегодня может быть скомпрометирован. safe-npm защищает вас, устанавливая только те версии пакетов, которые были общедоступны в течение минимального времени (по умолчанию 90 дней). Это дает сообществу безопасности время на обнаружение и сообщение о вредоносных релизах до того, как они попадут в ваш проект.
Когда вы запускаете safe-npm install, происходит следующее:
package.json или аргументов командной строкиНапример, если вы укажете react@^18, а вредоносный [email protected] был опубликован вчера, safe-npm установит последнюю версию, которой не менее 90 дней.
# Install globally
npm install -g @dendronhq/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
# 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 месяцев.
Когда настраивать:
--ignore <pkg1,pkg2>Список пакетов, разделенных запятыми, которые обходят требование по возрасту. Эти пакеты по-прежнему будут соблюдать диапазоны semver, но игнорировать минимальный возраст.
Пример: --ignore typescript,@types/node
Когда использовать:
--strictЗавершится с ошибкой, если ЛЮБАЯ зависимость не может быть разрешена до версии, удовлетворяющей требованию по возрасту.
Пример: safe-npm install --strict
Когда использовать:
--dev / --prod-onlyУправляет тем, какие зависимости из package.json обрабатываются.
Примеры:
safe-npm install --dev - Установить только devDependenciessafe-npm install --prod-only - Установить только production-зависимостиКогда использовать:
--strategy <direct|overrides>По умолчанию: direct
Как safe-npm устанавливает разрешенные версии:
direct - Напрямую устанавливает разрешенные версии с помощью npm install package@version
overrides - Записывает разрешенные версии в поле overrides файла package.json, затем запускает npm install
--registry <url>По умолчанию: https://registry.npmjs.org
Укажите альтернативный npm registry.
Пример: --registry https://registry.company.com
Когда использовать:
--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
# 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
Для автоматического тестирования вы можете имитировать ответы registry с помощью фикстур:
export SAFE_NPM_FIXTURES=/path/to/fixtures.json
safe-npm install
Файл фикстур должен содержать JSON, отражающий ответы npm registry для каждого пакета.
Реальный сценарий:
popular-lib поддерживается доверенным разработчиком[email protected] с вредоносным ПО^5.0.0, немедленно установят вредоносную версию4.9.0 (последнюю версию 90+ дней назад)Безопасность — это компромиссы. safe-npm обменивает самые свежие обновления на защиту от внезапных компрометаций цепочки поставок. Это один из уровней стратегии глубокой эшелонированной защиты, которая также должна включать:
npm audit)ISC