¿Cómo se configura sudo para no cambiar $ HOME en Ubuntu y cómo deshabilitar este comportamiento?

39

En Ubuntu 12.04, cuando sudo -sla variable $ HOME no cambia, entonces si mi usuario habitual lo está regularuser, la situación es la siguiente:

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

Hace mucho tiempo que abandoné Ubuntu, así que no puedo estar seguro, pero creo que este es el comportamiento predeterminado. Entonces, mis preguntas son:

Q1. ¿Cómo se hace esto? ¿Dónde está la configuración?

Q2 ¿Cómo lo desactivo?

Editar: Gracias por las respuestas, que aclararon un poco las cosas, pero supongo que debo agregar un par de preguntas para obtener la respuesta que estoy buscando.

Q3. En Debian sudo -s, cambia la variable $ HOME a /root. De lo que obtengo de las respuestas y man sudoel shell con el que sudo -sse ejecutó es el indicado /etc/passwd, ¿verdad?

Q4. Sin embargo, tanto en Ubuntu como en Debian, el shell dado /etc/passwdpara root es /bin/bash. En cualquiera de los dos sistemas tampoco, no puedo encontrar dónde está la diferencia .profileo los .bashrcarchivos, en lo que respecta a $ HOME, por lo que el comportamiento de sudo -sdifiere. ¿Alguna ayuda en esto?

alxs
fuente
Respondiste parte de tu propia pregunta en un comentario sobre mi respuesta, pero pensé que pondría el enlace unix.stackexchange.com/questions/38175/… aquí. Creo que su reclamo en el tercer trimestre se debe a que algunas personas configuran su perfil y sus archivos rc para que actúen de la misma manera, independientemente de si están en un shell de inicio de sesión o no. Creo que es muy poco probable que se sudocomporte de manera diferente entre Debian y Ubuntu.
msw
@msw En lo que respecta a la diferencia entre Debian y Ubuntu (12.04) sudo, creo que de hecho hay una diferencia por defecto. Sin embargo, no apuesto por eso, ya que estoy en una caja que ha sido configurada por otra persona y ha estado funcionando durante bastante tiempo. En cualquier caso, para cualquier persona interesada, encontré security.stackexchange.com/questions/18369/… y bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140 .
Alxs

Respuestas:

51

Sudo tiene muchas opciones de configuración en tiempo de compilación. Puede enumerar las configuraciones en su versión con sudo -V. Una de las diferencias entre la configuración en Debian wheezy y en Ubuntu 12.04 es que la HOMEvariable de entorno se conserva en Ubuntu pero no en Debian; ambas distribuciones borran todas las variables de entorno, excepto algunas que están explícitamente marcadas como seguras para preservar. Por lo tanto, se sudo -sconserva HOMEen Ubuntu, mientras que en Debian HOMEse borra y sudoluego lo establece en el directorio de inicio del usuario objetivo.

Puede anular este comportamiento en el sudoersarchivo. Ejecute visudopara editar el sudoersarchivo. Hay varias opciones relevantes:

  • env_keepdetermina qué variables de entorno se conservan. Utilícelo Defaults env_keep += "HOME"para retener la HOMEvariable de entorno de la persona que llama o Defaults env_keep -= "HOME"para borrarla (y reemplazarla por el directorio de inicio del usuario objetivo).
  • env_resetdetermina si las variables de entorno se restablecen en absoluto. Restablecer las variables de entorno a menudo es necesario para las reglas que permiten ejecutar un comando específico, pero no tiene un beneficio de seguridad directo para las reglas que permiten ejecutar comandos arbitrarios de todos modos.
  • always_set_home, si está configurado, hace HOMEque se anule incluso si se conserva debido a que env_resetestá deshabilitado o HOMEestá en la env_keeplista. Esta opción no tiene efecto si HOMEno se conserva de todos modos.
  • set_homees como always_set_home, pero solo se aplica sudo -s, no cuando se llama sudocon un comando explícito

Estas opciones se pueden configurar para un usuario fuente dado, un usuario objetivo dado o un comando dado; Vea el sudoersmanual para más detalles.

Siempre puede optar por anular HOMEuna llamada dada sudopasando la opción -H.

El shell nunca anulará el valor de HOME. (Se establecería HOMEsi no estuviera configurado, pero sudosiempre se configura de HOMEuna forma u otra).

Si ejecuta sudo -i, sudosimula un inicio de sesión inicial. Esto incluye configurar HOMEel directorio de inicio del usuario objetivo e invocar un shell de inicio de sesión .

Gilles 'SO- deja de ser malvado'
fuente
17

Use en sudo -H -ilugar de sudo -sobtener un shell de inicio de sesión interactivo:

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
fuente
-iimplica -H.
x-yuri
5

Esto tiene poco que ver con el comportamiento sudoy mucho con la diferencia entre un "shell de inicio de sesión" y un "shell sin inicio de sesión". La solución rápida es

$ sudo -i

como se puede ver con:

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

Como se señala en el manual de sudo:

La opción -i (simular inicio de sesión inicial) ejecuta el shell especificado por la entrada de la base de datos de contraseñas del usuario objetivo como un shell de inicio de sesión. Esto significa que el shell leerá los archivos de recursos específicos de inicio de sesión como .profile o .login. Si se especifica un comando, se pasa al shell para su ejecución a través de la opción -c del shell. Si no se especifica ningún comando, se ejecuta un shell interactivo.

msw
fuente
Gracias por los detalles adicionales, me aclararon un poco más las cosas. Supongo que tengo que comprobar la diferencia entre conchas. Para cualquiera que lea esto, en la misma situación conmigo, verifique esto: unix.stackexchange.com/questions/38175/…
alxs
1
No, si sudo cambia HOMEo no tiene todo que ver con cómo se configura sudo.
Gilles 'SO- deja de ser malvado'
@Gilles: Entonces, ¿cómo se configura sudo? En /etc/sudoers, no hay nada diferente entre Debian y Ubuntu en lo que respecta a $ HOME.
alxs
1
@alxs IIRC Debian y Ubuntu tienen valores predeterminados de tiempo de compilación diferentes. Puede anularlos con las opciones always_set_homey set_homeen sudoers.
Gilles 'SO- deja de ser malvado'
@Gilles: gracias. Esa es exactamente la respuesta que estoy buscando, tanto sobre por qué sucede esto y cómo revertirlo. Si no te importa publicarlo, lo aceptaré como respuesta. Podría hacerlo yo mismo, pero no quiero dar crédito por ello.
alxs
2

Una forma bastante popular de obtener root shell también está usando:

 $ sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root
Satanowski
fuente
sudo -i -HSolía usar , pero falló al instalar un paquete global npm desde git. ¡Con sudo su -eso funciona! Gracias.
Laurent
0

Para deshacerse del comportamiento diferente de sudo -sUbuntu y Debian, respectivamente, puede usar un sudocontenedor (respuesta a la P4):

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
fuente