Warum benötigt der Befehl sudo kein root-Passwort?

48

Ich benutze Linux seit einiger Zeit und sudodachte, ich würde bei jeder Eingabe auf den Root-Benutzer umsteigen, um einen Befehl zu erhalten.

Anscheinend ist dies nicht der Fall, da ich nur das Passwort meines Benutzerkontos benötige. Ich vermute, da ich nicht mit mehreren Benutzern gearbeitet habe, ist mir dies in der realen Welt nicht wirklich aufgefallen.

Ich bin mir nicht sicher, wie Ubuntu meinen ersten Account erstellt. Gibt es einen Root-Benutzer? Bin ich root? Ich vermute, ich habe gerade einen neuen Benutzer bei der Installation angelegt, aber er hat mir root-Rechte verliehen. Nur ein bisschen verwirrt hier ...

Warum darf ich root-Befehle mit dem Passwort meines Benutzers ausführen?

EGHDK
quelle
Mit welchem ​​Benutzer benötigen Sie das Passwort und mit welchem ​​nicht? Welchen Befehl führen Sie aus? Denken Sie daran, dass sudo Ihr Passwort eine Zeit lang speichert, bevor Sie es erneut eingeben müssen.
Braiam
11
sudohat das Bit "setuid" gesetzt. Es wird also als der Benutzer ausgeführt, dem es gehört (der auf allen Standardsystemen root ist, wenn ich mich nicht irre), nicht als der Benutzer, der es startet. sudoLädt dann die /etc/sudoersDatei und prüft, was zulässig ist, je nachdem, wer sie gestartet hat.
LawrenceC
1
Es tut mir leid, wenn ich etwas wiederhole, was jemand anderes gesagt hat, aber ich konnte es nicht finden. Die Antwort lautet: Es ist eine politische Entscheidung. Meine beste Vermutung für die Motivation ist, dass Sie in einer großen Installation mit vielen sudoprivilegierten Personen, die möglicherweise an geografisch verteilten Orten und in Schichten rund um die Uhr arbeiten, den privilegierten Zugriff einer Person sofort widerrufen können möchten (z. B. wenn Sie vermuten seine Integrität). Wenn jeder das einmalige Root-Passwort verwendet und Sie dies ohne vorherige Abstimmung ändern, kann dies zu Chaos führen. …
G-Man sagt, dass Monica
1
@HagenvonEitzen Ich weiß, ich bin ein paar Tage zu spät dran , aber wie kommt das nicht von unserer Frage?
Strugee

Antworten:

65

Im Detail funktioniert es folgendermaßen:

  1. /usr/bin/sudoBei der ausführbaren Datei ist das setuid-Bit gesetzt, sodass sie auch dann ausgeführt wird, wenn sie von einem anderen Benutzer ausgeführt wird, und zwar mit der Benutzer-ID des Dateieigners (in diesem Fall root).

  2. sudoÜberprüft in der /etc/sudoersDatei, über welche Berechtigungen Sie verfügen und ob Sie den aufgerufenen Befehl ausführen dürfen. Einfach gesagt, /etc/sudoersist eine Datei, die definiert, welche Benutzer welche Befehle mithilfe eines sudoMechanismus ausführen können .

    So sieht diese Datei auf meinem Ubuntu aus:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    

    Die dritte Zeile interessiert Sie vermutlich. Damit kann jeder in der Gruppe "sudo" jeden Befehl als jeder Benutzer ausführen.

    Wenn Ubuntu während der Installation das erste Konto einrichtet, fügt es dieses Konto der Gruppe "sudo" hinzu. Mit dem groupBefehl können Sie überprüfen, welchen Gruppen welche Benutzer angehören .

  3. sudofragt Sie nach einem Passwort. In Bezug auf die Tatsache, dass es ein Benutzerpasswort benötigt, nicht das des Roots , das ein Auszug aus dem Handbuch von sudoers ist :

    Authentifizierung und Protokollierung

    Die Sicherheitsrichtlinie von sudoers verlangt, dass sich die meisten Benutzer authentifizieren, bevor sie sudo verwenden können. Ein Kennwort ist nicht erforderlich, wenn der aufrufende Benutzer root ist, wenn der Zielbenutzer mit dem aufrufenden Benutzer identisch ist oder wenn die Richtlinie die Authentifizierung für den Benutzer oder den Befehl deaktiviert hat. Im Gegensatz zu su (1) überprüft sudoers, wenn eine Authentifizierung erforderlich ist, die Anmeldeinformationen des aufrufenden Benutzers und nicht die Anmeldeinformationen des Zielbenutzers (oder des Stammbenutzers). Dies kann über die später beschriebenen Flags rootpw, targetpw und runaspw geändert werden.

    Tatsächlich wird sudoIhr Benutzerkennwort jedoch für nichts benötigt. Es wird darum gebeten, nur um sicherzustellen, dass Sie wirklich Sie sind, und um Ihnen eine Art Warnung (oder die Möglichkeit zum Stoppen) zu geben, bevor Sie einen potenziell gefährlichen Befehl aufrufen. Wenn Sie die Kennwortabfrage deaktivieren möchten, ändern Sie den Eintrag sudoers in:

    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. Nach der Authentifizierung wird ein sudountergeordneter Prozess gestartet, der den aufgerufenen Befehl ausführt. Das Kind erbt die Root-Benutzer-ID von seinem Elternteil - dem sudoProzess.


