Zulassen, dass der Eigentümer Dateien erstellt und liest, diese jedoch nicht ändert oder löscht

17

Ich möchte einem Benutzer die Berechtigung erteilen, Dateien in einem bestimmten Verzeichnis zu erstellen und zu lesen, aber keine Dateien zu ändern oder zu löschen. Wenn der Benutzer an Dateien anhängen kann, ist das in Ordnung, aber ich möchte lieber nicht. Dies ist auf Ubuntu Linux.

Ich denke, dass dies mit Standard-Unix-Dateiberechtigungen unmöglich ist, aber vielleicht ist dies mit ACLs möglich? Der Benutzer stellt immer eine Verbindung über SFTP her. Wenn es also eine Möglichkeit gibt, dies in SFTP zu steuern (im Gegensatz zu den Betriebssystemberechtigungen), ist dies in Ordnung.

Um ganz klar zu sein, möchte ich Folgendes:

  • echo hallo> test # ist erfolgreich, da test nicht existiert und das erstellen erlaubt ist
  • echo hallo >> test # kann erfolgreich sein oder fehlschlagen, je nachdem, ob das Anhängen erlaubt ist
  • echo hello2> test # schlägt fehl, da der Test bereits vorhanden ist und Änderungen nicht zulässig sind
  • Katzentest # erfolgreich, da Lesevorgänge zulässig sind
  • rm test # schlägt fehl, da das Löschen nicht erlaubt ist

Wenn Sie sich fragen, warum ich das tun möchte, ist es, ein Duplicati-Backup-System resistent gegen Ransomware zu machen.

paj28
quelle
1
Dateien werden immer leer erstellt. Wenn Sie dies tun echo > test, erstellt die Shell eine open("test", O_WRONLY|O_CREAT|O_TRUNC)Datei und ruft echodiese auf , um den Inhalt so zu schreiben, dass er geändert wird. Jetzt konnte nur das erste Öffnen (WR) erfolgreich sein.
Stéphane Chazelas
@ StéphaneChazelas - bearbeitet, um zu verdeutlichen, dass das Anhängen erlaubt ist
paj28

Antworten:

16

Sie könnten bindfswie folgt verwenden :

$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/

Dieses Verzeichnis gehört stephane, die Gruppe stephane (stephane ist ihr einziges Mitglied). Beachten Sie auch t, dass Benutzer keine Einträge umbenennen oder entfernen können, die ihnen nicht gehören.

$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir

Wir bindfs dirüberschreiben uns mit festen Eigentümern und Berechtigungen für Dateien und Verzeichnisse. Alle Dateien scheinen im Besitz von zu sein root(obwohl sie im realen Verzeichnis weiterhin im Besitz von stephane sind).

Verzeichnisse erhalten drwxrwxr-x root stephaneBerechtigungen, während andere Dateitypen -rw-r--r-- root stephanesolche erhalten.

$ ls -ld dir
drwxrwxr-t   2 root     stephane   4096 Aug 12 12:28 dir

Das Erstellen einer Datei funktioniert jetzt, da das Verzeichnis schreibbar ist:

$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file

Es ist jedoch nicht möglich, ein zweites Mal in diese Datei zu schreiben open() , da wir keine Berechtigung dafür haben:

$ echo test > dir/file
zsh: permission denied: dir/file

(Beachten Sie, dass das Anhängen dort nicht zulässig ist (als Teil Ihrer anfänglichen Anforderungen).)

Eine Einschränkung: Während Sie diraufgrund des tBits keine Einträge entfernen oder umbenennen können , haben neue Verzeichnisse, die Sie dort erstellen, dieses tBit nicht, sodass Sie dort Einträge umbenennen oder löschen können.

Stéphane Chazelas
quelle
Das ist brilliant! Vielen Dank, dass Sie sich die Zeit genommen haben, eine so elegante Lösung zu finden. Ich hatte schon einmal von bindfs gehört, aber dies ist das erste Mal, dass ich es tatsächlich benutzt habe.
paj28
4

Die chattr +aOption erlaubt nur das Anhängen. Dateien können auf diese Weise geändert werden, jedoch nur durch Hinzufügen (dh Anhängen von Zeilen). Sie können vorhandene Dateien nicht löschen, sondern neue erstellen. Dies könnte Ihren Bedürfnissen entsprechen:

sudo chattr -R +a /dir/to/apply/to

von man chattr

Eine Datei mit dem Attribut "a" kann nur im Anhänge-Modus zum Schreiben geöffnet werden. Nur der Superuser oder ein Prozess mit der Funktion CAP_LINUX_IMMUTABLE kann dieses Attribut festlegen oder löschen.

(Beachten Sie, dass dies auch für Verzeichnisse gilt.)

So würde Ihre Liste aussehen:

echo hello > test # succeeds, because test doesn't exist, and creation is allowed
echo hello2 > test # fails, because test already exists, and overwriting is not allowed
echo hello3 >> test # succeeds, because appending is allowed
cat test # succeeds, because reads are allowed
rm test # fails, because delete is not allowed
Fiximan
quelle
Ok, das klingt vielversprechend. Löschungen werden korrekt verhindert, und wenn eine Datei das Attribut hat, wird das Überschreiben verhindert. Wenn neue Dateien erstellt werden, erhalten sie das Attribut jedoch nicht automatisch. Gibt es eine Möglichkeit, dies automatisch geschehen zu lassen?
paj28
Wenn das Verzeichnis das Attribut hat, verhalten sich die Dateien entsprechend, obwohl das Attribut nicht explizit festgelegt wurde. Das Problem sind Dateien in neuen Unterverzeichnissen. ZB ist dir1 chattr +adann kann ich eine Datei erstellen, darf sie nicht entfernen, kann anhängen. Wenn ich dir1 / dir2 erstelle, kann ich machen, was ich will IN dir2
Fiximan
1
Leider nicht: dpaste.com/042XQ7X
paj28
Aahh, sorry - ich habe früher einen falschen Test gemacht
Fiximan
@ paj28 Ihre Verbindung ist unterbrochen :-(
mjaggard