В современной разработке приложений зависимость от сторонних пакетов становится нормой, но одновременно открывает путь для атак цепочки поставок. Список доверенных (whitelist) репозиториев позволяет ограничить источники, из которых система может загружать библиотеки, и тем самым снизить вероятность установки вредоносного или не проверенного кода.
- Почему нужен список доверенных репозиториев
- Основные принципы формирования whitelist
- Пошаговый процесс создания списка доверенных репозиториев
- Настройка whitelist для популярных пакетных менеджеров
- npm (Node.js)
- pip (Python)
- Maven и Gradle (JVM)
- NuGet (.NET)
- Типичные ошибки и как их избегать
- Как проверить, что whitelist работает правильно
- Поддержка и обновление списка
- Практический следующий шаг
Почему нужен список доверенных репозиториев
Основные причины:
- Защита от подмены пакетов (typosquatting, компрометированные учетные записи).
- Контроль над лицензиями и качеством используемых зависимостей.
- Упрощение аудита и соблюдения внутренних политик безопасности.
- Снижение нагрузки на внешние сети за счёт кеширования в артефакториуме.
Основные принципы формирования whitelist
Прежде чем приступать к технической настройке, полезно сформулировать правила, которым будут следовать все репозитории в списке:
- Проверка подлинности. Репозиторий должен поддерживать криптографическую подпись пакетов или хотя бы предоставлять хеши, которые можно проверить.
- Репутация и прозрачность. Предпочтительно использовать официальные репозитории языков или проверенные корпоративные артефакториумы.
- Минимализм. Включайте только те источники, которые реально нужны для текущих проектов.
- Регулярное обновление. Периодически пересматривайте список, удаляя устаревшие или неподтверждённые репозитории.
Пошаговый процесс создания списка доверенных репозиториев
- Определите_scope. Установите, для каких языков и пакетных менеджеров будет применяться whitelist (npm, pip, Maven, Gradle, NuGet и др.).
- Соберите текущие зависимости. Запустите команду вывода дерева зависимостей (например, npm ls, pip freeze, mvn dependency:tree) и сохраните список используемых пакетов.
- Определите источники каждого пакета. Для каждого пакета укажите, из какого репозитория он обычно загружается (официальный registry, внутренний артефакториум, форк и т.д.).
- Проверьте источники на соответствие принципам. Отфильтруйте те, которые не поддерживают подписи, имеют сомнительную репутацию или не нужны.
- Сформируйте конфигурационный файл whitelist. В зависимости от инструмента это может быть файл .npmrc, секция [trusted-host] в pip.conf, настройки proxy в settings.xml Maven или аналогичные.
- Интегрируйте whitelist в процесс сборки и CI/CD. Убедитесь, что скрипты сборки ссылаются только на одобренные репозитории и что попытка обратиться к другому источнику приводит к ошибке.
- Настройте мониторинг и алерты. Логируйте запросы к репозиториям и получайте уведомления о попытках доступа к недоверенным источникам.
- Планируйте регулярный пересмотр. Установите интервал (например, раз в квартал) для проверки актуальности списка и добавления новых доверенных источников при необходимости.
Настройка whitelist для популярных пакетных менеджеров
npm (Node.js)
Для npm можно использовать параметр registry в файле .npmrc или переменную окружения NPM_CONFIG_REGISTRY. Пример:
registry=https://registry.npmjs.org/
Если вы используете внутренний прокси (например, Nexus или Artifactory), укажите его URL. Чтобы блокировать доступ к другим registries, установите strict-ssl=true и укажите файл ca с корневыми сертификатами вашего прокси.
pip (Python)
В файле pip.conf (или pip.ini на Windows) добавьте секцию:
[global]
index-url = https://pypi.org/simple/
extra-index-url = https://my.internal.repo/pypi/simple/
[install]
trusted-host = pypi.org
trusted-host = my.internal.repo
Параметр trusted-host указывает, какие хосты считаются безопасными для загрузки по HTTP; для HTTPS достаточно проверить сертификат.
Maven и Gradle (JVM)
В settings.xml Maven определите mirrors и repositories. Пример mirror, который перенаправляет все запросы на внутренний артефакториум:
Для Gradle аналогично в init.gradle или через repositories { maven { url «https://artifactory.example.com/artifactory/libs-release» } }.
NuGet (.NET)
В файле NuGet.Config задайте packageSources и optionally disabledPackageSources:
Типичные ошибки и как их избегать
- Слишком широкий whitelist. Добавление «всех известных» репозиториев нивелирует пользу. Решение: начинайте с минимального набора и расширяйте только после явной необходимости.
- Отсутствие проверки подписей. Некоторые репозитории позволяют загрузку без проверки подписи, что открывает путь для атаки «person-in-the-middle». Решение: включайте строгую проверку TLS и, где возможно, проверку подписей пакетов.
- Жёсткая привязка к конкретному URL без резерва. Если внутренний артефакториум недоступен, сборка ломается. Решение: настройте fallback на официальный реестр, но только после подтверждения его доверия.
- Игнорирование transitive dependencies. Даже если ваш whitelist чист, зависимости могут тянуть пакеты из других источников. Решение: используйте блокировку версий (lock‑files) и сканируйте дерево зависимостей на наличие недоверенных источников.
- Отсутствие аудита изменений. Изменения в конфигурации whitelist могут пройти незамеченно. Решение: храните конфигурацию в системе контроля версий и требуйте код‑ревью для любых правок.
Как проверить, что whitelist работает правильно
- Выполните чистую сборку в изолированном окружении (например, в свежем Docker контейнере).
- Попытайтесь установить пакет из известного непроверенного источника (например, пакет с похожим именем на легитимный, но опубликованный в публичном реестре без вашего доверия). Сборка должна завершиться ошибкой.
- Проверьте логи артефакториума или прокси: все запросы должны идти только на одобренные URL.
- Запустите инструмент сканирования зависимостей (например, npm audit, pip-audit, OWASP Dependency-Check) и убедитесь, что он не сообщает о неизвестных источниках.
Поддержка и обновление списка
Whitelist — это не статический набор, а живой artefact. Рекомендуемые практики:
- Вести журнал изменений: кто, когда и почему добавил или удалил репозиторий.
- Автоматизировать проверку новых зависимостей: при добавлении нового пакета в проект автоматически сверять его источник с whitelist.
- Использовать группы репозиториев в артефакториуме (например, public‑proxy, internal‑release, snapshot) и включать в whitelist только группы, а не отдельные URL.
- Проводить краткие тренинги для команды, чтобы каждый разработчик понимал, почему нельзя менять реестр вручную без согласования.
Практический следующий шаг
- Соберите текущий список зависимостей одного из ваших проектов.
- Определите, из каких официальных реестров они приходят.
- Создайте базовый whitelist, содержащий только эти официальные источники (или ваш внутренний артефакториум, если он уже используется).
- Добавьте этот whitelist в конфигурационные файлы пакетных менеджеров и зафиксируйте изменения в системе контроля версий.
- Запустите пробную сборку в чистом окружении и убедитесь, что всё работает без обращения к сторонним источникам.
После этого постепенно расширяйте список, следуя описанным выше принципам проверки и документирования.
Материал носит информационный характер и не заменяет консультацию специалиста по безопасности программного обеспечения. При внедрении изменений в критические инфраструктуры рекомендуется провести тестирование в изолированной среде и, при необходимости, привлечь эксперта по защите цепочки поставок.
