requirements.txt - pip install requirements.txt - pip freeze requirements.txt

Скрытые опасности Requirements.txt: как закрепление зависимостей может вас спасти

requirements.txt: основной инструмент или скрытая угроза?

В каждом проекте Python есть этот невинный на вид requirements.txt Находящийся в корне вашего репозитория, файл pip install requirements.txt consumes, конечно, представляет собой список зависимостей, но если вы не будете осторожны, это может стать причиной нестабильных сборок, уязвимых пакетов и серьезных проблем с безопасностью.

В его ядре, requirements.txt контролирует, какие сторонние пакеты использует ваше приложение. Когда вы запускаете pip install -r requirements.txtМенеджер пакетов Python устанавливает все перечисленные зависимости. Но вот в чём загвоздка: если вы не закрепите точные версии, вы… доверяя PyPI Всегда предоставлять безопасную, совместимую и неизменённую версию. Современная система безопасности приложений работает иначе.

Без закрепления сборки могут быть нарушены. Хуже того, ваше приложение может непреднамеренно использовать вредоносные пакеты. Открытое управление версиями (Колба >=1.0, например) или слабые ограничения версий (джанго~=3.2) — благоприятная среда для внедрения небезопасного кода. Вот почему важно правильно управлять requirements.txt является основной задачей обеспечения безопасности.

Где pip замораживается и где pip устанавливает требования.txt

заморозка пипса удобно, но также опасно, если использовать без понимания того, что оно фиксирует. Разработчики часто генерируют requirements.txt через требования к заморозке pip.txt, ожидая, что это заблокирует их среду. Но заморозка не проверяет безопасность или происхождение зависимостей; она просто сбрасывает все установленные в данный момент пакеты, включая транзитные и потенциально устаревшие.

А теперь представьте, что ваш товарищ по команде или ваш главный инженер слепо бежит pip install -r requirements.txt. Если этот файл содержит устаревшие, уязвимые или даже пакеты с ошибками в коде, вы только что автоматизировали инцидент безопасности.

Короткий пример:

# Developer's freeze output
pip freeze > requirements.txt
boto3==1.24.20
requests==2.27.1

⚠️ Небезопасный пример, не использовать в продакшене

Теперь добавьте это в свой CI pipeline:

- name: Install dependencies
run: pip install -r requirements.txt

Вы верите, что среда воспроизводима, что в PyPI ничего не изменилось и что каждая зависимость всё ещё в безопасности. Это слишком смелое предположение, когда полагаешься на требования к заморозке pip.txt рабочих процессов.

Реальные угрозы безопасности приложений: тайпсквоттинг и путаница с зависимостями в requirements.txt

Злоумышленники любят экосистемы с открытым исходным кодом. Почему? Потому что разработчики часто полагаются на настройки по умолчанию и подразумеваемое доверие. Вот как они атакуют, используя requirements.txt:

  • Typosquatting: Загрузка вредоносного пакета с именем типа запросы вместо Запросы. Один символ — и ваша сборка уже в собственности.

запросы # ⚠️ Иллюстративный пример, а не реальный пакет для установки

  • Путаница зависимостей: Если ваш внутренний пакет не закреплён или не имеет приватной области действия, злоумышленники могут опубликовать вредоносную версию в PyPI с тем же именем. Если ваша CI не проверяет исходные коды, вы установите их пакет вместо своего.

Обе атаки используют отсутствие строгого контроля над исходным кодом и requirements.txt. Если ваш просто говорит некоторая-внутренняя-библиотека, и ты бежишь pip install requirements.txt в CI он может получить неправильный пакет из неправильного места.

Защита requirements.txt в CI/CD Pipelineс хэшами и закреплением

Вот как закалить requirements.txt против реальных угроз:

  • Точные версии штифтов: всегда использовать == для каждого пакета в вашем requirements.txt. Никаких подстановочных знаков, никаких диапазонов.
  • Используйте –require-hashes: Это делает pip install -r requirements.txt проверить целостность каждого загруженного пакета.

Пример:

flask==2.2.5 \
--hash=sha256:<actual_hash_here> 

⚠️ Наглядный пример, замена на реальный хеш в реальных проектах

  • Изолируйте свои сборки: Всегда используйте чистые, минималистичные контейнеры. Никогда не доверяйте слепо базовому изображению.
  • Использовать частный индекс PyPI: Размещайте собственный прокси/кэш и зеркалируйте только доверенные пакеты.

Запустить сканирование зависимостей: Интеграция таких инструментов, как пип-аудит или использование SBOMанализ в вашем pipelines.

Пример фрагмента действий GitHub:

- name: Secure install
  run: pip install --require-hashes -r requirements.txt

⚠️ Образовательный pipeline например, адаптируйтесь к своей среде

Строгое обращение с pip install -r requirements.txt in CI/CD один из самых простых способов снизить риск, связанный с открытым исходным кодом.

Воспроизводимые сборки: сохранение их стабильности в различных средах

Если ваше приложение работает локально, но дает сбой на этапе подготовки или производства, несовместимые зависимости в requirements.txt — обычные подозреваемые. Даже небольшой дрейф приводит к серьёзным проблемам.

Используйте эти стратегии:

  • пип-инструменты: Использовать pip-компиляция генерировать requirements.txt от требования.в. Он разрешает зависимости с помощью правильного закрепления.
  • Маркеры окружающей среды: Для пакетов, специфичных для ОС, или зависимостей, специфичных для версии Python, используйте маркеры типа platform_system == 'Linux'.
  • Кэширование Docker: В CI кэшируйте слои Docker после установки зависимостей из requirements.txt для уменьшения вариативности сборки.

Пример с pip-tools:

# requirements.in
flask

# Compile
pip-compile requirements.in

⚠️ Наглядный пример, фактический результат зависит от вашей среды

Выход полностью закреплен requirements.txt.

Такие инструменты, как заморозка пипса, в сочетании с pip install -r requirements.txt во время сборки требуется дисциплина и дополнительные меры безопасности.

Заключение: уверенное соблюдение ваших требований

Неправильное управление requirements.txt Это не просто плохая практика, это активная угроза безопасности. Незащищённое закрепление, непроверенные установки и слепое доверие к открытым реестрам — вот как злоумышленники используют ваши CI/CD pipeline. Это не теоретические недостатки; они эксплуатируются ежедневно.

Закрепление зависимостей — это больше, чем просто хорошая практика. Это ваша первая линия защиты от атак на цепочку поставок в Python. Объедините это с –require-hashes, изоляция сборки и воспроизводимые инструменты, такие как пип-инструменты, и вы получите pipeline здесь труднее пойти на компромисс.

Используете ли вы pip install requirements.txt Всегда проверяйте и отслеживайте, что входит в ваши сборки локально или в непрерывной интеграции. Такие инструменты, как Ксигени обеспечить прозрачность, соблюдение политики и автоматизированные проверки, которые защищают вашу цепочку поставок Python от требования к заморозке pip.txt на протяжении всего производства.

sca-инструменты-программное обеспечение-композиция-анализ-инструменты
Расставьте приоритеты, устраните и защитите риски, связанные с программным обеспечением
7-дневная бесплатная пробная версия
Кредитная карта не требуется.

Защитите свою разработку и доставку программного обеспечения

с пакетом продуктов Xygeni