Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Как установить whl-пакет не из PyPI, а зависимости из PyPI?

#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 автоматически (это можно сделать только вручную), так что все залитые на локальных индексах пакеты изначально защищены от спуфинга.

Комментариев нет:

Отправить комментарий