su vs sudo -s vs sudo -i vs sudo bash

89

Was ist der Unterschied zwischen den folgenden Befehlen:

su
sudo -s
sudo -i
sudo bash

Ich weiß, dass suich das root-Passwort kennen muss, und dass sudoich in der sudoersDatei sein muss, aber einmal ausgeführt, was ist der Unterschied?

Ich weiß, dass es einen Unterschied zwischen suund gibt, sudo -sweil sich mein Basisverzeichnis /rootnach der Ausführung befindet su, aber mein Basisverzeichnis noch /home/mynamedanach ist sudo -s. Aber ich vermute, dass dies nur ein Symptom für einen zugrunde liegenden Unterschied ist, den ich vermisse.

Snitse
quelle
3
Ich bevorzuge die Verwendung Auf sudo su - diese Weise benötigen Sie kein root-Passwort und stellen -sicher, dass das Home-Verzeichnis richtig eingestellt ist.
Jens Timmerman

Antworten:

114

Mit suwerden Sie ein anderer Benutzer - standardmäßig root, möglicherweise jedoch ein anderer Benutzer. Wenn Sie sagen su -, wird Ihre Umgebung auch durch die Anmeldeumgebung dieses Benutzers ersetzt, sodass nicht zu unterscheiden ist, was Sie sehen, wenn Sie sich als dieser Benutzer anmelden. Auf keinen Fall kann das System sueinem anderen Benutzer anhand der Aktionen dieses Benutzers beim Anmelden mitteilen, was Sie tun, während er sich anmeldet.

Ganz anders sieht es aus mit sudo:

  • Befehle, die Sie sudo ausführen, werden als Zielbenutzer ausgeführt - standardmäßig root, aber änderbar mit -u-, aber es protokolliert die Befehle, die Sie ausführen, und markiert sie mit Ihrem Benutzernamen, damit die Schuld später zugewiesen werden kann. :)

  • sudoist sehr flexibel. Sie können beispielsweise die Befehle einschränken, die ein bestimmter Benutzer oder eine bestimmte Benutzergruppe ausführen darf. Mit su, es ist alles oder nichts.

    Diese Funktion wird normalerweise zum Definieren von Rollen verwendet. Sie können beispielsweise eine "Backups" -Gruppe definieren, die ausgeführt werden darf dumpund die tarjeweils Root-Zugriff benötigt, um die Systemfestplatte ordnungsgemäß zu sichern.

    Ich erwähne dies hier, weil es bedeutet, dass Sie jemandem sudoPrivilegien geben können, ohne ihm sudo -soder seinen sudo bashFähigkeiten zu verleihen . Sie haben nur die Berechtigungen, die sie für ihre Arbeit benötigen, während susie über das gesamte System verfügen. Dabei muss man allerdings vorsichtig sein: Wenn man jemandem die Möglichkeit gibt sudo vi, beispielsweise zu sagen , vidass er die gleiche Kraft wie mit ausschütten und effektiv haben kann sudo -s.

  • Isoliert die sudoBerechtigung zwischen mehreren Sudoern, da das Passwort des Sudoers anstelle des Root-Passworts verwendet wird .

    Dies behebt ein administratives Problem su, bei dem bei einer Änderung des Root-Passworts alle Personen informiert werden mussten, die es wissen mussten, um es zu verwenden su. sudoErmöglicht es den Sudoern, ihre Passwörter unabhängig zu ändern. Tatsächlich ist es üblich, das Konto des Root-Benutzers auf einem System mit einem Kennwort zu sperren, um sudozu erzwingen, dass alle Sysadmin-Aufgaben über ausgeführt werden sudo. In einer großen Organisation mit vielen vertrauenswürdigen Sudoern bedeutet dies, dass Sie beim Verlassen eines der Sysadmins das Root-Kennwort nicht ändern und an die verbleibenden Administratoren weitergeben müssen.

Der Hauptunterschied zwischen sudo bashund sudo -sbesteht darin, dass -ses kürzer ist und Sie auf verschiedene Arten Befehle übergeben können, die in der Standard-Shell Ihres Benutzers ausgeführt werden sollen:

  1. Sie können sagen, sudo -s some-commandwas some-commandunter Ihrer Shell läuft . Es ist im Grunde eine Abkürzung für sudo $SHELL -c some-command.

  2. Sie können die Befehle stattdessen wie folgt an die Standardeingabe der Shell übergeben sudo -s < my-shell-script. Sie können dies mit einem heredoc verwenden , um mehrere Befehle an einen einzigen sudoAufruf zu senden , ohne dass Sie sudowiederholt tippen müssen .

