Wie wird sudo so eingestellt, dass $ HOME in Ubuntu nicht geändert wird und wie wird dieses Verhalten deaktiviert?

39

Unter Ubuntu 12.04 sudo -ssieht regularuserdie Situation folgendermaßen aus , wenn ich die Variable $ HOME nicht ändere :

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

Ich habe Ubuntu vor langer Zeit verlassen, daher kann ich nicht sicher sein, aber ich denke, dies ist das Standardverhalten. Meine Fragen lauten also:

Q1. Wie geht das? Wo ist die Konfig?

Q2. Wie deaktiviere ich es?

Edit: Danke für die Antworten, die die Dinge ein wenig geklärt haben, aber ich denke, ich muss ein paar Fragen hinzufügen, um die Antwort zu bekommen, die ich suche.

Q3. Ändert in Debian sudo -sdie Variable $ HOME in /root. Nach den Antworten, man sudomit denen ich lief, sudo -sist die in gegeben /etc/passwd, oder?

Q4. Sowohl unter Ubuntu als auch unter Debian ist die /etc/passwdfür root angegebene Shell jedoch /bin/bash. In beiden Systemen kann ich auch nicht finden, wo sich der Unterschied in .profileoder in .bashrcDateien befindet, was $ HOME betrifft, so dass sich das Verhalten von sudo -sunterscheidet. Irgendeine Hilfe dazu?

alxs
quelle
Sie haben einen Teil Ihrer eigenen Frage in einem Kommentar zu meiner Antwort beantwortet, aber ich dachte, ich würde den Link unix.stackexchange.com/questions/38175/… hier einfügen . Ich denke, Ihre Behauptung in Q3 ist, dass einige Leute ihr Profil und ihre RC-Dateien so einstellen, dass sie gleich sind, unabhängig davon, ob sie sich in einer Login-Shell befinden oder nicht. Ich halte es für äußerst unwahrscheinlich, dass sudosich Debian und Ubuntu unterschiedlich verhalten.
msw
@msw Was den Unterschied zwischen Debian und Ubuntu (12.04) betrifft sudo, denke ich, dass es in der Tat standardmäßig einen Unterschied gibt. Ich wette jedoch nicht darauf, da ich auf einer Box bin, die von jemand anderem eingerichtet wurde und schon eine ganze Weile läuft. Auf jeden Fall habe ich für alle Interessierten security.stackexchange.com/questions/18369/… und bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140 gefunden .
alxs

Antworten:

51

Sudo bietet viele Konfigurationsoptionen zur Kompilierungszeit. Mit können Sie die Einstellungen in Ihrer Version auflisten sudo -V. Einer der Unterschiede zwischen der Konfiguration in Debian Wheezy und in Ubuntu 12.04 ist, dass die HOMEUmgebungsvariable in Ubuntu, aber nicht in Debian erhalten bleibt. Beide Distributionen löschen alle Umgebungsvariablen mit Ausnahme einiger weniger, die ausdrücklich als sicher markiert sind. So sudo -sbleibt HOMEauf Ubuntu erhalten, während auf Debian HOMEgelöscht wird und sudosetzt es dann in das Home-Verzeichnis des Zielbenutzers.

Sie können dieses Verhalten in der sudoersDatei überschreiben . Führen Sie aus visudo, um die sudoersDatei zu bearbeiten . Es gibt mehrere relevante Optionen:

  • env_keepbestimmt, welche Umgebungsvariablen erhalten bleiben. Verwenden Sie Defaults env_keep += "HOME"diese Option, um die HOMEUmgebungsvariable des Aufrufers beizubehalten oder Defaults env_keep -= "HOME"zu löschen (und durch das Basisverzeichnis des Zielbenutzers zu ersetzen).
  • env_resetbestimmt, ob Umgebungsvariablen überhaupt zurückgesetzt werden. Das Zurücksetzen von Umgebungsvariablen ist häufig für Regeln erforderlich, mit denen ein bestimmter Befehl ausgeführt werden kann, bietet jedoch keinen direkten Sicherheitsvorteil für Regeln, mit denen ohnehin beliebige Befehle ausgeführt werden können.
  • always_set_homeWenn HOMEdiese Option festgelegt ist, wird sie überschrieben, auch wenn sie aufgrund env_reseteiner Deaktivierung oder eines HOMEEintrags in der env_keepListe beibehalten wurde . Diese Option hat keine Auswirkung, wenn sie HOMEnicht beibehalten wird.
  • set_homeist wie always_set_home, gilt aber nur für sudo -s, nicht beim Aufruf sudomit einem expliziten Befehl.

