So geben Sie die Berechtigung zum Lesen, Schreiben, aber nicht zum Löschen der Datei

12

Ich möchte Benutzern die Möglichkeit geben, Schreib- und Lesedateien in einem anderen Benutzerverzeichnis zu erstellen, aber keine Option zum Löschen der Datei nach dem Erstellen haben (klebriges Bit wird hier nicht funktionieren ...), zum Beispiel:

Ich habe einen Benutzer manager mit einem Verzeichnis, in das repository
ich worker1Dateien schreiben muss, /manager/repositoryaber die Dateien, in die
ich Dateien worker2schreiben muss, /manager/repository aber die Dateien, in die
ich einen Benutzer habe worker3, in den ich Dateien schreiben muss, aber nicht löschen kann , aber nicht löschen /manager/repository kann Löschen Sie die Dateien

aber worker 1-2-3nicht löschen Sie die Dateien nach nur erstellt managerund rootkönnen die Dateien löschen worker 1-2-3erstellt.

Ich habe versucht , einig chownund chmodTricks mit dem Sticky - Bit ohne Erfolg anwenden.

user63898
quelle
1
worker*Schreiben die Benutzer auf bestimmte Weise in das Verzeichnis? Sie haben in einem Kommentar erwähnt, dass Protokolldateien hier abgelegt werden. Bedeutet dies, dass eine bestimmte ausführbare Datei gestartet wird, um hier Dateien zu erstellen? In diesem Fall können Sie der workerGruppe die sudoBerechtigung erteilen , die ausführbare Datei als auszuführen manager. Dann würde die ausführbare Datei als managerBenutzer Protokolle erstellen , die von den Arbeitern gelesen werden könnten.
Centimane
Wenn der Benutzer die Datei ändern kann, kann er auch deren Inhalt löschen und sie so effektiv "löschen". Sieht so aus, als ob Sie eine Art "Submission" -Schnittstelle benötigen, keine Dateisysteme. E-Mails wären am einfachsten.
Ybungalobill

Antworten:

8

Im Gegensatz zu Windows gibt es unter Unix / Linux keine eindeutige Löschberechtigung. Das Recht zum Löschen (oder Erstellen oder Umbenennen) einer Datei ist an das enthaltene Verzeichnis gebunden. Entfernen Sie die Schreibberechtigung für die Worker /manager/repository/, um den Workern das Erstellen, Löschen und Umbenennen von Dateien zu verweigern.

Beachten Sie, dass es nicht möglich ist, die Erstellung von Dateien zuzulassen, sondern deren Löschung zu verweigern.

