Como posso bloquear pacotes de usuários pip e python

Como posso bloquear pacotes de usuários pip e python

Estou tentando impedir que os usuários usem o pip para instalar pacotes em seus diretórios pessoais.

A saída de python3 -m site --helpindicaria que é possível para um superusuário desabilitar o diretório do site do usuário. Mas como é que isto é feito? Eu tentei configurar site.ENABLE_USER_SITEde a, sitecustomize.pymas isso não ajuda. Definir PYTHONNOUSERSITE=1no ambiente ou passar -spara python funciona, mas não é exatamente um ajuste de superusuário.

Também tentei abordar isso desabilitando de alguma forma o pip para os usuários. Ficaríamos muito felizes se os pacotes fossem instalados em ambientes venv, mas não nos diretórios pessoais dos usuários. Existe algo que eu possa colocar pip.confpara desativar --useras instalações à força.

Responder1

P:Existe algo que eu possa colocar no pip.conf para desabilitar à força as instalações do usuário.

A:Não. O arquivo de configuração sempre pode ser substituído de acordo com a precedência definida nodocumentos pip:

As opções de linha de comando têm precedência sobre variáveis ​​de ambiente, que têm precedência sobre o arquivo de configuração.

P:É possível que um superusuário desabilite o diretório do site do usuário. Mas como é que isto é feito? Definir PYTHONNOUSERSITE=1no ambiente ou passar -spara python funciona, mas não é exatamente um ajuste de superusuário.

A:Cheguei a esta questão através do Google porque estava descobrindo exatamente o oposto - não vejo PYTHONNOUSERSITErealmente uma mudança no comportamento do pip:

$ docker run --net=host -it python:3.8 bash

$ pip install -U pip
Requirement already up-to-date: pip in /usr/local/lib/python3.8/site-packages (20.2.2)

$ ls -ltr ~/.local
ls: cannot access '/root/.local': No such file or directory

$ PYTHONNOUSERSITE=1 pip install --user typing-extensions
Collecting typing-extensions
  Downloading typing_extensions-3.7.4.3-py3-none-any.whl (22 kB)
Installing collected packages: typing-extensions
Successfully installed typing-extensions-3.7.4.3

$ ls -ltr ~/.local
total 4
drwxr-xr-x 3 root root 4096 Aug 24 07:08 lib

Odocumentos paraPYTHONNOUSERSITEdeclarar que:

Se estiver definido, o Python não adicionará o diretório site-packages do usuário ao sys.path.

Portanto, embora eu tenha ficado surpreso com o comportamento, suponho que seja razoável que o pip ainda seja instalado, PYTHONUSERBASEmesmo que esta variável esteja definida (mesmo que o resultadoinstaladopacote não estará disponível no caminho Python).

Achei umproblema relevante no pip issue trackere parece que já existe um caso especial para venvs que têm pacotes de sites do sistema desabilitados (o padrão) não tendo permissão para fazer instalações de usuário (não verifiquei isso explicitamente).

Então, seguindo para a solução do relatório de bug original, chegamos a uma solicitação pull que tem algunsrecursos interessantes. Ou seja, aparentemente existe um arquivo especial que um superusuário pode criar, ````, que desativa a instalação do pacote de sites do usuário. Eu também encontrei umpergunta sobre SO relacionada a este. Então tentei isso, mas infelizmente ainda continuou a ser instalado na base de usuários:

$ touch /usr/local/lib/python3.8/no-global-site-packages.txt

$ pip install --user typing-extensions
...
Successfully installed typing-extensions-3.7.4.3

Claro, isso faz sentido quando lemos o verdadeiroimplementação de solicitação pullque verifica esse arquivo apenas em situações de virtualenv. No meu caso, quero podersempredesabilitar esse comportamento, então vou me aprofundar um pouco mais na base de código pip ...

Acontece que a função principal édecide_user_site, qualfazhonrar osite.ENABLE_USER_SITEvalor, masapenasdepois de verificar o userargumento explícito. Como podemos ver na própria função, isso é assimétrico com a forma como os ambientes virtuais são tratados, o que impedirá instalações globais/de usuário se um ambiente virtual os tiver desabilitado. Considero isso um bug e o levantei emhttps://github.com/pypa/pip/issues/8794.

Portanto, a resposta é: atualmente não é possível, até onde sei, desabilitar --userinstalações em um ambiente básico (ou seja, não virtual). Quandoépossível fazer isso (espero que quando o problema vinculado acima for corrigido) as variáveis ​​​​de ambiente -se PYTHONNOUSERSITE=1possam ser usadas, mas a maneira "sys-admin" de fazer isso que acho que você está procurando é modificarsite.py diretamente, conforme explicado na implementação do site.py.

Responder2

Tópico antigo, mas aqui está a solução possível. Force o pip a ter ambiente virtual e não instalar diretamente no site do usuário.

export PIP_REQUIRE_VIRTUALENV=true

Aqui está o link relevante: https://docs.python-guide.org/dev/pip-virtualenv/

informação relacionada