Como faço para o sudo preservar minhas variáveis ​​de ambiente?


47

Usando o sudo 1.7.4p4 no Solaris 5.10 e o sudo 1.6.7p5 no RHEL4 u6, não consigo ver como preservar minhas variáveis ​​de ambiente, por exemplo $ PYTHONPATH. Adicionei esta linha aos sudoers, mas não faz diferença:

Defaults !env_reset

Estou fazendo algo errado ou a instalação do sudo simplesmente não está respeitando o sinalizador env_reset?

Edit: Pelo menos no Solaris, descobrimos que esse problema depende do shell! O shell raiz padrão é Bourne, se sudo bashrodarmos o bash sob sudo ( ) por outro lado,! Env_preset preservará o ambiente (incluindo PATH e LD_LIBRARY_PATH). Este é um comportamento bastante confuso, devo dizer.


Respostas:


44

Use com cuidado, há problemas de segurança com sudo e variáveis.

De man sudoerseu achei que você deveria usar

Padrões env_reset
Padrões env_keep + = "PYTHONPATH OUTRAS VARIÁVEIS AINDA"

No Ubuntu, sudopreserva algumas variáveis. sudo -ié mais como fazer login como root e depois executar o comando Ambos podem ser inconvenientes, o primeiro para sudo nano myfiledeixa os arquivos pertencentes à raiz dentro de sua casa e o segundo para sudo -i nano myfiletenta abrir / root / myfile.


Corre

sudo printenv PATH

e veja o que dá. Aqui dá

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

por exemplo. Agora execute sudo visudoe adicione a linha

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

substituindo pelo que você encontrou pouco antes. Anexe um novo caminho a ele, se necessário.

Sobre bibliotecas:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

As distribuições Linux são muito cuidadosas PATHe você deve ter muito cuidado antes de brincar. Seja especialmente cuidadoso ao adicionar caminhos como " ." ou /home/username, não é seguro.

Um dos perigos de adicionar caminhos é que ele abre a possibilidade de os arquivos serem executados root, abrindo uma janela na segurança do sistema que pode ser explorada por software malicioso. Pode haver outros perigos. Apenas certifique-se de saber o que está fazendo. Ignorar sudomedidas de segurança pode tornar seu Solaris tão seguro quanto o Windows XP.


Obrigado pela sugestão. No Solaris, pelo menos, parece que o env_keep funciona apenas em parte, pois ignora PATH e LD_LIBRARY_PATH. Talvez o sudo seja construído com configurações que o recusem a preservar variáveis ​​"perigosas"?
precisa saber é o seguinte

Funcionou com outro variável, como o AKNUDS? Você também pode executar o sudo sudo -V (sim, duas vezes sudo!) E ver o que diz. Aqui, a solução acima funciona bem com PYTHONPATH, mas PATH realmente parece especial. O verdadeiro problema está no PATH. No Ubuntu, eles criam o sudo deliberadamente redefinindo o PATH.
user39559

env_keep preservou PYTHONPATH e HOME para mim, portanto há claramente algumas filtragem em andamento.
precisa saber é o seguinte

Na sua solução revisada, você está sugerindo que eu liguei o sudo PATH modificando secure_path, certo? Eu não acho que quero fazer isso. Provavelmente, estamos perto de uma resposta para minha pergunta; Eu acho que o sudo é construído para ignorar reset_env e ignorar variáveis ​​como PATH e LD_LIBRARY_PATH, quando especificado com env_keep. Eu acho que eu posso fazer sem preservar PATH / LD_LIBRARY_PATH sob sudo, ele é nada demais, mas ainda é interessante saber por que ele não vai funcionar :)
aknuds1

Não funcionará porque os sudoescritores foram cuidadosos ao impedir que você o fizesse. Você não deseja que a biblioteca maliciosa seja carregada porque foi encontrada no caminho usado pelo sudo. Então, é por isso que é redefinido. Se você estiver codificando coisas que devem ser executadas pela raiz, copie-as para o diretório do sistema apropriado.
precisa saber é o seguinte

8

Brincar sudoersé para ser feito com cautela, como outros já disseram.

Uma abordagem mais simples para casos mais simples, quando há variáveis ​​de ambiente específicas que você deseja preservar, é apenas passar a variável de ambiente desejada diretamente através do sudo (isso é mostrado [VAR=value]na ajuda do sudo cmdline).

Veja este pequeno exemplo em que também o demonstrei para mais de uma variável.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

Para o PYTHONPATHexemplo original da pergunta, basta usar o seguinte:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Criar um alias para esse tipo de coisa é útil. Igual a:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'

1
pode ser bom fazer isso - aliás sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python' - use-o sudopy some_script.py
Able Mac

@AbleMac Você está certo. Isso foi um erro ... Eu vou consertar. Obrigado!
Russ

3

Você Defaults !env_resetparece bem, supondo que você também não esteja chamando o sudo com a -Eopção

Você pode tentar remover completamente essa entrada.

Você verificou que está editando o arquivo sudoers correto? Eu estou supondo que poderia ser /etc/sudoersou /usr/local/etc/sudoersdependendo de como foi instalado. Você editou usando visudo?

Como você está executando o sudo? sudo python, sudo su, sudo su -, sudo -s, Outra coisa? Somente sudo pythone sudo supreservaria seu ambiente.

O que env | grep PYTHONPATHdiz? Se nada, verifique se o PYTHONPATH é exportado executando export PYTHONPATHe tente novamente.

O que sudo env | grep PYTHONPATHdiz? Se ele imprimir o valor esperado, algo mais estará substituindo seu valor PYTHONPATH. Talvez o .bashrc ou o .bash_profile do root ou os arquivos de configuração do sistema.


1
Tenho certeza de que estou editando os sudoers corretos, com o prefixo de instalação correspondente ao sudo. Estou executando o sudo como "sudo su". Infelizmente, em alguns dias terei de responder a você e responder às demais sugestões. Obrigado!
precisa saber é o seguinte

1
Tente alterar uma configuração sem importância como editorou passpromptpara ver se você possui o arquivo correto. Ou use strace, dtrace, truss ou similar e veja quais arquivos ele abre.
Mikel

env | grep PYTHONPATH quando meu usuário imprime o valor esperado, no sudo, no entanto, nada é impresso. Editando sudoers, posso garantir que PYTHONPATH seja preservado modificando "env_keep". No entanto, env_keep não preservará PATH ou LD_LIBRARY_PATH. Eu acho que o sudo tem uma restrição de segurança para não preservar variáveis ​​como PATH e LD_LIBRARY_PATH? Uma configuração em tempo de construção, talvez?
precisa saber é o seguinte

1
! env_reset é ignorado até onde eu sei, mas posso verificar amanhã. Tenho certeza de que env_delete não está sendo definido, mas posso verificar isso também.
precisa saber é o seguinte

1
Confirmei que! Env_reset é ignorado e env_delete não está definido.
precisa saber é o seguinte

-1

De acordo com a documentação do Ubuntu para LD_LIBRARY_PATH :

Você deve usar os arquivos de configuração /etc/ld.so.conf.d/*.conf

Então:

  1. Adicione um ld.soarquivo de configuração /etc/ld.so.conf.d/com o caminho do seuLD_LIBRARY_PATH

  2. Atualize o cache com:

    sudo ldconfig -v
    

Bom, mas a questão não é sobre o Ubuntu. Dica: da próxima vez, observe as tags sob a pergunta.
DavidPostill
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.