Gegenmodus
quelle
Wie kann man die Schreibberechtigung entfernen, da die Datei immer als Protokolldatei geschrieben wird
user63898
Während dies früher der Fall war, unterstützen viele moderne Systeme erweiterte ACLs (NFSv4-ACLs, wie sie von FreeBSD, Solaris oder Linux unterstützt werden (Richacl-Patch), die ähnliche Funktionen wie Windows NT-ACLs bieten. Ihre Standard-Linux-Distribution verfügt jedoch wahrscheinlich nicht über diese.
Stéphane Chazelas
@ user63898 Sie entfernen Schreibberechtigungen aus dem Verzeichnis, in dem sich die Datei befindet, nicht aus der Datei selbst.
GnP
6

Stellen Sie zunächst sicher, dass ACL in Ihrem System aktiviert ist, und führen Sie dann diesen Befehl aus

setfacl -d -R -m user::rwx,user:worker1:---,user:worker2:---,user:worker3:--- \
/manager/repository

Wie es funktioniert

  • Dieser Befehl gibt dem Eigentümer für das Verzeichnis Lese-, Schreib- und Ausführungsberechtigungen /manager/repository. Es werden alle Berechtigungen widerrufen für worker1, worker2und worker3.

  • Dadurch erhalten andere Benutzer Lese- und Schreibzugriff, der Löschzugriff wird jedoch verweigert.


Von man setfacl:

-d, --default
       All  operations  apply to the Default ACL.

-R, --recursive
       Apply operations to all files and directories recursively.

-m, --modify
       Options to modify the ACL of a file or directory.
Rahul
quelle
Danke, aber das Problem ist, dass Benutzer ständig erstellt werden. und einige werden vom Administrator gelöscht. das heißt also, ich muss jedes mal das verzeichnis mit der setfacl aktualisieren? Gibt es eine allgemeinere Lösung?
user63898
Ja, wenn ich versuche, eine Datei aus worker1 zu erstellen. touch /manager/repository/x.txt Ich bekomme: touch: kann `/manager/repository/x.txt 'nicht berühren: Berechtigung verweigert
user63898
Ich bekomme immer noch die Berechtigung verweigert, wenn ich ls -ld Repository mache. Ich bekomme: drwxrwxr-t 2 Manager Benutzer 4096 7. September 11:30 Repository /
user63898
Wenn Sie setfacl -d -R -m user :: rwx ausführen, user: worker1: --- repository / und dann versuchen, eine Datei aus worker1 zu erstellen. touch /manager/repository/x.txt Ich bekomme: touch: kann `/ manager nicht berühren /repository/x.txt ': Berechtigung verweigert
user63898
5
würde das nicht noch jemandem erlauben, hier eine leere Datei zu schreiben? Wie echo " " > $filewürde der Dateiinhalt mit "" überladen, was technisch gesehen ein Schreibvorgang ist, aber den Inhalt effektiv löscht. Es scheint, als wäre ein echtes Repo wie svn hier die beste Wahl.
Centimane
3

Um dies mit Berechtigungen zu tun, benötigen Sie ein System mit Unterstützung für ACLs, die NFSv4-ACLs ähneln. Unter FreeBSD nfsv4aclskönnen Sie beispielsweise Folgendes tun , wenn das Dateisystem mit dem Flag bereitgestellt wird :

mkdir testdir
chown manager:worker-group testdir
chmod 775 testdir
setfacl -m group@:D::deny testdir

Um Mitgliedern der Gruppe ausdrücklich die Erlaubnis zu verweigern .delete_childworker-group

Beachten Sie jedoch, dass die Mitarbeiter, da sie Eigentümer der von ihnen erstellten Dateien sind, weiterhin in der Lage sind, die ACLs für sie zu ändern. Wenn Sie sich die deleteBerechtigung erteilen, hat dies Vorrang vor der delete_childBerechtigung des übergeordneten Verzeichnisses, und ich bin es nicht Sicher gibt es einen Weg, dies zu umgehen (zumindest bei UFS-Dateisystemen unter FreeBSD). Zum Beispiel könnten sie tun:

$ touch file
$ rm -f file
rm: file: Operation not permitted
$ setfacl -m owner@:d::allow file
$ rm -f file
$
Stéphane Chazelas
quelle
0

Schreibberechtigungen aus dem /manager/repositoryOrdner entnehmen . Alle Benutzer, die nicht root sind, können also aus den darin enthaltenen Dateien schreiben oder löschen /manager/repository, jedoch keine Dateien aus diesem Verzeichnis löschen.

chmod 755 /manager/repository
Josef Klimuk
quelle
0

Wir können die Dateien und Ordner ändern, aber nicht löschen.

Führen Sie die folgenden Befehle aus, um die Attribute zu entfernen:

Für Dateien:

$ sudo chattr -R -a file.txt

Für Verzeichnisse:

$ sudo chattr -R -a dir1/
Ankitsrivasta
quelle
(1) Gemäß der Dokumentation abedeutet das Attribut nur Anhängen. Können Benutzer diese Dateien bearbeiten ? (2) Wie wirkt sich das Festlegen des aAttributs auf ein Verzeichnis aus?
Scott