Warum kann ich das Herunterfahren nicht ausführen, wenn die Berechtigung rwxr-xr-x ist?

34

Ich bin dabei /sbinund sehe, dass shutdownes Berechtigungen gibt rwxr-xr-x. Bedeutet das nicht, dass jeder es ausführen kann?

Korgan Rivera
quelle
1
Was ist der Befehl, den Sie ausgeführt haben und was ist der Fehler, den Sie erhalten?
SlayedBylucifer
Ich denke, er spricht über den shutdownBefehl.
Vinz
Ich bin gelaufen ./shutdown +30. Ich bekomme "shutdown: muss root sein". Wenn jedoch die Berechtigungen besagen, dass jeder ausführen kann, warum muss ich dann root sein?
Korgan Rivera
Ich vermute, dass jeder die Maschine ausschalten kann. Genau wie auf einer GUI kann es auch jeder herunterfahren. Aber wenn du sagst, dass du root sein musst, dann weiß ich es nicht. Gute Frage.
Kevdog777
4
@ Kevdog777: Auf einer GUI verwaltet PolicyKit dies. Es ist ein Daemon mit Root-Rechten, der prüft, ob Sie ihn verwenden dürfen shutdown.
Vinz

Antworten:

76

Jeder kann ausführen shutdown, aber um ein Herunterfahren des Systems auszulösen, sind Root-Berechtigungen erforderlich. shutdownIst aber nicht setuid und kann nur root erfolgreich ausführen. Das shutdownProgramm ist nett genug, um Ihre Privilegien zu überprüfen und Sie über ein Problem zu informieren, aber selbst wenn es ein System-Shutdown naiv versuchte, würde nichts passieren.

GLENDOWER: Ich kann Geister aus der Tiefe rufen.
HOTSPUR: Warum kann ich das auch? Aber werden sie kommen, wenn du nach ihnen rufst?
(aus Heinrich IV.)

shutdownist nicht anders als /bin/rm. Jeder kann es ausführen, aber ein normaler Benutzer kann es nicht entfernen /etcoder das Basisverzeichnis eines anderen Benutzers.

Insbesondere: Nur ein Prozess, der mit Root-Rechten ausgeführt wird (effektive UID 0), kann das init-System anweisen, Systemdienste zu stoppen, alle Benutzerprozesse zu beenden und den Systemaufruf abzusetzen , der den Computer tatsächlich stoppt. (Wenn shutdownsetuid angegeben wurde, wird es als root ausgeführt, unabhängig davon, wer es aufruft. Dies ist jedoch nicht der Fall.)

Wie wäre es mit shutdowneinem GUI- Aufruf , zB mit control-alt-del? Es ist wichtig zu wissen, dass es in diesem Fall shutdowndirekt von gestartet wird initund mit Root-Rechten ausgeführt wird. Jeder, der auf die Konsole zugeht, kann sie möglicherweise herunterfahren. Wenn dies nicht erwünscht ist, wird Control-Alt-Delete ausgeführt shutdown -a. (Siehe die Dokumentation, die @ some1 in ihrer Antwort zitiert). Damit wird shutdownüberprüft, ob der aktuell angemeldete Benutzer berechtigt ist, es auszuführen. Dies ist jedoch nur relevant, da shutdownin diesem Szenario als Root ausgeführt wird.

