Passando PATH pelo sudo

13

Resumindo : como fazer o sudo para não liberar PATH toda vez?

Eu tenho alguns sites implantados no meu servidor (teste Debian) escritos com Ruby on Rails. Eu uso o Mongrel + Nginx para hospedá-los, mas há um problema que ocorre quando preciso reiniciar o Mongrel (por exemplo, depois de fazer algumas alterações).

Todos os sites são verificados no VCS (git, mas não é importante) e têm o proprietário e o grupo definidos para o meu usuário, enquanto o Mongrel é executado sob o usuário, huh, mongrel severamente restrito em seus direitos. Portanto, o Mongrel deve ser iniciado como root (ele pode alterar automaticamente o UID) ou mongrel.

Para gerenciar o mongrel, eu uso o mongrel_cluster gem porque permite iniciar ou parar qualquer quantidade de servidores Mongrel com apenas um comando. Mas ele precisa que o diretório /var/lib/gems/1.8/bin esteja no PATH: isso não é suficiente para iniciá-lo com o caminho absoluto .

A modificação de PATH no .bashrc raiz não mudou nada, os ajustes env_reset e env_keep do sudo também não.

Então a pergunta: como adicionar um diretório ao PATH ou manter o PATH do usuário no sudo?

Atualização: alguns exemplos

$ env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/var/lib/gems/1.8/bin
$ sudo cat /etc/sudoers | egrep -v '^$|^#'
Defaults    env_keep = "PATH"
root    ALL=(ALL) ALL
%sudo ALL=NOPASSWD: ALL
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Também posso dizer que funciona exatamente dessa maneira no Debian stable (lenny) também.

whitequark
fonte

Respostas:

12

Lutou com o mesmo problema por algumas horas. No debian lenny, você pode corrigi-lo adicionando

Defaults        exempt_group=<your group> 

para o arquivo sudoers.

Esta é a única maneira de contornar a opção compilada --secure-path, (tanto quanto eu sei).

Notavelmente, isso também isenta os usuários de precisarem digitar suas senhas quando fazem o sudo.

Roubar
fonte
3

Se você se secure_pathinscreveu /etc/sudoers, pode jogar com env_reset/ env_keeptudo o que quiser e isso não fará nenhuma diferença no caminho. Se você vir algo assim, comente.

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Draemon
fonte
Não, é claro que não foi definido.
whitequark
0

Eu diria que procure nas opções env_reset e env_keep no man sudo . Mas parece que você já fez isso (você acabou de chamar por eng_keep "keepenv"). Se você desabilitar a opção env_reset (o padrão está ativado), acho que não deve apagar nenhuma variável env. Mas isso é menos seguro.

Há também uma opção secure_path para o sudo; Eu acho que isso está ativado por padrão. Você pode tentar desativá-lo.

As opções anteriores são definidas no seu arquivo / etc / sudoers. Há também a -iopção de linha de comando para o sudo. Isso fará com que o sudo execute /root/.profile ou /root/.login. Você pode definir o caminho desejado lá.

dubiousjim
fonte
1
Não, quando o env_reset está desativado, ele ainda muda (não apaga) PATH. Provavelmente isso é feito para adicionar / * / sbin dirs. Não, a opção -i não é adequada porque inicia um shell interativo e eu preciso apenas executar um comando.
13135 Whitequark #
Ok, o problema desapareceu após a reinstalação do Debian (devido à migração para o LVM) e também do RubyGems; sua resposta foi a mais útil de todas, para que possa ser aceita agora.
whitequark
-1

Bem, você está fazendo algo errado. Além disso, você não especificou o que fez com o arquivo / etc / sudoers. Aqui está o que você deveria ter feito - este é um sistema CentOS, BTW:

Primeiro, isso está com a configuração env_keep correta (observe que PATH está lá):

sudo grep -5 PATH / etc / sudoers Padrões env_keep = "cores de exibição NOME_DO_HOST HISTSIZE INPUTRC KDEDIR \ LS_COLORS CORREIO PS1 PS2 QTDIR NOME DE UTILIZADOR \ LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \ LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LÍNGUA LINGUAS \ _XKB_CHARSET XAUTHORITY PATH"

Defaults   timestamp_timeout = 15 

## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple

-> export PATH=$PATH:hithere
-> sudo sh -c 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/bin:hithere

Parece bom. Agora vamos remover a configuração env_keep e tente novamente:

-> sudo visudo
-> sudo grep -5 PATH /etc/sudoers
                    LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                    LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                    LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                    LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                    _XKB_CHARSET XAUTHORITY"
 #_XKB_CHARSET XAUTHORITY PATH"

Que CAMINHO triste:

 -> sudo sh -c 'echo $PATH'
 /usr/bin:/bin
Emmel
fonte
1
Eu verifiquei que mais de duas vezes! Verifique a atualização no post.
whitequark
Eu tenho o mesmo problema, definitivamente tenho as configurações corretas que você mencionou #
Draemon