#python #pip
У меня есть жутко секретный whl-пакетик mysecretproject, который, условно говоря, лежит в моём маленьком локалхостовом PyPI (каталог ли это, или pypiserver, или ещё что-то — неважно, могу использовать что угодно для решения задачи, хотя чем проще и изолированнее, тем лучше) и устанавливается оттуда. Предположим, что точная версия пакета мне неизвестна (его могу делать не я, например), и мне нужно установить просто последнюю доступную версию через pip. Пакет настолько секретный, что даже имя пакета mysecretproject светить нигде не хочу кроме этого вопроса, поэтому на pypi.org нет и никогда не будет даже пустой заглушки. Проблема в том, что pip в любом случае стучится одновременно и на локалхостовый PyPI, и на публичный https://pypi.org/simple, чтобы попытаться достать последнюю версию whl-пакета оттуда. Однако может случиться беда, и сверхсекретное название пакета случайно утечёт в интернетики в одном из моих случайных скриншотов. Злоумышленник, налюбовавшись на скриншот, заливает на pypi.org mysecretproject-99999.999.999, в итоге мой pip ставит пакет не с локалхоста, а из pypi.org — и всё, моя система скомпрометирована! Хочется как-то пофиксить эту проблему. При этом прописать --no-index я тоже не могу, потому что зависимости нужно ставить как раз из pypi.org (предположим, что они белые и пушистые, да). Точное имя whl-пакета я заранее тоже не знаю (версия пакета условно произвольная и заливается из другого моего локалхоста, например), поэтому просто скормить в pip прямой путь к whl-пакету я тоже не могу. Как бы мне вывернуться так, чтобы pip ставил один-единственный мой пакет из локалхоста, а все его зависимости подтянул из pypi.org? (Разработчики pip уже говорили, что --find-links и аналоги занимаются оптимизацией, а не безопасностью, но безопасных аналогов мне найти так и не удалось)
Ответы
Ответ 1
Проблема в том, что pip в любом случае стучится одновременно и на локалхостовый PyPI, и на публичный https://pypi.org/simple, чтобы попытаться достать последнюю версию whl-пакета оттуда. Злоумышленник, налюбовавшись на скриншот, заливает на pypi.org mysecretproject-99999.999.999, в итоге мой pip ставит пакет не с локалхоста, а из pypi.org — и всё, моя система скомпрометирована! devpi решает обе проблемы. devpi может проксировать запросы на pypi.org: при запросе пакета devpi проверит, доступен ли пакет локально; если нет, то devpi перенаправит запрос на pypi.org. Чтобы сконфигурировать такое поведение, локальный индекс должен наследовать root/pypi. Если индекс не наследует root/pypi, установлены могут быть только пакеты, залитые непосредственно на индексе (индекс полностью изолирован). Установка и настройка сервера подробно описана в документации; чтобы перманентно прописать установку с локального зеркала, открой $HOME/.pip/pip.conf и добавь: [global] index-url=http://127.0.0.1:9000/me/myindex/+simple Поскольку используется index-url, pip будет использовать локальный репозитарий в качестве основного и единственного, игнорируя pypi.org. Дальше пакеты устанавливаются (или не устанавливаются) в зависимости от конфигурации индекса devpi (наследование root/pypi, описанное выше). От ситуации, когда злоумышленник залил вредоносную копию mysecretproject на pypi.org, защищает опция индекса mirror_whitelist. Если имя пакета НЕ добавлено в mirror_whitelist, то devpi позволит установить только версии пакета, залитые на индексе, игнорируя любые версии, залитые на pypi.org. Имена пакетов никогда не добавляются в mirror_whitelist автоматически (это можно сделать только вручную), так что все залитые на локальных индексах пакеты изначально защищены от спуфинга.
Комментариев нет:
Отправить комментарий