Beide Verhaltensweisen sind optional. Weitaus häufiger geben Sie -sallein, sodass die Shell Ihres Benutzers nur interaktiv ausgeführt wird. In diesem Modus unterscheidet es sich davon, sudo bashdass möglicherweise eine andere Shell ausgeführt wird als bash, da diese zuerst in der SHELLUmgebungsvariablen und dann, wenn diese nicht festgelegt ist, in der Login-Shell-Einstellung Ihres Benutzers (normalerweise in) angezeigt wird /etc/passwd.

Die Shell, die von ausgeführt wird, sudo -serbt Ihre aktuelle Benutzerumgebung. Wenn Sie tatsächlich eine saubere Umgebung wünschen, wie Sie sie direkt nach der Anmeldung erhalten, möchten Sie stattdessen sudo -ieine relativ neue Erweiterung von sudo. Grob gesagt, sudo -iist es , sudo -swie su -ist su: es alle , aber ein paar wichtige Umgebungsvariablen setzt und sendet Sie zurück zu Ihrem Home - Verzeichnis des Benutzers. Wenn Sie ihm nicht auch Befehle zur Ausführung unter dieser Shell über die Standardeingabe oder geben sudo -i some-command, wird diese Shell als interaktive Anmeldeshell ausgeführt, sodass die Shell-Startskripte Ihres Benutzers (z. B. .bash_profile) erneut ausgeführt werden.

All dies macht sudo -iwesentlich sicherer als sudo -s. Warum? Denn wenn jemand Ihre Umgebung zuvor ändern kann sudo -s, kann dies dazu führen, dass unbeabsichtigte Befehle ausgeführt werden. Der naheliegendste Fall ist das Ändern SHELL, aber es kann auch weniger direkt vorkommen, z. B. über, PAGERwenn Sie sagen, man foowährend Sie unter sind sudo -s.

Sie könnten sagen: "Wenn sie etwas modifizieren können PAGER, können PATHsie etwas modifizieren und dann einfach ein böses sudoProgramm ersetzen ", aber jemand, der paranoid genug ist, kann dies sagen /usr/bin/sudo /bin/bash, um diese Falle zu umgehen. Sie sind wahrscheinlich nicht so paranoid, dass Sie auch die Fallen in allen anderen anfälligen Umgebungsvariablen meiden . Haben Sie EDITORzum Beispiel auch daran gedacht, dies zu überprüfen , bevor Sie einen VCS- Befehl ausgeführt haben? Also sudo -i.

Da sudo -iauch das Arbeitsverzeichnis zu Ihrem Benutzer-Home - Verzeichnis ändert, können Sie immer noch verwenden sudo -sfür Situationen , in denen Sie wissen , dass Sie im gleichen Verzeichnis bleiben wollen wurden Sie cd‚d in , wenn Sie läuft sudo. Es ist immer noch sicherer sudo -iund cdzurück, wo Sie waren, though.

Warren Young
quelle
2
Was meinst du mit "Shell out of vi"?
Crispon
11
@crisron: Von innen vi, Art :shund drücken Sie die Eingabetaste. Jetzt befinden Sie sich in einer Sub-Shell mit allen Berechtigungen des viProzesses, der diese Shell ausgelöst hat. Wenn vimit Root-Rechten ausgeführt wird, wird dies auch für die Shell gelten. Oder Sie können etwas anderes als eine Shell über ausführen :!cmd, die Ausgabe eines Befehls in den Bearbeitungspuffer über lesen :r !cmdusw. Wenn alle diese gesperrt sind, sind MakefileZiele Shell-Skripte, und Vim verfügt über den :makeBefehl, mit dem Sie effektiv eine beliebige Shell ausführen können Skripte aus dem Editor. Die Möglichkeiten für Unfug sind viel zu groß für dieses Kommentarfeld.
Warren Young
2
Wenn jemand eine Fälschung in Bash in Ihren Pfad einfügen kann, dann kann dieser jemand einen falschen Sudo in Ihren Pfad einfügen. /usr/bin/sudo
Um
1
@lesmana: Ich habe das in einer Bearbeitung angesprochen; Im Grunde ist das PATHnicht das einzige Problem.
Warren Young
6
Tolle Erklärung; große Kopfschmerzen beim Lesen.
Lobi
27

