it-swarm.com.de

Wie kann Sudo $ HOME in Ubuntu nicht ändern und wie kann dieses Verhalten deaktiviert werden?

Unter Ubuntu 12.04, wenn ich Sudo -s Die Variable $ HOME wird nicht geändert. Wenn mein regulärer Benutzer regularuser ist, sieht die Situation folgendermaßen aus:

$ 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 sind also:

Q1. Wie wird das gemacht? Wo ist die Konfiguration?

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 erhalten, nach der ich suche.

Q3. In Debian Sudo -s, ändert die Variable $ HOME in /root. Nach dem, was ich aus den Antworten und man Sudo die Shell lief mit Sudo -s ist die in /etc/passwd, Recht?

Q4. Sowohl unter Ubuntu als auch unter Debian ist die in /etc/passwd für root ist /bin/bash. In beiden Systemen kann ich auch nicht finden, wo der Unterschied in .profile oder .bashrc files ist, soweit es $ HOME betrifft, so dass das Verhalten von Sudo -s unterscheidet sich. Hilfe dazu?

42
alxs

Sudo bietet viele Konfigurationsoptionen zur Kompilierungszeit. Sie können die Einstellungen in Ihrer Version mit Sudo -V Auflisten. Einer der Unterschiede zwischen der Konfiguration in Debian wheezy und in Ubuntu 12.04 besteht darin, dass die Umgebungsvariable HOME in Ubuntu beibehalten wird, nicht jedoch in Debian. Beide Distributionen löschen alle Umgebungsvariablen mit Ausnahme einiger weniger, die explizit als sicher gekennzeichnet sind. Somit behält Sudo -sHOME unter Ubuntu bei, während unter Debian HOME gelöscht wird und Sudo es dann auf das Home-Verzeichnis des Zielbenutzers setzt.

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

  • env_keep Legt fest, welche Umgebungsvariablen erhalten bleiben. Verwenden Sie Defaults env_keep += "HOME", Um die Umgebungsvariable HOME des Anrufers beizubehalten, oder Defaults env_keep -= "HOME", Um sie zu löschen (und ersetzen Sie sie durch das Ausgangsverzeichnis des Zielbenutzers).
  • env_reset Legt fest, 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, hat jedoch keinen direkten Sicherheitsvorteil für Regeln, mit denen ohnehin beliebige Befehle ausgeführt werden können.
  • Wenn always_set_home Gesetzt ist, wird HOME überschrieben, auch wenn es beibehalten wurde, weil env_reset Deaktiviert wurde oder HOME im env_keep Liste. Diese Option hat keine Auswirkung, wenn HOME ohnehin nicht beibehalten wird.
  • set_home Ist wie always_set_home, Gilt jedoch nur für Sudo -s, Nicht wenn Sudo mit einem expliziten Befehl aufgerufen wird.

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

Sie können jederzeit HOME für einen bestimmten Aufruf von Sudo überschreiben, indem Sie die Option -H Übergeben.

Die Shell überschreibt niemals den Wert von HOME. (Es würde HOME setzen, wenn es nicht gesetzt wäre, aber Sudo setzt HOME immer auf die eine oder andere Weise.)

Wenn Sie Sudo -i Ausführen, simuliert Sudo eine erste Anmeldung. Dies beinhaltet das Setzen von HOME auf das Home-Verzeichnis des Zielbenutzers und das Aufrufen einer Login-Shell .

Verwenden Sudo -H -i Anstatt 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)).
17
franco

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

$ Sudo -i

wie zu sehen ist 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 angegeben:

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

5
msw

Eine sehr beliebte Methode, um Root-Shell zu erhalten, ist auch:

 $ Sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root
2
Satanowski

Um das unterschiedliche Verhalten von Sudo -s Unter Ubuntu und Debian können Sie einen Sudo -Wrapper 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"
0
tacz