Como o sudo está definido para não alterar $ HOME no Ubuntu e como desativar esse comportamento?

39

No Ubuntu 12.04, quando sudo -sa variável $ HOME não é alterada, por isso, se meu usuário comum é regularuser, a situação é a seguinte:

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser

Eu abandonei o Ubuntu há muito tempo, então não tenho certeza, mas acho que esse é o comportamento padrão. Então, minhas perguntas são:

Q1 Como isso é feito? Onde está a configuração?

Q2 Como faço para desativá-lo?

Edit: Obrigado pelas respostas, que esclareceram um pouco as coisas, mas acho que devo adicionar algumas perguntas, para obter a resposta que estou procurando.

Q3 No Debian sudo -s, altera a variável $ HOME para /root. Pelo que recebo das respostas e man sudoo shell correu, sudo -sé o que é indicado /etc/passwd, certo?

Q4. No entanto, no Ubuntu e no Debian, o shell fornecido /etc/passwdcomo root é /bin/bash. Também em ambos os sistemas, não consigo encontrar onde está a diferença em .profileou .bashrcarquivos, no que diz respeito a $ HOME, de modo que o comportamento de sudo -sdifere. Alguma ajuda nisso?

alxs
fonte
Você respondeu parte de sua própria pergunta em um comentário, mas pensei em colocar o link unix.stackexchange.com/questions/38175/… aqui. Acho que sua reivindicação no terceiro trimestre é porque algumas pessoas definem seus perfis e arquivos rc para agir da mesma maneira, independentemente de estarem em um shell de login ou não. Eu acho extremamente improvável que sudose comporte de maneira diferente entre o Debian e o Ubuntu.
msw
@msw No que diz respeito à diferença entre o Debian e o Ubuntu (12.04) sudo, acho que realmente há uma diferença por padrão. No entanto, eu não aposto nisso, pois estou em uma caixa que foi configurada por outra pessoa e está em execução há um bom tempo. De qualquer forma, para qualquer pessoa interessada, encontrei security.stackexchange.com/questions/18369/… e bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140 .
Alxs

Respostas:

51

O Sudo tem muitas opções de configuração em tempo de compilação. Você pode listar as configurações na sua versão com sudo -V. Uma das diferenças entre a configuração no Debian wheezy e no Ubuntu 12.04 é que a HOMEvariável de ambiente é preservada no Ubuntu, mas não no Debian; ambas as distribuições apagam todas as variáveis ​​de ambiente, exceto algumas que são explicitamente marcadas como seguras para preservar. Assim, sudo -spreserva HOMEno Ubuntu, enquanto o Debian HOMEé apagado e o sudodefine no diretório inicial do usuário alvo.

Você pode substituir esse comportamento no sudoersarquivo Execute visudopara editar o sudoersarquivo. Existem várias opções relevantes:

  • env_keepdetermina quais variáveis ​​de ambiente são preservadas. Use Defaults env_keep += "HOME"para manter a HOMEvariável de ambiente do chamador ou Defaults env_keep -= "HOME"para apagá-la (e substituí-la pelo diretório inicial do usuário de destino).
  • env_resetdetermina se as variáveis ​​de ambiente são redefinidas. A redefinição de variáveis ​​de ambiente geralmente é necessária para regras que permitem a execução de um comando específico, mas não possui um benefício direto de segurança para regras que permitem a execução de comandos arbitrários de qualquer maneira.
  • always_set_home, se definido, faz HOMEcom que seja substituído, mesmo que tenha sido preservado por env_resetestar desabilitado ou por HOMEestar na env_keeplista. Esta opção não tem efeito se HOMEnão for preservada de qualquer maneira.
  • set_homeé como always_set_home, mas só se aplica a sudo -s, não ao chamar sudocom um comando explícito.

Essas opções podem ser definidas para um determinado usuário de origem, um determinado usuário de destino ou um determinado comando; veja o sudoersmanual para detalhes.

Você sempre pode optar por substituir HOMEuma chamada sudo, passando a opção -H.

O shell nunca substituirá o valor de HOME. (Ele definiria HOMEse não estivesse definido , mas sudosempre definirá HOMEum caminho ou outro.)

Se você executar sudo -i, sudosimula um login inicial. Isso inclui a configuração HOMEno diretório inicial do usuário de destino e a chamada de um shell de login .

Gilles 'SO- parar de ser mau'
fonte
17

Use em sudo -H -ivez de sudo -sobter um shell raiz de logon interativo:

sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

De man sudo:

-H      The -H (HOME) option sets the HOME environment variable to
        the homedir of the target user (root by default) as
        specified in passwd(5).  By default, sudo does not modify
        HOME (see set_home and always_set_home in sudoers(5)).
franco
fonte
-iimplica -H.
x-yuri
5

Isso tem pouco a ver com o comportamento sudoe muito a ver com a diferença entre um "shell de login" e um "shell sem login". A solução rápida é

$ sudo -i

como pode ser visto com:

$ sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ sudo -i
# echo $HOME
/root
# pwd
/root

Conforme observado no manual do sudo:

A opção -i (simular login inicial) executa o shell especificado pela entrada do banco de dados de senha do usuário de destino como um shell de login. Isso significa que os arquivos de recursos específicos de login, como .profile ou .login, serão lidos pelo shell. Se um comando for especificado, ele será passado para o shell para execução através da opção -c do shell. Se nenhum comando for especificado, um shell interativo será executado.

msw
fonte
Obrigado pelos detalhes extras, eles esclareceram um pouco mais as coisas para mim. Acho que tenho que verificar a diferença entre conchas. Para quem estiver
alxs 19/09/09
1
Não, se o sudo muda HOMEou não tem tudo a ver com a forma como o sudo está configurado.
Gilles 'SO- stop be evil' '
@ Gilles: Então, como o sudo está configurado? Em /etc/sudoers, não há nada de diferente entre o Debian e Ubuntu, tanto quanto $ HOME está em causa.
precisa saber é
1
@alxs IIRC O Debian e o Ubuntu têm diferentes padrões em tempo de compilação. Você pode substituí-los pelas opções always_set_homee set_homepor sudoers.
Gilles 'SO- stop be evil'
@ Gilles: Obrigado. Essa é exatamente a resposta que estou procurando, tanto por que isso acontece quanto como revertê-lo. Se você não se importa de publicá-lo, aceitarei como resposta. Eu poderia fazer isso sozinho, mas não quero receber crédito por isso.
Alxs
2

A maneira bastante popular de obter o shell raiz também está usando:

 $ sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root
Satanowski
fonte
Eu uso sudo -i -H, mas ele falhou ao instalar um pacote npm global do git. Com sudo su -isso funciona! Obrigado.
Laurent
0

Para se livrar do comportamento diferente do sudo -sUbuntu e Debian, respectivamente, você pode usar um sudowrapper (resposta à Q4):

sudos() {
   local PATH="$(getconf PATH)" root_homedir
   root_homedir="$(sudo -H sh -c 'printf "%s" "$HOME"')"
   sudo sh -c 'export HOME="$0"; exec sh -i' "$root_homedir"
   return 0
}

sudo -k
sudos
{
logname
whoami
id -un
id -ur
echo "PATH: $PATH"
}
exit
echo "PATH: $PATH"
tacz
fonte