Beantworten Sie also Ihre Fragen genau:

Ich dachte, ich würde für einen Befehl zum Root-Benutzer wechseln.

Du hattest Recht. Jeder Befehl, dem sudoLäufe vorangestellt sind, wird mit der Root-Benutzer-ID ausgeführt.

Gibt es einen Root-Benutzer?

Ja, es gibt ein Root-Benutzerkonto, das sich von Ihrem Benutzerkonto unterscheidet, das während der Systeminstallation erstellt wurde. In Ubuntu ist es Ihnen jedoch standardmäßig nicht gestattet, sich als Root-Benutzer am interaktiven Terminal anzumelden.

Bin ich root?

Nein, du bist keine Wurzel. Sie haben nur die Berechtigung, einzelne Befehle mit dem sudooben beschriebenen Mechanismus als Root auszuführen .

Warum darf ich root-Befehle mit dem Passwort meines Benutzers ausführen?

Sie müssen das Passwort des Benutzers nur aufgrund des sudointernen Sicherheitsmechanismus eingeben . Es kann leicht ausgeschaltet werden. Sie erhalten Ihre Root-Rechte aufgrund von "setuid" /usr/bin/sudound nicht aufgrund von eingegebenen Passwörtern.

Piotr Jurkiewicz
quelle
6
Die Antwort sollte eigentlich mit dem setuid-Teil beginnen, denn das ist der Grund, warum es tatsächlich möglich ist. / etc / sudoers ist nur der Grund für die Flexibilität des Befehls sudo.
Daniel Kullmann
Interessant. Ich wusste nicht, dass Sie angeben können, dass ausgeführt sudowerden kann, ohne mein Kennwort einzugeben. Gute Antwort!
jwir3
1
Beachten Sie, dass sudo so konfiguriert werden kann, dass das Root-Passwort mit dem rootpwFlag in abgefragt wird sudoers.
Reinstate Monica - M. Schröder
2
Sie können sich in der Tat als Root-Benutzer anmelden: sudo su - rootgenau das tun und Ihnen ein Root-Terminal geben. Sie können sich jedoch nicht einfach als root bei einer Desktopsitzung anmelden.
Jmiserez
1
Grundsätzlich sudohat es das Root-Recht für sich und entscheidet anhand einer Konfigurationsdatei, ob es Ihnen dieses Recht erteilt.
Siyuan Ren
15
  • Der springende Punkt sudoist, Ihnen die Privilegien eines anderen Benutzers (normalerweise root) zu gewähren, ohne nach dem Passwort dieses anderen Kontos zu fragen (im Gegensatz zu su).

  • sudo fragt hier nach Ihrem Passwort, um sicherzustellen, dass ein Passant Ihr entsperrtes Terminal nicht missbraucht.

  • Ubuntu und viele andere Linux- und Unix-Betriebssysteme gewähren einem zum Zeitpunkt der Installation erstellten Erstkonto das Recht, Befehle wie folgt auszuführen root.

  • Während rootes sich noch um ein Linux-Konto handelt, sind direkte rootAnmeldungen aus Gründen der Sicherheit und Nachverfolgbarkeit standardmäßig deaktiviert.

