Festlegen von Standardberechtigungen für neu erstellte Dateien und Unterverzeichnisse in einem Verzeichnis unter Linux?

99

Ich habe eine Reihe von Skripten und Anwendungen mit langer Laufzeit, die Ausgabeergebnisse in einem Verzeichnis speichern, das von einigen Benutzern gemeinsam genutzt wird. Ich möchte sicherstellen, dass alle Dateien und Verzeichnisse, die unter diesem freigegebenen Verzeichnis erstellt wurden, automatisch über u=rwxg=rwxo=rBerechtigungen verfügen.

Ich weiß, dass ich umask 006meine verschiedenen Skripte an der Spitze verwenden könnte , aber ich mag diesen Ansatz nicht, da viele Benutzer ihre eigenen Skripte schreiben und möglicherweise vergessen, die Umask selbst festzulegen.

Ich möchte wirklich nur, dass das Dateisystem neu erstellte Dateien und Verzeichnisse mit einer bestimmten Berechtigung festlegt, wenn es sich in einem bestimmten Ordner befindet. Ist das überhaupt möglich?

Update : Ich denke , dass dies mit POSIX-ACLs unter Verwendung der Standard-ACL-Funktionalität möglich ist, aber im Moment geht mir alles etwas über den Kopf. Wenn jemand erklären kann, wie Standard-ACLs verwendet werden, würde er diese Frage wahrscheinlich gut beantworten.

David Dean
quelle
1
POSIX-ACLs sind nett, aber bei gut 60% der Computer, auf die Sie stoßen, sind sie je nach Distribution für bestimmte Dateisysteme nicht aktiviert. Hier ist eine sehr gute Einführung und ein Beispiel: suse.de/~agruen/acl/linux-acls/online
Tim Post
1
Du meinst das gleiche Dokument, das ich verlinkt habe :) Ich hatte noch keine Änderung, um es zu lesen, aber danke, dass du über das Verfügbarkeitsproblem informiert bist.
David Dean
1
Der Link in Tim Posts Kommentar scheint tot zu sein, aber dank des Internetarchivs konnte ich ihn anzeigen und überprüfen, ob vanemery.com/Linux/ACL/POSIX_ACL_on_Linux.html genau dasselbe Dokument enthält. Ich werde die Frage bearbeiten, um den Link zu aktualisieren.
rmunn

Antworten:

78

Um den richtigen Besitz zu erhalten, können Sie das Gruppensetuid-Bit im Verzeichnis mit setzen

chmod g+rwxs dirname

Dadurch wird sichergestellt, dass die im Verzeichnis erstellten Dateien der Gruppe gehören. Sie sollten dann sicherstellen, dass jeder mit umask 002 oder 007 oder etwas Ähnlichem ausgeführt wird. Aus diesem Grund werden Debian und viele andere Linux-Systeme standardmäßig mit Benutzergruppen konfiguriert.

Ich kenne keine Möglichkeit, die gewünschten Berechtigungen zu erzwingen, wenn die Umask des Benutzers zu stark ist.

Norman Ramsey
quelle
23
Dies bietet keine wirkliche Lösung - er fragt nach Berechtigungen, nicht nach Besitz, und der einzige Weg, dies zu tun, ist mit ACLs
Yarin
3
"... stellen Sie sicher, dass jeder mit umask 002 oder 007 oder so etwas läuft" - das ist ein bisschen langwierig ... Wie bringen Sie Postfix, Dovecot, Clam und Spam Assassin dazu?
JWW
2
Was macht der +sTeil? Vielen Dank.
Tommy.carstensen
1
In diesem Fall bedeutet dies, die Gruppen-ID festzulegen. Das heißt, wir verwenden g + s, um das SGID-Bit zu setzen. Ich sage "in diesem Fall", weil + s für die Gruppe mit g kombiniert wurde. + s kann auch zum Setzen des SUID-Bits (setuid) verwendet werden.
Bastion
57

Hier erfahren Sie, wie Sie Standard-ACLs verwenden, zumindest unter Linux.

Zunächst müssen Sie möglicherweise die ACL-Unterstützung in Ihrem Dateisystem aktivieren. Wenn Sie ext4 verwenden, ist es bereits aktiviert. Andere Dateisysteme (z. B. ext3) müssen mit dieser aclOption bereitgestellt werden. Fügen Sie in diesem Fall die Option zu Ihrem hinzu /etc/fstab. Wenn sich das Verzeichnis beispielsweise in Ihrem Root-Dateisystem befindet:

/dev/mapper/qz-root   /    ext3    errors=remount-ro,acl   0  1

Dann montieren Sie es wieder:

mount -oremount /

Verwenden Sie nun den folgenden Befehl, um die Standard-ACL festzulegen:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory

