Erzwingen des Besitzers für erstellte Dateien und Ordner


21

Ich habe ein Verzeichnis, das Daten enthält, die von mehreren Benutzern gemeinsam genutzt werden. Der Zugriff auf dieses Verzeichnis und alles darunter wird von der Verzeichnisgruppe gesteuert, die den betreffenden Benutzern hinzugefügt wird. Als solches habe ich den Ordner "Sticky Group" chmod g+seingestellt. Das Verzeichnis enthält eine Baumstruktur mit Verzeichnissen und Dateien, wobei die Gesamtzahl der Dateien wahrscheinlich einige Millionen beträgt. Die Dateien werden ziemlich klein sein, ich erwarte nichts größer als 50 MB.

Mein Problem ist, dass der Eigentümer der Datei oder des Verzeichnisses immer noch der Benutzer ist, der sie erstellt hat. Selbst wenn ich diesen Benutzer aus der Zugriffsgruppe entfernen sollte, würde ich daher seinen Zugriff nicht vollständig entfernen.

So:

Gibt es andere Optionen, die ich verpasst habe, um sicherzustellen, dass alle Dateien und Unterverzeichnisse denselben Eigentümer haben?

Ich gehe davon aus, dass ich mit einem Cron-Job in regelmäßigen Abständen durch das gesamte Verzeichnis surfen kann, aber das erscheint mir als ineffizient, wenn es sich im Wesentlichen um einen Einmal-Pr-Dateibefehl handelt.

Ich habe ein Beispiel mit INotify gefunden, das mir jedoch als wartungsintensiv erscheint, da es Skripte erfordert.

Ich habe nicht herausgefunden, ob ACL mir bei erzwungener Inhaberschaft helfen kann.

Gibt es eine intelligentere Möglichkeit, dies zu tun?

Ich möchte ein Verzeichnis haben, das freigegeben werden kann, indem einem Benutzer eine Gruppe hinzugefügt wird. Alles, was in diesem Verzeichnis erstellt wird, erbt das Berechtigungsschema von seinem übergeordneten Element. Wenn es einen besseren Weg gibt als das, was ich versuche, bin ich ganz Ohr.


Ich glaube nicht, dass ich verstanden habe, was du mir sagen wolltest. Können Sie näher darauf eingehen?
Martin Nielsen

Warum nicht verwenden, um alle Dateien und Unterverzeichnisse mit derselben Gruppe und demselben Besitz einzurichten chown -hR owner:group?
Pandya

Es ist möglich, aber da ständig neue Dateien erstellt werden und es sich um Millionen von Dateien handelt, ist ein Cron-Job erforderlich, der regelmäßig im gesamten Verzeichnis surft. Es sei denn, ich vermisse irgendwann?
Martin Nielsen


Ich habe diese Frage tatsächlich überflogen, bevor ich sie erstellt habe. Es scheint sich nicht mit der Frage zu befassen, wie der Eigentümer einem bestimmten Benutzer zugewiesen werden soll.
Martin Nielsen

Antworten:


12

Das Setzen eines Standardbesitzers "automatisch" würde ein Verzeichnis erfordern, das setuidsich so verhält setgid. Während dies unter FreeBSD konfiguriert werden kann, werden andere UNIX- und Linux-Systeme einfach ignoriert u+s. In Ihrem Fall könnte es jedoch eine andere Lösung geben.

Ich möchte ein Verzeichnis haben, das freigegeben werden kann, indem einem Benutzer eine Gruppe hinzugefügt wird. Alles, was in diesem Verzeichnis erstellt wird, erbt das Berechtigungsschema von seinem übergeordneten Element. Wenn es einen besseren Weg gibt als das, was ich versuche, bin ich ganz Ohr.

Im Grunde genommen möchten Sie, wie ich sehe, den Zugriff auf ein Verzeichnis mithilfe des Gruppenmechanismus steuern. Hierfür müssen Sie jedoch nicht die Berechtigungen in der gesamten Verzeichnisstruktur einschränken. Tatsächlich könnte das Verzeichnisausführungsbit --xgenau das sein, was Sie benötigen. Lassen Sie mich Ihnen ein Beispiel geben. Vorausgesetzt, dass...

  • Die Gruppe, die den Zugriff auf das group_dirVerzeichnis kontrolliert, lautet ourgroup.
  • Nur Personen in der ourgroupGruppe können darauf zugreifen group_dir.
  • user1und user2gehören zu ourgroup.
  • Die Standardeinstellung für umask ist 0022.