Aus einem Ubuntuforums-Post, den ich vor einiger Zeit gemacht habe:

Betrachten Sie das folgende Experiment:

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

Hier sind die Unterschiede, die ich gefunden habe:

Mit sudo -s:

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

Mit sudo su:

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

Beachten Sie den Unterschied in $HOME. Root zu sein und $HOMEzu Hause zu sein, kann zu Problemen führen. Wenn Sie beispielsweise eine grafische App ausführen, kann der normale Benutzer ~/.Xauthorityvon root überschrieben werden. Dies führt später zu normalen Benutzerproblemen, z. B. dass bestimmte grafische Apps nicht über cron ausgeführt werden können.

Zusammenfassen:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games wahrscheinlich von gesetzt /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Die unterste Zeile ist sudo -ider richtige Befehl, der ausgeführt werden soll, wenn Sie eine Root-Shell benötigen, die von der Benutzerumgebung nicht beeinträchtigt wird.

unutbu
quelle
1
Wie stark die Umgebung "befallen" ist, hängt auch von der Konfiguration von sudo(in /etc/sudoersund verwandten Dateien) ab. Konfigurationseinstellungen wie zum Beispiel always_set_home, env_reset, env_keep, env_checkund env_reset, und diese können in Abhängigkeit von dem Benutzer und dem Befehl. Siehe den Abschnitt ' Befehlsumgebung ' und SUDOERS-OPTIONEN auf der Hilfeseite sudoers (5) .
Curt J. Sampson
Persönlich gehe ich mit, sudo -Hswenn ich eine Umgebung ohne Beeinträchtigung durch meine Einstellungen haben möchte, da ich zsh und alle Anwendungskonten verwende, die ich möglicherweise auf bash umstelle. Dies lässt eine bestimmte Anzahl von Umgebungsvariablen ungestört passieren, aber ich finde normalerweise, dass diejenigen, die wichtig sind, von /etc/profile.d/* überschrieben werden.
Ed Grimm
7

suMit ( s witch u ser oder s ubstitute u ser) können Sie den Benutzer wechseln. suIm Grunde startet eine andere Shell-Instanz mit den Rechten des vorgesehenen Benutzers. Standardmäßig werden Sie zum rootBenutzer gewechselt. Wenn Sie einen bestimmten Benutzer wechseln möchten, müssen Sie den Benutzer wie folgt übergeben:

$ su bob  # switches to bob (requires bob's password)

su -bedeutet, dass Umgebungsvariablen auf root zurückgesetzt werden und subedeutet, dass Umgebungsvariablen als alter Benutzer verwendet werden.

Zum Beispiel: Roots Home-Verzeichnis, wenn Sie es verwenden, su -oder altes Benutzer-Home-Verzeichnis, wenn Sie es verwenden su.

sudo ( s uper u ser do ) ist ein Befehlszeilenprogramm, mit dem Benutzer Programme mit den Sicherheitsberechtigungen eines anderen Benutzers ausführen können. Standardmäßig ist es Superuser, d root. h . Es wird eine Konfigurationsdatei verwendet, in /etc/sudoersder aufgeführt ist, welche Benutzer Rechte für bestimmte Aktionen haben

sudo sollte als / ˈsuːduː / gelesen werden . syntax sudo commandie s witch u ser und mache diesen befehl.

  • suist äquivalent zu sudo -iund simuliert ein Login in das Root-Konto. Ihr Arbeitsverzeichnis /rootist und es liest root .profileusw. Die Eingabeaufforderung ändert sich von $ zu # und zeigt an, dass Sie root-Zugriff haben.

  • sudo -s Startet eine Shell als root, ändert aber nicht Ihr Arbeitsverzeichnis.

  • sudo bash wo bashist Befehl auszuführen mit sudo. Dieser Befehl wird bashals Superuser ausgeführt.

  • Mit sudokann alles protokolliert werden, was jemand macht.
  • Die Verwendung von sudoverhindert, dass ein Benutzer das root-Passwort kennen muss.
  • Mit können sudowir einschränken, welche Befehle ausgeführt werden dürfen.
Premraj
quelle