Warum kann ein Benutzer ohne Rootberechtigung Dateien löschen, die von root erstellt wurden?

24

Angesichts eines Nicht-Root-Benutzers "joshua" habe ich als Root eine Datei mit dem Namen "foo" in Joshuas Home-Verzeichnis (/ home / johsua /) erstellt. es sieht so aus:

-rw-r--r--  1 root   root       0 12-19 21:00 foo

und dann löschen Sie es als Joshua, ich kann es erfolgreich löschen.

Ich würde erwarten, dass Joshua nicht genug Erlaubnis hat, es zu löschen. Handelt es sich um eine Art "Berechtigungsvererbung"? Meine Plattform ist Debian 5.0.7.

Joshua
quelle
1) Dies ist nicht zum Thema. 2) Ich bezweifle sehr, dass Sie dies als Nicht-Root-Benutzer ohne sudooder mit anderer Rechteerweiterung löschen konnten . Sie haben wahrscheinlich etwas übersehen.
DarkDust
16
@DarkDust Eine Datei ist ein Eintrag im übergeordneten Verzeichnis. Wenn Sie Schreibrechte in einem Verzeichnis haben, können Sie Dateien in diesem Verzeichnis entfernen, unabhängig davon, wem die Dateien gehören (es sei denn, das Sticky-Bit ist auch für das Verzeichnis festgelegt)
Nr.
@ nos: Blöd, du hast recht.
DarkDust
1
Ein Eintrag im übergeordneten Verzeichnis ist ein Verweis auf eine Datei. Es ist nicht die Datei selbst. (Andernfalls, wie könnte eine Datei fest mit mehr als einem Verzeichnis verknüpft sein?)
David Schwartz
@DavidSchwartz Das stimmt, aber beim Löschen der Datei aus dem Verzeichnis wird der Verweis in der Verzeichnisstruktur entfernt.
mc0e

Antworten:

43

Der Benutzer hat die Datei nicht gelöscht, das System hat. Der Benutzer hat lediglich die Datei aus seinem eigenen Verzeichnis entfernt. Das System hat die Datei gelöscht, da der Referenzzähler auf Null gefallen ist. Es ist nur ein Zufall, dass der Benutzer, der die Datei aus dem Verzeichnis entfernt, den Referenzzähler auf Null gesetzt hat. (Wenn die Datei fest mit einem anderen Verzeichnis verknüpft war oder ein Handle für die Datei geöffnet wurde, wurde sie nicht gelöscht.)

Das System löscht Dateien automatisch, wenn ihre Referenzanzahl auf Null fällt. Der Besitzer der Datei spielt keine Rolle. Es gibt viele Möglichkeiten, wie ein anderer Benutzer als der Eigentümer einer Datei den Referenzzähler der Datei auf Null setzen kann.

Das Entfernen einer Datei aus einem Verzeichnis (als "Aufheben der Verknüpfung" bezeichnet) ist eine Operation für das Verzeichnis. Durch das Aufheben der Verknüpfung wird die Anzahl der Verweise verringert.

Ebenso kann ein anderer Benutzer als der Eigentümer das letzte Handle für eine Datei schließen, die mit keinem Verzeichnis verknüpft ist. Wenn Sie dieses Handle schließen, wird auch die Datei gelöscht, da der Referenzzähler wieder auf Null sinkt.

David Schwartz
quelle
1
Und natürlich rmtrübt der Befehl das Wasser ein wenig, da dies die rmAbkürzung für "Entfernen" ist und die Benutzer darin geschult sind, sich rmeine "Lösch" -Operation vorzustellen. Viele Benutzer verwenden rmjeden Tag, ohne sich darüber im Klaren zu sein, dass es sich bei dem tatsächlich ausgeführten Vorgang um einen "Unlink" handelt, nicht um einen "Delete". Daher sollte es nicht wirklich überraschen, dass viele Benutzer dieses Verhalten als überraschend empfinden, wenn sie es zum ersten Mal bemerken.
Daniel Pryden
Es ist definitiv überraschend für viele Menschen. Zumindest entfernt der rmBefehl tatsächlich eine Datei oder ein Verzeichnis aus einem Verzeichnis. Unter Windows, wo der Befehl aufgerufen wird del, ist dies schlechter , da er zum Löschen einer Datei verwendet wurde. Auf modernen Windows-Computern (seit NT4) ist er jedoch auch ein Vorgang zum Aufheben der Verknüpfung.
David Schwartz
"Der Benutzer hat die Datei nicht gelöscht, das System hat" Dies macht keinen Sinn. Das "System" kann keine Änderungen vornehmen, die einen privilegierten Zugriff für nichtprivilegierte Benutzer erfordern. Aus diesem Grund kann diese Antwort nicht erklären, warum derselbe Benutzer nicht dasselbe tun kann, wenn das aktuelle Verzeichnis im Besitz von root war und nur von root beschrieben werden kann. Die Antwort von @kerrek unten ist genau und prägnant.
FractalSpace
@FractalSpace Huh? Das System kann jederzeit Änderungen vornehmen, für die ein privilegierter Zugriff für einen nicht privilegierten Benutzer erforderlich ist. Zum Beispiel erfordert das Ändern der Bytes auf einer Festplatte einen privilegierten Zugriff. Wenn ein Benutzer jedoch eine Datei ändern kann, entscheidet das System, einige Bytes auf der Festplatte zu ändern, obwohl der Benutzer nicht berechtigt ist, diese Bytes selbst zu ändern. Ein Benutzer kann den Kernel-Speicher nicht ändern, der Kernel jedoch, wenn er im Auftrag eines Benutzers ausgeführt wird. Systeme entscheiden sich für Vorgänge, die ihre Benutzer nicht direkt autorisieren können.
David Schwartz
Ja. Und schließlich wird alles vom "System" erledigt. Aber nicht bevor Sie strenge Regeln für die Trennung von Berechtigungen durchlaufen, die für diesen bestimmten "Benutzerbereich" festgelegt wurden. In diesem Szenario führt z. B. "system" keine generelle Aktion aus, sondern folgt den Berechtigungen, die für das "übergeordnete Verzeichnis" festgelegt wurden. Der zentrale Teil dieses Problems in OP-Frage.
FractalSpace
0

Erste Vermutung: Zum Löschen einer Datei benötigen Sie Schreibrechte für den enthaltenen Ordner. Also / home / johsua / foo / bar versuchen, 755 to foo und 644 to bar geben.

Eugen Rieck
quelle