... betrachten Sie das folgende Setup:

drwxrws---    root:ourgroup   |- group_dir/
drwxr-sr-x    user1:ourgroup  |---- group_dir/user1_submission/
drwxr-sr-x    user2:ourgroup  |---- group_dir/user2_submission/
-rw-r--r--    user2:ourgroup  |-------- group_dir/user2_submission/README

Angenommen, jeder Artikel wurde von seinem Besitzer erstellt.

In diesem Setup:

  • Alle Verzeichnisse können von allen in frei durchsucht werden ourgroup. Jeder aus der Gruppe kann Dateien überall in der Gruppe erstellen, verschieben und löschen group_dir(aber nicht tiefer).
  • Jeder, der nicht dabei ist, ourgroupwird blockiert group_dirund kann daher nichts darunter manipulieren. Zum Beispiel kann user3(wer kein Mitglied von ist ourgroup) nicht lesen group_dir/user2_submission/README(obwohl er die r--Erlaubnis für die Datei selbst hat).

In diesem Fall gibt es jedoch ein kleines Problem: Aufgrund der typischen umask können von Benutzern erstellte Elemente nicht von anderen Mitgliedern der Gruppe bearbeitet werden. Hier kommen ACLs ins Spiel. Indem Sie Standardberechtigungen festlegen, stellen Sie sicher, dass trotz des umask-Werts alles in Ordnung ist:

$ setfacl -dRm u::rwX,g::rwX,o::0 group_dir/

Dieser Aufruf setzt:

  • Standardberechtigungen rw(x)für den Eigentümer.
  • Standardberechtigungen rw(x)für die Gruppe.
  • Standardmäßig keine Berechtigungen für die anderen. Beachten Sie, dass der Zugriff der anderen Benutzer group_dirohnehin nicht möglich ist und es keine Rolle spielt, welche Berechtigungen darunter liegen.

Wenn ich jetzt einen Artikel erstelle als user2:

$ touch group_dir/user2_submission/AUTHORS
$ ls -l group_dir/user2_submission/AUTHORS
rw-rw----    user2:ourgroup    group_dir/user2_submission/AUTHORS

Mit dieser ACL können wir versuchen, unsere vorherige Struktur wiederherzustellen:

drwxrws---+    root:ourgroup   |- group_dir/
drwxrws---+    user1:ourgroup  |---- group_dir/user1_submission/
drwxrws---+    user2:ourgroup  |---- group_dir/user2_submission/
-rw-rw----+    user2:ourgroup  |-------- group_dir/user2_submission/README

Auch hier wird jeder Artikel von seinem Besitzer erstellt.

Wenn Sie denjenigen, die das Verzeichnis verwenden, ein wenig mehr Leistung / Sicherheit geben möchten, sollten Sie außerdem ein "Sticky Bit" in Betracht ziehen. Dies würde zum Beispiel das user1Löschen verhindern user2_submission(da er die -w-Erlaubnis dazu hat group_dir):

$ chmod +t group_dir/

Wenn er user1versucht, sein user2Verzeichnis zu entfernen , bekommt er ein schönes Operation not permitted. Beachten Sie jedoch, dass auf diese Weise zwar Änderungen an der Verzeichnisstruktur verhindert werden group_dir, auf Dateien und Verzeichnisse darunter jedoch weiterhin zugegriffen werden kann:

user1@host $ rm -r user2_submission
Operation not permitted

user1@host $ cat /dev/null > user2_submission/README

user1@host $ file user2_submission/README
user2_submission/README: empty (uh-oh)

Zu berücksichtigen ist auch, dass die von uns verwendeten ACLs Standardberechtigungen festlegen . Der Eigentümer eines Elements kann daher die ihm zugeordneten Berechtigungen ändern. Zum Beispiel user2kann perfekt laufen ...

