Защитите свои зависимости от атак на цепочку поставок. **Один статический бинарник, нулевые зависимости от Rust крейтов.**
От **[[arnica](https://arnica.io?utm_source=depsguard&utm_medium=referral&utm_campaign=community)]**
## Содержание
- [Обзор](#overview)
- [Установка](#install)
- [Использование](#usage)
- [Что проверяется](#what-gets-checked)
- [Расположение конфигурационных файлов](#config-file-locations)
- [Срочное исправление безопасности](#urgent-security-fix)
- [Резервное копирование и восстановление](#backups-and-restore)
- [Как это работает](#how-it-works)
- [Устранение неполадок](#troubleshooting)
- [Помощь и обратная связь](#help--feedback)
- [Руководства](#guides)
- [См. также](#see-also)
- [Лицензия](#license)
## Обзор
DepsGuard ищет **npm**, **pnpm**, **yarn**, **bun**, **uv**, **pip**, **poetry** и **aube** на вашей машине, читает их конфигурационные файлы, сравнивает их с рекомендуемыми настройками цепочки поставок и может **интерактивно применять исправления**. Он также сканирует конфигурации **Renovate** и **Dependabot** в ваших репозиториях. Он никогда не запускает установку пакетов; он только редактирует утверждённые вами конфигурационные файлы и создаёт **резервные копии** перед любыми изменениями.
### Ключевые возможности
- Интерактивный TUI: сканирование, просмотр, включение/отключение исправлений, применение
- Подкоманда `scan` для отчёта только для чтения
- Подкоманда `restore` для выбора резервной копии и отката файла
- Кроссплатформенность: Linux, macOS, Windows
- Нет встроенных сторонних Rust крейтов (только stdlib + небольшое количество платформенного FFI для терминала)
### Технический стек
| Область | Подробности |
|---------|-------------|
| Язык | Rust (MSRV **1.74**, см. `Cargo.toml`) |
| CLI / TUI | `src/main.rs`, `src/ui.rs`, `src/term.rs` |
| Логика конфигурации | `src/manager.rs`, `src/fix.rs` |
| Веб-сайт | Статический сайт в `docs/` (отдельно от бинарника) |
## Установка
### Предварительно собранные бинарники
Каждый [релиз на GitHub](https://github.com/arnica/depsguard/releases) включает архивы для:
- Linux: `x86_64` (glibc), `x86_64` (musl), `aarch64` (glibc)
- macOS: Intel и Apple Silicon
- Windows: `x86_64` ZIP, содержащий `depsguard.exe`
Скачайте архив для вашей платформы, распакуйте его и поместите бинарник в ваш `PATH`.
Проверьте целостность с помощью соответствующего файла `.sha256`, расположенного рядом с каждым артефактом на странице релиза.
### Установка по платформе
#### Linux (Debian/Ubuntu через APT)```bash
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://depsguard.com/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/depsguard.gpg
echo "deb [arch=amd64,arm64 signed-by=/etc/apt/keyrings/depsguard.gpg] https://depsguard.com/apt stable main" | sudo tee /etc/apt/sources.list.d/depsguard.list >/dev/null
sudo apt update
sudo apt install depsguard
macOS / Linux (Homebrew)```bash
Homebrew
brew install depsguard
root@kitploit:~
DepsGuard находится в [homebrew-core](https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/d/depsguard.rb), поэтому не требуется дополнительный tap.
> **Переход со старого `arnica/depsguard` tap?** Переключитесь на основную формулу:
>
> ```bash
> brew uninstall depsguard
> brew untap arnica/depsguard
> brew update
> brew install depsguard
> ```
#### Windows```powershell
# WinGet
winget install Arnica.DepsGuard
# Scoop
scoop bucket add depsguard https://github.com/arnica/depsguard
scoop install depsguard
Менеджеры пакетов (когда опубликованы вашим поставщиком)
Если ваша организация распространяет DepsGuard через Homebrew, Scoop или WinGet, используйте их инструкции. Настройка или автоматизация этих каналов (PR для Homebrew core, buckets, PR для WinGet, секреты CI) относится к документации мейнтейнера; см. AGENTS.md в разделе Релиз и распространение.
Магазины приложений / менеджеры пакетов
Канал
Linux
macOS
Windows
Команда установки
APT (пользовательский репозиторий)
да
нет
нет
sudo apt install depsguard (после настройки репозитория выше)
Запуститеdepsguard, чтобы открыть интерактивный TUI. Он просканирует вашу систему и покажет таблицу результатов. Нажмите любую клавишу, чтобы перейти к выбору исправлений. Поиск конфигураций уровня репозитория начинается с текущей директории и идёт вниз. Используйте depsguard scan для отчёта только для чтения или depsguard --no-search, чтобы пропустить рекурсивный поиск файлов и проверять только конфиги пользовательского уровня.
Примечание: некоторые настройки требуют определённой минимальной версии. Если ваша версия слишком старая, вы увидите:
ℹ min-release-age – requires npm ≥ 11.10 (have 10.2.0).
Обновитесь с помощью npm install -g npm@latest и запустите снова.
Навигация и выбор – используйте ↑↓ для перемещения по списку (^u^d для пролистывания). Нажмите Space, чтобы включить или отключить исправление. Используйте клавиши быстрой фильтрации для массового выбора по файлу: a – всё, n – .npmrc, u – uv.toml и т.д. – нажмите один раз для выбора, ещё раз для отмены, третий раз для очистки фильтра. Нажмите f, чтобы показать только выбранные исправления.
Предпросмотр – нажмите d, чтобы увидеть diff того, что изменится, прежде чем что-либо применять.
Применение – нажмите Enter, чтобы применить выбранные исправления. Перед записью любого файла создаётся резервная копия с меткой времени.
Повторное сканирование – DepsGuard автоматически запускает повторное сканирование после применения, чтобы вы могли убедиться, что всё в порядке.
Восстановление – выполните depsguard restore в любое время, чтобы откатиться из списка резервных копий. Нажмите q или Esc для выхода.
Что проверяется
Менеджер
Конфиг
Настройка
Целевое значение
Зачем
npm
~/.npmrc
min-release-age
7 (дней)
Задержка свежих релизов (требуется npm >= 11.10)
npm/pnpm
~/.npmrc
ignore-scripts
true
Снижение риска от скриптов установки (npm учитывает это в .npmrc; pnpm >= 11 читает это из pnpm-workspace.yaml / глобального config.yaml, а не из .npmrc)
pnpm
~/.npmrc
minimum-release-age
10080 (минут)
Задержка новых версий на 7 дней (pnpm 10.16–10.x только; pnpm >= 11 игнорирует .npmrc; используйте pnpm-workspace.yaml)
pnpm
глобальный rc (pnpm <= 10)
minimum-release-age
10080 (минут)
Задержка новых версий на 7 дней (требуется pnpm >= 10.16)
Блокировка понижения уровня проверки происхождения (требуется pnpm >= 10.21)
pnpm
глобальный rc (pnpm <= 10)
strict-dep-builds
true
Ошибка при непроверенных скриптах сборки (требуется pnpm >= 10.3)
pnpm
глобальный rc (pnpm <= 10)
ignore-scripts
true
Блокировка вредоносных скриптов установки
pnpm
глобальный config.yaml (pnpm >= 11)
minimumReleaseAge
Расположение конфигурационных файлов
Менеджер
Linux
macOS
Windows
npm/pnpm/aube
~/.npmrc
~/.npmrc
%USERPROFILE%\.npmrc
pnpm глобальный (pnpm <= 10)
$XDG_CONFIG_HOME/pnpm/rc или ~/.config/pnpm/rc
$XDG_CONFIG_HOME/pnpm/rc или ~/Library/Preferences/pnpm/rc
%LOCALAPPDATA%\pnpm\config\rc
pnpm глобальный (pnpm >= 11)
$XDG_CONFIG_HOME/pnpm/config.yaml или ~/.config/pnpm/config.yaml
$XDG_CONFIG_HOME/pnpm/config.yaml или ~/Library/Preferences/pnpm/config.yaml
%LOCALAPPDATA%\pnpm\config\config.yaml
yarn
~/.yarnrc.yml
~/.yarnrc.yml
%USERPROFILE%\.yarnrc.yml
pnpm
pnpm-workspace.yaml
pnpm-workspace.yaml
pnpm-workspace.yaml
bun
$XDG_CONFIG_HOME/.bunfig.toml или ~/.bunfig.toml
$XDG_CONFIG_HOME/.bunfig.toml или ~/.bunfig.toml
%USERPROFILE%\.bunfig.toml
uv
$XDG_CONFIG_HOME/uv/uv.toml или ~/.config/uv/uv.toml
$XDG_CONFIG_HOME/uv/uv.toml или ~/.config/uv/uv.toml
%APPDATA%\uv\uv.toml
pip
$XDG_CONFIG_HOME/pip/pip.conf или ~/.config/pip/pip.conf
~/Library/Application Support/pip/pip.conf или ~/.config/pip/pip.conf (или $XDG_CONFIG_HOME/pip/pip.conf, если задан)
%APPDATA%\pip\pip.ini
poetry
$XDG_CONFIG_HOME/pypoetry/config.toml или ~/.config/pypoetry/config.toml
Конфигурационные файлы пользовательского уровня читаются из стандартных расположений (включая пути на основе XDG, если инструмент их поддерживает). Конфиги уровня репозитория обнаруживаются путем поиска вниз от текущей директории, пропуская известные большие каталоги (node_modules, .git, target, Library, .cache и другие), чтобы сканирование оставалось быстрым. Ищутся .npmrc, .yarnrc.yml, pnpm-workspace.yaml, конфиги Renovate и Dependabot на уровне репозитория. Настройки pnpm могут находиться в ~/.npmrc (только pnpm <= 10; pnpm >= 11 читает из .npmrc только настройки аутентификации/реестра), глобальном конфигурационном файле pnpm (rc для pnpm <= 10, config.yaml для pnpm >= 11) или pnpm-workspace.yaml; DepsGuard проверяет все три расположения независимо. Для pip, uv и poetry DepsGuard определяет единственный действующий конфиг пользовательского уровня и сообщает только о нём, а не помечает отдельно скрытые файлы. pip и poetry объединяют свои конфигурационные файлы по приоритету (файл с наивысшим приоритетом, задающий время задержки, побеждает, или предпочтительное расположение, если ни один не задаёт); uv читает один пользовательский файл ($XDG_CONFIG_HOME/uv/uv.toml, если XDG_CONFIG_HOME задан, иначе ~/.config/uv/uv.toml), а не объединяет оба. Для bun, если существует несколько конфигурационных файлов пользовательского уровня (например, и путь XDG, и путь в домашней директории), DepsGuard проверяет каждый существующий файл отдельно. aube читает тот же ~/.npmrc, что и npm/pnpm (minimumReleaseAge, в минутах), и также проверяется в обнаруженных файлах .npmrc на уровне репозитория; pip и poetry сканируются в своих конфигах пользовательского уровня (pip.conf / pypoetry/config.toml).
Срочное исправление безопасности
Если пропатченная версия новее, чем ваш период задержки, добавьте узкое исключение, установите исправление, а затем удалите исключение.
Отдавайте предпочтение исключению для конкретного пакета, а не снижению глобальной задержки. Это сохранит задержку для всех остальных зависимостей.
Менеджер
Как обойти задержку
npm
npm install <pkg>@<ver> --min-release-age=0
pnpm
Добавьте запись в minimumReleaseAgeExclude в pnpm-workspace.yaml, выполните pnpm add <pkg>@<ver>, затем удалите запись. Исключение по имени пакета работает в pnpm 10.16+; привязка к конкретной версии (<pkg>@<ver>) дополнительно требует pnpm 10.19+. В pnpm нет документированного переопределения CLI для minimumReleaseAge.
yarn
Добавьте <pkg> (или шаблон) в npmPreapprovedPackages в .yarnrc.yml или выполните YARN_NPM_MINIMAL_AGE_GATE=0s yarn up <pkg>@<ver> для одной команды. npmPreapprovedPackages освобождает совпадения от всех проверок пакетов Yarn, не только от проверки возраста.
bun
Добавьте <pkg> в install.minimumReleaseAgeExcludes в bunfig.toml на уровне репозитория или в пользовательском ~/.bunfig.toml, или выполните bun add <pkg>@<ver> --minimum-release-age 0.
aube
Добавьте <pkg> в minimumReleaseAgeExclude в .npmrc или установите AUBE_MINIMUM_RELEASE_AGE=0 (или npm_config_minimum_release_age=0) для одной установки.
uv
Добавьте "<pkg>" = false в exclude-newer-package в uv.toml или pyproject.toml, выполните uv add <pkg>==<ver>, затем удалите запись. exclude-newer-package — это отдельное попакетное переопределение глобального порога exclude-newer. CLI uv принимает --exclude-newer-package PACKAGE=DATE, но не PACKAGE=false.
pip
Выполните pip install <pkg>==<ver> --uploaded-prior-to=P0D для одной установки. P0D отключает задержку только для этой команды; в pip нет попакетного исключения в конфиге.
poetry
Добавьте <pkg> в solver.min-release-age-exclude (через запятую) в /, выполните , затем удалите запись. освобождает все пакеты из указанного индекса.
Перед обходом задержки:
Проверьте, действительно ли CVE влияет на ваше использование.
Проверьте, доступна ли уже заведомо рабочая старая версия. Возможно, откат будет безопаснее.
Удалите временные исключения после обновления.
Резервные копии и восстановление
Перед изменением файла DepsGuard создаёт резервную копию в ~/.depsguard/backups/.
Выполните depsguard restore, чтобы вывести список резервных копий и восстановить одну из них.
- **Ноль сторонних крейтов**: намеренно для небольшого инструмента, связанного с безопасностью; смотрите `AGENTS.md`, если измените эту политику.
- **Цвета** используют ANSI-последовательности; поддерживаются современные терминалы на Windows (например, Windows Terminal).
## Устранение неполадок
| Симптом | Что попробовать |
|---------|-------------------|
| `depsguard: command not found` | Убедитесь, что каталог установки находится в `PATH`, или используйте полный путь к бинарному файлу. |
| Ошибки разрешений при записи конфигурации | DepsGuard редактирует только файлы в вашем профиле пользователя; запускайте как обычный пользователь, а не с повышенными правами, если только эти файлы не принадлежат администратору. |
| Клавиши не работают в Windows | Используйте **Windows Terminal** или другой терминал с поддержкой VT; устаревший `cmd.exe` может не обрабатывать все клавиши. |
| Отсутствуют рабочие пространства pnpm | Убедитесь, что `pnpm-workspace.yaml` находится в дереве вашего домашнего каталога; очень необычные макеты могут быть не обнаружены. |
| `cargo install` не удается | Установите Rust через [rustup](https://rustup.rs/) и используйте Rust **≥ 1.74**. |
## Помощь и обратная связь
- [Сообщить об ошибке или предложить функцию](https://github.com/arnica/depsguard/issues)
- [Сообщить об уязвимости безопасности](https://github.com/arnica/depsguard/security/advisories/new) (см. [`SECURITY.md`](https://github.com/arnica/depsguard/blob/main/SECURITY.md))
- Рабочий процесс разработки для участников описан в [`AGENTS.md`](https://github.com/arnica/depsguard/blob/main/AGENTS.md).
## Руководства
Углубленные руководства на [depsguard.com](https://depsguard.com) объясняют каждую настройку ужесточения безопасности и атаки на цепочку поставок, от которых они защищают:
- [Как защититься от атак на цепочку поставок npm](https://depsguard.com/guide/) (полное руководство по ужесточению)
- [Остывание зависимостей (минимальный возраст релиза)](https://depsguard.com/cooldown/)
- [Блокировка скриптов установки с помощью ignore-scripts](https://depsguard.com/ignore-scripts/)
- [Блокировка ненадёжных транзитивных зависимостей (block-exotic-subdeps)](https://depsguard.com/block-exotic-subdeps/)
- [Ошибка при непроверенных скриптах сборки (strict-dep-builds)](https://depsguard.com/strict-dep-builds/)
- [Блокировка понижения происхождения (trust-policy)](https://depsguard.com/trust-policy/)
- Отчёты об инцидентах: [axios](https://depsguard.com/axios-npm-attack/) · [Shai-Hulud](https://depsguard.com/shai-hulud/) · [TanStack](https://depsguard.com/tanstack-npm-attack/)
## См. также
- [**Остывание зависимостей** (`cooldowns.dev`)](https://cooldowns.dev/): справочное руководство и вспомогательный скрипт (`cooldowns.sh`), сфокусированные конкретно на **остывании по минимальному возрасту релиза**. Дополняет DepsGuard: охватывает более широкий набор экосистем по оси охлаждения (pip, uv, npm, pnpm, Yarn, Bun, Deno, Cargo), в то время как DepsGuard охватывает npm/pnpm/yarn/bun/aube/uv/pip/poetry плюс Renovate/Dependabot и добавляет другие настройки ужесточения (`ignore-scripts`, `block-exotic-subdeps`, `trust-policy`, `strict-dep-builds`) с интерактивным TUI, предварительным просмотром различий и резервным копированием/восстановлением.
## Лицензия
MIT
---
**Ссылки:** [Репозиторий](https://github.com/arnica/depsguard) · [Сайт документации](https://depsguard.com)
Блокировка вредоносных скриптов установки (требуется pnpm >= 10.16)
bun
~/.bunfig.toml
install.minimumReleaseAge
604800 (секунд)
~7 дней задержки (требуется bun >= 1.3)
aube
~/.npmrc
minimumReleaseAge
10080 (минут)
Задержка новых версий на 7 дней
uv
uv.toml
exclude-newer
7 days
Задержка новых публикаций (требуется uv >= 0.9.17)
pip
pip.conf ([install])
uploaded-prior-to
P7D (7 дней)
Задержка новых публикаций (требуется pip >= 26.1)
poetry
config.toml ([solver])
min-release-age
7 (дней)
Задержка новых публикаций (требуется poetry >= 2.4)
renovate
renovate.json и т.д.
minimumReleaseAge
7 days
Задержка PR с обновлением зависимостей на 7 дней
dependabot
.github/dependabot.yml
cooldown.default-days
7
Задержка PR с обновлением зависимостей на 7 дней
$XDG_CONFIG_HOME/pypoetry/config.toml (если задан) или ~/Library/Application Support/pypoetry/config.toml
%APPDATA%\pypoetry\config.toml
renovate
renovate.json, .renovaterc, .github/renovate.json и т.д.
(то же)
(то же)
dependabot
.github/dependabot.yml
(то же)
(то же)
poetry.toml
config.toml
poetry add <pkg>@<ver>
solver.min-release-age-exclude-source
Renovate
Обновления безопасности уже обходят minimumReleaseAge. Для обновления версии добавьте запись в packageRules с matchPackageNames: ["<pkg>"] и minimumReleaseAge: null.
Dependabot
Обновления безопасности уже обходят cooldown. Для обновления версии добавьте <pkg> в cooldown.exclude.