Alle neuen Dateien /shared/directorysollten nun die gewünschten Berechtigungen erhalten. Natürlich hängt es auch von der Anwendung ab, die die Datei erstellt. Zum Beispiel können die meisten Dateien von Anfang an von niemandem ausgeführt werden (abhängig vom Modusargument für den Aufruf open (2) oder creat (2)), genau wie bei Verwendung von umask. Einige Dienstprogramme wie cp, tarund rsyncversuchen, die Berechtigungen der Quelldatei (en) beizubehalten, wodurch Ihre Standard-ACL ausgeblendet wird, wenn die Quelldatei nicht für Gruppen beschreibbar war.

Hoffe das hilft!

pelle
quelle
Es scheint, dass dies immer noch umaskfür alle Benutzer angemessen ist. = / unix.stackexchange.com/questions/71743/…
anatoly techtonik
1
@techtonik Wie ich geschrieben habe, hängt es von der Anwendung ab, die die Datei erstellt. Wenn Sie beispielsweise verwenden cp, wird versucht, die Berechtigungen der Quelldatei zu kopieren. umaskHilft nicht einmal bei der Verwendung cp. Ich habe das gleiche Problem mit gesehen tar. Siehe diese Frage .
Pelle
@techtonik Ich habe jetzt in meiner Antwort einen Satz dazu hinzugefügt.
Pelle
1
Ja, es sieht so aus, als ob das Problem in der Anwendung lag, in der die Rechte zwangsweise auf 644 gesetzt wurden, als mein ACL- und POSIX-Setup für 664 festgelegt war. Es wäre schön, diesen Fallback-Mechanismus für Benutzer zu klären, die das Problem beheben. Viele wissen nicht einmal davon umask.
Anatoly Techtonik
Ich meine, ich habe einige Zeit damit verschwendet, herauszufinden, ob die Mount-Flags nicht richtig gesetzt sind (und auf ext4 können sie nicht gesetzt werden, da sie anscheinend automatisch funktionieren). Es gibt keine Informationen darüber, wie überprüft werden kann, ob setfacl works correctly- ich gehe davon aus, dass dies fehlschlagen sollte, bin mir aber nicht sicher, da die Antwort diesen Punkt verfehlt.
Anatoly Techtonik
4

Es ist hässlich, aber Sie können den Befehl setfacl verwenden, um genau das zu erreichen, was Sie wollen.

Auf einem Solaris-Computer habe ich eine Datei, die die ACLs für Benutzer und Gruppen enthält. Leider müssen Sie alle Benutzer auflisten (zumindest konnte ich keinen Weg finden, dies anders zu machen):

user::rwx
user:user_a:rwx
user:user_b:rwx
...
group::rwx
mask:rwx
other:r-x
default:user:user_a:rwx
default:user:user_b:rwx
....
default:group::rwx
default:user::rwx
default:mask:rwx
default:other:r-x

Benennen Sie die Datei acl.lst und geben Sie Ihre tatsächlichen Benutzernamen anstelle von user_X ein.

Sie können diese Acls jetzt in Ihrem Verzeichnis festlegen, indem Sie den folgenden Befehl eingeben:

setfacl -f acl.lst /your/dir/here
innaM
quelle
Können Sie die Benutzerliste weglassen, wenn alle Mitglieder derselben Gruppe sind, und nur die Gruppenberechtigungen verwenden?
David Dean
Ich habe mir die gleiche Frage gestellt. Es ist schon eine Weile her, seit ich das eingerichtet habe. Aber jedes Mal, wenn ich einen neuen Benutzer bekomme (in derselben Gruppe wie die anderen), vergesse ich, die Liste zu aktualisieren, und ich bekomme Beschwerden darüber, dass der neue Benutzer keine Dateien schreiben / löschen kann. Die Antwort lautet also: Nein, das kannst du nicht.
InnaM
4

In Ihrem Shell-Skript (oder .bashrc) können Sie Folgendes verwenden:

umask 022

umask ist ein Befehl, der die Einstellungen einer Maske festlegt, die steuert, wie Dateiberechtigungen für neu erstellte Dateien festgelegt werden.

user3270784
quelle
1
Dies ist nicht korrekt, da umask die Berechtigungen einschränkt, zu denen keine Berechtigungen hinzugefügt werden können
ACV
@ACV kannst du das näher erläutern? Dies funktioniert für mich. Neu erstellte Dateien ermöglichen Gruppenmitgliedern jetzt, rw-Berechtigungen zu haben, wenn ich dies umask 002in meiner .bashrc-Datei tue.
Arthur Dent
3
@ArthurDent umask 002beschränkt den Zugriff auf andere und lässt die Gruppe unverändert. Denken Sie daran, es ist ugo- das ist Benutzergruppe andere. Denken Sie auch daran, dass umask im Grunde bedeutet, von den Standardeinstellungen abzuziehen. Für Dateien: 666 - 002würde 664 bedeuten, was bedeutet, dass die Gruppe nicht betroffen ist.
ACV