$ chown g= user2_submission/ -R
or
$ chgrp nobody user2_submission -R

... wodurch sein vollständiges Submission Directory für niemanden in der Gruppe verfügbar wird.

Da Sie jedoch ursprünglich bereit sind, rwsallen Mitgliedern der Gruppe uneingeschränkten Zugriff zu gewähren , gehe ich davon aus, dass Sie diesen Benutzern vertrauen und nicht zu viele böswillige Vorgänge von ihnen erwarten.


Überschreibt die ACL die Standardberechtigungen? Wenn ich zum Beispiel $ setfacl -dRm u :: r, g :: rwX, o :: 0 group_dir / setze, um nur Mitgliedern der Gruppe das Erstellen von Dateien zu ermöglichen, kann der Eigentümer die Dateien bearbeiten, ohne dies zu tun in der Gruppe? Es ist wichtig, dass Benutzer die Dateien nur bearbeiten können, wenn sie Mitglieder der Gruppe sind, unabhängig davon, wer der Eigentümer ist.
Martin Nielsen

Sie müssen dafür nicht alle Berechtigungen vom Eigentümer entfernen. Wenn die Gruppe Schreibzugriff auf die Datei hat, die Gruppenmitglieder werden können, die Datei bearbeiten. Der Besitzer wird einfach "ein bisschen privilegierter" sein. ACLs überschreiben nicht immer die Standardberechtigungen (siehe Informationen zu den gültigen ACL-Berechtigungen).
John WH Smith

Der Punkt ist, dass der Benutzer keine Berechtigungen haben sollte, nur die Gruppe sollte. Der Eigentümer sollte in jeder Hinsicht nicht privilegiert sein, es sei denn, er ist in der Gruppe.
Martin Nielsen

Grundsätzlich ist jeder, der nicht in der Gruppe ist, sowieso nicht privilegiert, da er nicht in der Lage wäre, an group_direrster Stelle einzutreten , egal ob er die Datei besitzt oder nicht. Das einzige wirkliche "Privileg", das der Besitzer hat, ist, dass er die Berechtigungen seiner Kreationen ändern kann (was ich in meiner Antwort ein wenig ausführlicher dargelegt habe).
John WH Smith

1
Absolut nicht. Das group_dirVerzeichnis ist im Besitz von root:ourgroupwith -rwxr-x---, ourgroupdh nur root und Mitglieder von dürfen darauf zugreifen, dh mit den darunter liegenden Dateien etwas anfangen. Wenn Sie keine --xBerechtigung für ein Verzeichnis haben, können Sie nicht auf eine Datei darin zugreifen, selbst wenn Sie über Berechtigungen für die Datei selbst verfügen.
John WH Smith

6

Es gibt eine intelligentere Möglichkeit, dies zu tun. Es wird eine Kombination aus set-gid und default acls verwendet. Natürlich benötigen Sie ein acl-fähiges Dateisystem. Angenommen, das Verzeichnis, in dem Sie sich befinden möchten, ist freigegeben, /var/grpdirund die Mitglieder der Gruppe sharingsollten darauf zugreifen können.

chown root:sharing /var/grpdir
chmod 2770 /var/grpdir #other can't read or traverse into the directory, set-gid is set
setfacl -d -m u::rwX,g::rwX,o::0 /var/grpdir

Standard-ACLs werden von Unterverzeichnissen geerbt, die in einem Verzeichnis mit Standard-ACLs erstellt wurden. Das bedeutet, dass für jede Datei, die in erstellt /var/grpdirwird, die Gruppe sharingdurch das setgid-Bit des Verzeichnisses festgelegt wird. Darüber hinaus erbt es die Standard-Acls, die die Standardvoraussetzungen im Linux-Stil überschreiben, da wir keine ACLs für bestimmte Benutzer oder Gruppen angegeben haben. Dies bedeutet, dass alle Dateien mit Eigentumsrechten <user>:sharingund Berechtigungen erstellt werden rw-rw----. Die Verzeichnisse sind identisch, mit der Ausnahme, dass für sie auch die gleichen Standard-ACLs wie für ihr übergeordnetes Element ( /var/grpdir) festgelegt sind und natürlich die ausführbaren Bits für Benutzer und Gruppe festgelegt sind. Wenn Sie einen Benutzer aus der sharingGruppe entfernen, kann dieser Benutzer nicht auf das Verzeichnis zugreifen (und auch nicht auf Dateien darin, selbst wenn sie Eigentümer sind).

