Comment sudo est-il configuré pour ne pas modifier $ HOME dans Ubuntu et comment désactiver ce comportement?

39

Sous Ubuntu 12.04, lorsque sudo -sla variable $ HOME n’est pas modifiée, si mon utilisateur habituel l’est regularuser, la situation est la suivante:

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

J'ai abandonné Ubuntu il y a longtemps, donc je ne peux pas en être sûr, mais je pense que c'est le comportement par défaut. Donc, mes questions sont:

Q1. Comment est-ce fait? Où est la config?

Q2. Comment puis-je le désactiver?

Edit: Merci pour les réponses, ce qui clarifie un peu les choses, mais je suppose que je dois ajouter quelques questions, pour obtenir la réponse que je cherche.

Q3. Dans Debian sudo -s, remplace la variable $ HOME par /root. D'après ce que je tire des réponses et man sudodu shell, celui qui a été utilisé sudo -sest celui donné /etc/passwd, non?

Q4. Cependant, sur Ubuntu et Debian, le shell indiqué /etc/passwdpour root est /bin/bash. Dans les deux systèmes également, je ne peux pas trouver où la différence .profileou les .bashrcfichiers est, en ce qui concerne $ HOME, de sorte que le comportement est sudo -sdifférent. Toute aide sur ceci?

alxs
la source
Vous avez répondu à une partie de votre question en commentant ma réponse, mais je pensais que je mettrais le lien unix.stackexchange.com/questions/38175/… ici. Je pense que votre affirmation au troisième trimestre est due au fait que certaines personnes définissent leur profil et leurs fichiers rc pour qu’ils agissent de la même manière, qu’ils soient ou non dans un shell de connexion. Je pense qu'il est extrêmement improbable que sudoDebian et Ubuntu se comportent différemment.
msw
@msw En ce qui concerne la différence entre Debian et Ubuntu (12.04) sudo, je pense qu’il ya effectivement une différence par défaut. Cependant, je ne parie pas là-dessus, car je suis sur une boîte qui a été configurée par quelqu'un d'autre et qui fonctionne depuis un certain temps. En tout cas, pour ceux que ça intéresse, j'ai trouvé security.stackexchange.com/questions/18369/… et bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140 .
Alxs

Réponses:

51

Sudo dispose de nombreuses options de configuration à la compilation. Vous pouvez lister les paramètres de votre version avec sudo -V. Une des différences entre la configuration dans Debian Wheezy et dans Ubuntu 12.04 est que la HOMEvariable d’environnement est préservée dans Ubuntu mais pas dans Debian; les deux distributions effacent toutes les variables d'environnement, à l'exception de quelques-unes qui sont explicitement désignées comme sûres à préserver. Ainsi, sur Ubuntu, il est sudo -spréservé HOME, tandis que Debian HOMEest effacé, sudopuis défini dans le répertoire de base de l'utilisateur cible.

Vous pouvez remplacer ce comportement dans le sudoersfichier. Exécuter visudopour éditer le sudoersfichier. Il existe plusieurs options pertinentes:

  • env_keepdétermine quelles variables d'environnement sont préservées. Utilisez Defaults env_keep += "HOME"pour conserver HOMEou Defaults env_keep -= "HOME"effacer la variable d'environnement de l'appelant (et la remplacer par le répertoire de base de l'utilisateur cible).
  • env_resetdétermine si les variables d'environnement sont réinitialisées. La réinitialisation des variables d'environnement est souvent nécessaire pour les règles autorisant l'exécution d'une commande spécifique, mais ne présente pas d'avantage en termes de sécurité directe pour les règles autorisant l'exécution de commandes arbitraires.
  • always_set_home, si défini, provoque HOMEle remplacement même s'il a été préservé du fait de env_resetson désactivation ou de son HOMEinsertion dans la env_keepliste. Cette option n'a aucun effet si elle HOMEn'est pas conservée.
  • set_homeest comme always_set_home, mais s’applique seulement à sudo -s, pas lorsqu’on appelle sudoavec une commande explicite.

Ces options peuvent être définies pour un utilisateur source donné, un utilisateur cible donné ou une commande donnée. voir le sudoersmanuel pour plus de détails.

Vous pouvez toujours choisir de remplacer HOMEun appel donné sudoen passant l'option -H.

Le shell ne remplacera jamais la valeur de HOME. (Cela définirait HOMEs'il était non défini , mais sudodéfinissait toujours d' HOMEune manière ou d'une autre.)

Si vous exécutez sudo -i, sudosimule une connexion initiale. Cela inclut la définition HOMEdu répertoire de base de l'utilisateur cible et l'appel d'un shell de connexion .

Gilles, arrête de faire le mal
la source
17

Utilisez sudo -H -iau lieu de sudo -spour obtenir un shell racine de connexion interactif:

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
la source
-iimplique -H.
x-yuri
5

Cela a peu à voir avec le comportement sudoet beaucoup avec la différence entre un "shell de connexion" et un "shell de non-connexion". La solution rapide est

$ sudo -i

comme on peut le voir avec:

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

Comme indiqué dans le manuel sudo:

L'option -i (simuler la connexion initiale) exécute le shell spécifié par l'entrée de la base de données de mots de passe de l'utilisateur cible en tant que shell de connexion. Cela signifie que les fichiers de ressources spécifiques à la connexion, tels que .profile ou .login, seront lus par le shell. Si une commande est spécifiée, elle est transmise au shell pour exécution via l'option -c du shell. Si aucune commande n'est spécifiée, un shell interactif est exécuté.

msw
la source
Merci pour les détails supplémentaires, ils ont clarifié les choses un peu plus pour moi. Je suppose que je dois vérifier la différence entre les coquillages. Pour tous ceux qui lisent ceci, dans la même situation que moi, vérifiez ceci: unix.stackexchange.com/questions/38175/…
alxs
1
Non, le fait que sudo change HOMEou non a tout à voir avec la configuration de sudo.
Gilles, arrête de faire le mal
@ Gilles: Alors, comment sudo est-il configuré? En /etc/sudoersce qui concerne $ HOME, il n’ya rien de différent entre Debian et Ubuntu.
Alxs
1
@alxs IIRC Debian et Ubuntu ont des valeurs par défaut de compilation différentes. Vous pouvez les remplacer avec les options always_set_homeet set_homedans sudoers.
Gilles 'SO- arrête d'être méchant'
@ Gilles: Merci. C'est exactement la réponse que je recherche, à la fois sur la raison pour laquelle cela se produit et sur la manière de l'inverser. Si cela ne vous dérange pas de l'afficher, je l'accepterai comme réponse. Je pourrais le faire moi-même, mais je ne veux pas en prendre le crédit.
Alxs
2

Un moyen très répandu d’obtenir le shell root utilise également:

 $ sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root
Satanowski
la source
J'avais l'habitude d'utiliser sudo -i -H, mais cela a échoué avec l'installation d'un paquet npm global à partir de git. Avec sudo su -ça marche! Merci.
Laurent
0

Pour vous débarrasser des comportements différents d’ sudo -sUbuntu et de Debian, vous pouvez utiliser un sudowrapper (réponse à la question 4):

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
la source