Diese Optionen können für einen bestimmten Quellbenutzer, einen bestimmten Zielbenutzer oder einen bestimmten Befehl festgelegt werden. sudoersEinzelheiten finden Sie im Handbuch.

Sie können jederzeit festlegen, HOMEdass ein bestimmter Anruf überschrieben sudowerden soll, indem Sie die Option übergeben -H.

Die Shell überschreibt niemals den Wert von HOME. (Es wird gesetzt, HOMEwenn es nicht gesetzt ist, setzt aber sudoimmer die HOMEeine oder andere Richtung.)

Wenn Sie ausführen sudo -i, wird sudoeine erste Anmeldung simuliert. Dies umfasst das Festlegen HOMEdes Basisverzeichnisses des Zielbenutzers und das Aufrufen einer Anmeldeshell .

Gilles 'SO - hör auf böse zu sein'
quelle
17

Verwenden Sie sudo -H -ianstelle von sudo -s, um eine interaktive Login-Root-Shell zu erhalten:

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

Von 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
quelle
-iimpliziert -H.
X-Yuri
5

Dies hat wenig mit dem Verhalten von sudound viel mit dem Unterschied zwischen einer "Login-Shell" und einer "Nicht-Login-Shell" zu tun. Die schnelle Lösung ist

$ sudo -i

wie man sieht mit:

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

Wie im sudo-Handbuch vermerkt:

Mit der Option -i (Erstanmeldung simulieren) wird die durch den Kennwortdatenbankeintrag des Zielbenutzers angegebene Shell als Anmeldeshell ausgeführt. Dies bedeutet, dass anmeldungsspezifische Ressourcendateien wie .profile oder .login von der Shell gelesen werden. Wenn ein Befehl angegeben wird, wird er über die Option -c der Shell zur Ausführung an die Shell übergeben. Wird kein Befehl angegeben, wird eine interaktive Shell ausgeführt.

msw
quelle
Vielen Dank für die zusätzlichen Details, sie haben die Dinge für mich ein bisschen klarer gemacht. Ich schätze, ich muss den Unterschied zwischen den Schalen überprüfen. Wenn Sie dies lesen, überprüfen Sie dies in der gleichen Situation wie ich: unix.stackexchange.com/questions/38175/…
alxs
1
Nein, ob sich sudo ändert HOMEoder nicht, hat alles damit zu tun, wie sudo konfiguriert ist.
Gilles 'SO- hör auf böse zu sein'
@ Gilles: Also, wie ist sudo konfiguriert? In /etc/sudoersBezug auf $ HOME gibt es keine Unterschiede zwischen Debian und Ubuntu.
Alxs
1
@alxs IIRC Debian und Ubuntu haben unterschiedliche Standardeinstellungen für die Kompilierungszeit. Sie können sie mit den Optionen always_set_homeund set_homein überschreiben sudoers.
Gilles 'SO - hör auf, böse
@ Gilles: Danke. Das ist genau die Antwort, nach der ich suche, sowohl was passiert als auch wie man es zurücksetzt. Wenn es Ihnen nichts ausmacht, werde ich es als Antwort akzeptieren. Ich könnte es selbst tun, aber ich möchte es nicht würdigen.
Alxs
2

Eine sehr beliebte Methode, um an die Root-Shell zu gelangen, ist auch die Verwendung von:

 $ sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root
Satanowski
quelle
Ich verwende sudo -i -H, aber es schlug fehl mit der Installation eines globalen npm-Pakets von Git. Damit sudo su -funktioniert es! Vielen Dank.
Laurent
0

Um das unterschiedliche Verhalten von sudo -sUbuntu und Debian zu beseitigen, können Sie einen sudoWrapper verwenden (Antwort auf 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
quelle