jlliagre
quelle
7
Obwohl die direkte Root-Anmeldung standardmäßig deaktiviert ist, gibt es bei Ubuntu immer noch einen Root-Account. Zumindest unter Solaris ist es kein Konto mehr, bei dem es sich standardmäßig um eine Rolle handelt.
Juli
Vielen Dank - ich habe mich immer gefragt, wie das überhaupt funktioniert, und es macht jetzt viel mehr Sinn.
mikeserv
5

Piotr gab eine sehr gute Erklärung, wie es sudofunktioniert. Allerdings hat er nicht wirklich begründet, warum es so funktioniert, also werde ich versuchen, das hier hinzuzufügen.

Bevor der sudoBefehl erstellt wurde, hatten wir den suBefehl. Mit diesem Befehl kann ein Benutzer normalerweise Befehle als ein anderer Benutzer ausführen root(wie bei sudoist dies der Standardzielbenutzer). Es war völlig undiskriminierend, Sie können jeden Befehl ausführen. Da es von jedem Benutzer verwendet werden konnte und praktisch der Anmeldung als dieser Benutzer entsprach, mussten Sie das Kennwort des Zielbenutzers kennen.

Irgendwann wurde ein bisschen mehr Zugangskontrolle hinzugefügt: Um dies zu nutzen su, musste man ein Mitglied der wheelGruppe sein. Da Sie jedoch immer noch einen Befehl ausführen können, ist es immer noch sinnvoll, von Ihnen zu verlangen, dass Sie ihr Kennwort kennen.

Es war jedoch nicht sehr sicher, dass die Benutzer das Kennwort des anderen Benutzers oder des Superbenutzers kennen mussten. Häufig möchten Sie bestimmten Benutzern nur eingeschränkten Zugriff auf ein anderes Konto gewähren (dies ist Teil eines Sicherheitskonzepts, das als Prinzip der geringsten Berechtigungen bezeichnet wird ). Dies erschwert auch die Rechenschaftspflicht: Wenn mehrere Personen das Passwort eines Kontos kennen und dieses Konto in einen Fehler oder Missbrauch verwickelt ist, können Sie nicht sagen, wer von ihnen das tatsächlich getan hat.

So sudowurde geschaffen. Anstatt Benutzern die Ausführung von Befehlen zu erlauben, enthält es eine ausführliche Konfigurationsdatei, die in Piotrs Antwort kurz angesprochen wird und genau angibt, wer sie verwenden darf, zu welchen Benutzern sie wechseln können und welche Befehle sie ausführen dürfen. Mit dieser präzisen Kontrolle darüber, wer was mit wem machen kann, müssen wir den Benutzern nicht mehr das Passwort des Zielkontos geben. In diesem Fall könnten sie problemlos alle Steuerelemente in der Konfigurationsdatei umgehen, indem sie sich als dieser Benutzer anmelden. Stattdessen müssen sie normalerweise nur durch Eingabe ihres eigenen Passworts nachweisen, wer sie sind. Dies soll verhindern, dass jemand ein Konto in Anspruch nimmt, wenn das Terminal unbeaufsichtigt bleibt.

Auf diese Anforderung wird für den Superuser verzichtet - dieser Account kann fast alles mit dem System tun, ohne es zu verwenden sudo, weshalb er als überflüssig erachtet wurde. Es ist auch möglich, in der Konfigurationsdatei anzugeben, dass Benutzer überhaupt kein Kennwort eingeben müssen. Einige Organisationen verwenden dies, wenn sie der Meinung sind, dass die physische Sicherheit ihrer Arbeitsstationsumgebung ausreicht, um Missbrauch zu verhindern.