alexis
quelle
2
Erläuterung: Jeder kann das Programm ausführen shutdown, aber dieses Programm kann kein Herunterfahren des Systems auslösen, es sei denn, der aktuelle Benutzer verfügt über Root-Berechtigungen. Recht?
LarsH
1
Das wars so ziemlich. Programme werden mit den Rechten des aufrufenden Benutzers ausgeführt, sofern sie nicht setuid sind. Das Herunterfahren des Systems erfordert Root-Rechte, sodass Sie auch kein eigenes Programm schreiben können (außer durch Ausnutzen von Sicherheitslücken usw.).
Alexis
Was bedeutet "Herunterfahren ist nicht Setuid"?
Iain Samuel McLean Elder
1
@Iain, Programme werden normalerweise mit den Berechtigungen des Benutzers ausgeführt, der sie aufruft. Dies gilt auch für shutdown. Ein setuid-Programm wird mit den Berechtigungen des Benutzers ausgeführt, dem die ausführbare Datei gehört. Wird beispielsweise /etc/passwdmit Root-Berechtigungen ausgeführt, damit Sie die Kennwortdatei ändern können. Siehe die Manpage für chmod.
Alexis
Das hätte " /usr/bin/passwdmit root-Rechten laufen" sollen! /etc/passwdist nicht ausführbar (es ist die "Passwortdatei", die geändert wird).
Alexis
15

Die Binärdatei shutdownselbst prüft, ob Ihre UID 0 ist.

Siehe die Ausgabe von strace:

strace /sbin/shutdown -r -h now
...
...
geteuid()                               = 10001
setuid(10001)                           = 0
getuid()                                = 10001
write(2, "shutdown: Need to be root\n", 26shutdown: Need to be root
) = 26
exit_group(1)                           = ?
Chaos
quelle
4
+1 um die Verwendung von strace zu zeigen ... das ist nützlich. Allerdings sehe ich nicht, wie dieser Trace zeigt, dass shutdownüberprüft wird, ob Ihre UID 0 ist.
LarsH
1
Sie werden das in der Ausgabe von strace nicht sehen, da nur Systemaufrufe gemeldet werden. Sie können daraus schließen, dass, wenn auf eine getuid genau gefolgt wird, die Fehlermeldung geschrieben wird, der der Code ähnlich war if(getuid() != 0) printf("Need to be root");. Was in der Tat der Quellcode zeigt, dass es so ist.
msw
5

Ja ! Jeder kann diesen Befehl ausführen. Wie Sie sagten, können Sie es ausführen, aber Sie werden mit der Meldung "Muss Root sein" konfrontiert, nicht mit einer permission denied. Der shutdownBefehl prüft UID, ob Sie als Root angemeldet sind oder nicht.

Vinz
quelle
-1

Es scheint, dass das Herunterfahren eine Zugriffsliste überprüft, wenn Sie sie mit -a markieren:

ACCESS CONTROL
       shutdown can be called from init(8) when the magic keys CTRL-ALT-DEL are pressed, by creating an appropriate entry in /etc/inittab. This means that every‐
       one who has physical access to the console keyboard can shut the system down. To prevent this, shutdown can check to see if an authorized user  is  logged
       in  on  one of the virtual consoles. If shutdown is called with the -a argument (add this to the invocation of shutdown in /etc/inittab), it checks to see
       if the file /etc/shutdown.allow is present.  It then compares the login names in that file with the list of people that are logged in on a virtual console
       (from /var/run/utmp). Only if one of those authorized users or root is logged in, it will proceed. Otherwise it will write the message

       shutdown: no authorized users logged in

       to  the  (physical)  system  console.  The  format  of  /etc/shutdown.allow is one user name per line. Empty lines and comment lines (prefixed by a #) are
       allowed. Currently there is a limit of 32 users in this file.

Da Sie es derzeit ohne das Flag -a aufrufen, werden standardmäßig nur Root-Shutdowns zugelassen.

Wenn Sie möchten, dass weitere Benutzer den Befehl ausführen können, konfigurieren Sie diese Datei und verwenden Sie das Flag.

Why can't I execute shutdown when the permission is rwxr-xr-x?

Berechtigungsbits schließen die Zugriffssteuerung basierend auf einem Benutzer oder einer Gruppe nicht unbedingt aus.

some1
quelle
Das Aufrufen mit -avon der Kommandozeile aus macht keinen Unterschied: shutdown -aMuss immer noch mit root-Berechtigungen ausgeführt werden (was initbei control-alt-del der Fall ist ).
Alexis