Im Gegensatz zur regelmäßigen Korrektur von Berechtigungen mit einem Cronjob sind Berechtigungen immer synchron, da sie automatisch mit neu erstellten Dateien und Verzeichnissen aktualisiert werden. Diese Lösung ist leicht; Es sind keine Dämonen erforderlich, und es gibt keinen Anstieg für E / A, während die Berechtigungen auf einen Schlag korrigiert werden.


Verstehe ich das also richtig: ACLs überschreiben die normalen Dateisystemberechtigungen, wenn Sie keinen Benutzer oder keine Gruppe angeben?
Martin Nielsen

1
Nein, sie ändern keine Berechtigungen, die bereits für eine Datei festgelegt wurden. Wenn für ein Verzeichnis die Standardberechtigung acls festgelegt ist und in diesem Verzeichnis eine Datei oder ein Verzeichnis erstellt wird, erhält die NEUE Datei / das NEUE Verzeichnis die angegebenen Standardberechtigungen. Dateien, die in das Verzeichnis kopiert / verschoben wurden, behalten ihre Berechtigungen bei, ebenso wie Dateien, die im Verzeichnis vor dem Festlegen der ACLs vorhanden waren. Chmod und chown können auch nach dem
Erstellen

2

Mir ist kein guter Weg dafür bekannt. Der technisch sauberste Weg wäre ein FUSE-Dateisystem, das dies tut. Natürlich viel Arbeit, wenn das noch keiner gemacht hat.

Alternativen:

  1. Benutze Samba. Samba hat den force userParameter. Sie können ein Verzeichnis lokal exportieren und es lokal bereitstellen. Ermöglicht keine schnelleren Zugriffe, ist jedoch möglicherweise akzeptabel, da nur Loopback-Netzwerke beteiligt sind.

  2. Verwenden Sie ein Nicht-Linux-Dateisystem wie FAT32. Dies muss für einen bestimmten Benutzer konfiguriert werden, um es bereitzustellen. Die Zugriffsberechtigungen müssen vom übergeordneten Verzeichnis verwaltet werden.


0

Ich habe keine Möglichkeit gefunden, den Dateieigentümer automatisch so zu ändern, dass der Dateieigentümer geändert wird, wenn die Datei in ein bestimmtes Verzeichnis verschoben wird. Das Nächste ist das Sticky-Bit, aber Sie haben anscheinend angegeben, dass die Gruppenzugehörigkeit nicht ausreicht, sondern dass sich die tatsächliche Benutzerzugehörigkeit ändern muss.

In diesem Fall denke ich, dass Ihre beste Wette der Cron-Job mit der Chown-R-Flagge ist, wie Pandya erwähnte. Legen Sie es auf einen Cron, um jede Minute oder alle fünf Minuten zu laufen.

Wenn Sie erklären können, wie Ihre Benutzer dies verwenden, gibt es möglicherweise eine bessere Lösung.

ACL kann Ihnen dabei helfen, eine genauere Kontrolle darüber zu erhalten, wer was darf. Es ändert nicht automatisch den tatsächlichen Dateibesitz für Sie. Ich denke, Sie müssen sich einen besseren Überblick verschaffen und Ihre Lösung auf dieser Grundlage bewerten / neu gestalten.


0

Sie können inotify-tools verwenden und ein einfaches Bash-Skript wie unten schreiben. Inotify behält das Verzeichnis- Web im Auge und unternimmt immer dann etwas, wenn ein Ereignis wie die Erstellung eines Verzeichnisses im Web-Verzeichnis stattfindet. Es gibt viele Veranstaltungen. Sie können es googeln oder auf dieser Seite nachsehen

while inotifywait -m -e CREATE web; do echo "A new directory has been created"; done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.