Barmar
quelle
Ich habe dies noch nicht untersucht, aber ich verstehe, dass eine der Funktionen von sudo, die su nicht hat, darin besteht, dass es ein Protokoll darüber führt, welche Befehle von welchem ​​Benutzer ausgeführt wurden, um die Rückverfolgung von Problemen zu vereinfachen ihre Quellen. Ich habe gerade auf meinem Kubuntu-System nachgesehen und sehe kein solches Protokoll. Vielleicht ist dies also kein Standardverhalten.
Joe
Ich habe gerade festgestellt, dass sudo sich in /var/log/auth.log anmeldet - zusammen mit vielen anderen Dingen, einschließlich einigen IPs aus China, die versuchen, Root-SSH-Zugriff auf mein System zu erhalten. Wenn Sie also nur sudo sehen möchten, müssen Sie filtern es durch grep oder ähnliches.
Joe
Richtig. suprotokolliert auch, aber da es nur eine neue Shell startet, protokolliert es nur die Tatsache, dass jemand es ausgeführt hat.
Barmar
Sie können sich nicht auf die Protokolle verlassen. Jeder, der root werden kann, kann die Protokolle ändern (es sei denn, Sie melden sich auf einem anderen Computer an und stellen sicher, dass Sie keinen Zugriff gewähren, bis die Protokollierung abgeschlossen ist). Ermöglicht sudojedoch das Widerrufen von Berechtigungen, ohne dass das Root-Kennwort erneut an alle Personen vergeben werden muss, die es benötigen.
Strg-Alt-Delor
1
@richard Da sudoSie einschränken können, welche Befehle ein Benutzer ausführen darf, können Sie sicherstellen, dass Sie ihm keinen Zugriff auf Befehle gewähren, die das Protokoll überschreiben würden.
Barmar
3

Die Antwort auf Ihre Frage lautet:

Wenn Sie einen Befehl mit sudo ausführen, führen Sie den Befehl mit erhöhten Rechten aus , dh mit root-Rechten . Sie müssen nur Ihr normales Benutzerkennwort eingeben, da Sie (der Benutzer) der sudoers-Datei hinzugefügt wurden, die Ihnen Root- Rechte verleiht .

etwas etwas
quelle
2
Mit der Ausnahme, dass sudo keine erhöhten Berechtigungen impliziert, sondern nur andere Berechtigungen für den aktuellen Benutzer. Sie könnten beispielsweise ein Programm als normaler Benutzer ausführen, der keine Shell hat. Wenn Sie in der sudoers-Datei sind, erhalten Sie auch keinen root.
James Tocknell
1
@aragilar yes sudogibt nicht immer erhöhte Rechte, aber es wird mit erhöhten Rechten ausgeführt, nachdem es seine Sache getan hat (Überprüfung der Authentifizierung, es kann Privilegien verwerfen ). Diese erhöhten Berechtigungen sind erforderlich, um den Benutzer ändern zu können.
Strg-Alt-Delor
1
Sicher, sudotut Verwendung erweiterter Zugriffsrechte (aber das ist nicht eindeutig sudo, zB Mount tut auch), aber der Befehl, den Sie nennen , dh commandin sudo commandnicht (je nachdem , was in gesetzt ist /etc/sudoers).
James Tocknell
1

Zum Deaktivieren eines Kontos wird normalerweise das verschlüsselte Kennwort auf * gesetzt. Dies ist nicht der verschlüsselte Wert einer Zeichenfolge. Ich kann es momentan nicht überprüfen, aber ich glaube, dass Ubuntu dies auch für root tut. Technisch gesehen gibt es unter Ubuntu kein root-Passwort.

Aber sudo geht Ubuntu voraus; Es wurde für Systeme entwickelt, auf denen es mit Sicherheit Root-Passwörter gab. Warum ist das Root-Passwort nicht erforderlich? Grundsätzlich wurde sudo entwickelt, um bestimmten Benutzern die Berechtigung zum Ausführen bestimmter Befehle zu erteilen. Ermöglichen Sie z. B. einem Entwickler-Root-Zugriff, die Webanwendung neu zu starten, aber keine beliebigen Server zu starten. Wenn Sie hingegen das root-Passwort kennen, haben Sie uneingeschränkten Zugriff. Sie können login oder su verwenden, um eine Root-Shell zu öffnen und beliebige Befehle auszuführen. Da sudo für Benutzer ohne diese Zugriffsberechtigung funktionieren muss, muss das root-Kennwort nicht ausgeführt werden.

Jonathan Cast
quelle
Es erlaubt einem auch, die Root-Rechte eines Benutzers zu widerrufen, ohne das Root-Passwort ändern zu müssen.
Ian D. Scott