Machen Sie alle neuen Dateien in einem Verzeichnis für eine Gruppe zugänglich


131

Angenommen, ich habe zwei Benutzer Alice und Bob sowie eine Gruppe GROUPNAME und einen Ordner foo. Beide Benutzer sind Mitglieder von GROUPNAME (unter Linux und ext3).

Wenn ich als Benutzer Alice eine Datei speichern unter foo, sind die Berechtigungen: -rw-r--r-- Alice Alice. Ist es jedoch möglich, dass jede Datei, die in einem Unterverzeichnis von gespeichert wird, fooüber Berechtigungen verfügt -rwxrwx--- Alice GROUPNAME(z. B. Besitzer Alice, Gruppe GROUPNAME)?


Antworten:


91

Sie können die zugewiesenen Berechtigungs Bits steuern mit umask, und die Gruppe , die durch das Verzeichnis machen setgid zu GROUPNAME.

$ umask 002            # allow group write; everyone must do this
$ chgrp GROUPNAME .    # set directory group to GROUPNAME
$ chmod g+s .          # files created in directory will be in group GROUPNAME

Beachten Sie, dass Sie das chgrp/ chmodfür jedes Unterverzeichnis ausführen müssen; es propagiert nicht automatisch (das heißt, weder bestehende noch anschließend unter einem angelegtes Verzeichnis Setgid Verzeichnis wird setgid , obwohl diese in der Gruppe sein wird GROUPNAME).

Beachten Sie auch, dass dies umaskein Prozessattribut ist und für alle Dateien gilt, die von diesem Prozess und seinen untergeordneten Elementen erstellt wurden (die die jeweils umaskin Kraft befindlichen übergeordneten fork()Elemente übernehmen). Benutzer müssen dies möglicherweise festlegen ~/.profileund auf Dinge achten, die nicht mit Ihrem Verzeichnis zusammenhängen und andere Berechtigungen erfordern. Module können nützlich sein, wenn Sie unterschiedliche Einstellungen für verschiedene Aufgaben benötigen.

Sie können die Dinge etwas besser steuern, wenn Sie POSIX-ACLs verwenden. Es sollte möglich sein, sowohl eine Berechtigungsmaske als auch eine Gruppe anzugeben und diese sinnvoll zu verbreiten. Die Unterstützung für POSIX-ACLs ist jedoch unterschiedlich.


6
Bei Unterverzeichnissen, die nach dem Festlegen von setgid im übergeordneten Verzeichnis erstellt wurden, wird setgid automatisch festgelegt.
Pfeilmeister

2
@Arrowmaster: Auf einigen Systemen vielleicht, aber nicht allen; Ich habe es unter OSX getestet und es verbreitet sich nicht, zumindest nicht für Nicht-Root-Benutzer.
Geekosaurier

2
Nun, auf Debian (und ich nehme an, die meisten anderen Linux-Distributionen) verbreiten sich sowohl die setgid als auch der Gruppenname.
Arrowmaster

3
Unter OS X wird das setgid-Bit in einem Verzeichnis einfach ignoriert. Neue Dateien und Verzeichnisse erhalten immer die Gruppe ihres enthaltenen Verzeichnisses.
John Flatness

Ist es auch möglich, dass kopierte oder nach foo verschobene Dateien (mit cp bzw. mv) automatisch die gewünschten Berechtigungen erhalten ( -rwxrwx--- A G)?
Schüler

106

Verwenden Sie nach Möglichkeit Zugriffssteuerungslisten (ACL) .

Stellen Sie unter Linux sicher, dass das von Ihnen verwendete Dateisystem ACLs unterstützt (die meisten Unix-Dateisysteme unterstützen dies). Möglicherweise müssen Sie die Mount-Optionen ändern, um ACLs zu aktivieren: Bei ext2 / ext3 / ext4 müssen Sie die aclMount-Option explizit angeben , damit der Eintrag in /etc/fstabwie folgt aussehen sollte /dev/sda1 / ext4 errors=remount-ro,acl 0 1. Führen Sie dies aus mount -o remount,acl /, um die ACLs zu aktivieren, ohne einen Neustart durchzuführen. Installieren Sie auch die ACL - Kommandozeilen - Tools getfaclund setfacl, in der Regel in einem Paket zur Verfügung gestellt genannt acl.

Nachdem die einmalige Einrichtung abgeschlossen ist, ändern Sie die Zugriffssteuerungsliste des Verzeichnisses, um der Gruppe Schreibberechtigungen zu erteilen und diese Berechtigungen an neu erstellte Dateien zu vererben. Unter Linux:

setfacl -d -m group:GROUPNAME:rwx /path/to/directory
setfacl -m group:GROUPNAME:rwx /path/to/directory

Wenn ACLs keine Option ist, das Verzeichnis von der Gruppe im Besitz machen GROUPNAME, und legen Sie die Berechtigungen für 2775 oder 2770: chmod g+rwxs /path/to/directory. Das shier bedeutet das setgid-Bit; Für ein Verzeichnis bedeutet dies, dass die in diesem Verzeichnis erstellten Dateien zu der Gruppe gehören, der das Verzeichnis gehört.

Sie müssen auch Alice und Bobs Umask so einstellen , dass alle ihre Dateien standardmäßig für Gruppen beschreibbar sind. Die Standardeinstellung für umask auf den meisten Systemen ist 022. Dies bedeutet, dass Dateien alle Berechtigungen haben können, mit Ausnahme des Schreibens nach Gruppen und anderen. Ändern Sie dies in 002, was bedeutet, dass nur das Schreiben durch andere Personen verboten wird. Normalerweise würden Sie diese Einstellung in Folgendes einfügen ~/.profile:

umask 002    # or 007 to have files not readable by others

6
+1 - Sehr gründliche Antwort. Ich hätte nie gedacht, dass man schnell wieder aufsteigen kann. Gut zu wissen.
Boehj

1
Der Befehl setfacl -d funktioniert bei mir nicht, da die in diesem Verzeichnis enthaltenen Dateien eine r-- -Maske haben, die alle Schreibberechtigungen negiert. Würde gerne etwas Hilfe. Siehe unix.stackexchange.com/questions/71743/…
Ben McCann

2
@its_me F1: Ich zeige einen mountBefehl mit der remountOption, so dass er nicht verwendet wird fstab. Das aclDoppelte bedeutet, dass das Dateisystem bereits mit der aclOption gemountet wurde und harmlos ist. acl ist übrigens die Standardeinstellung für ext4 in den letzten Kerneln (der Patch war noch ganz neu, als ich diese Antwort schrieb). F2: Sie können die Befehle in beliebiger Reihenfolge ausführen.
Gilles

1
@its_me Ja, Ihr Verständnis ist korrekt, es ist nur so, dass es egal ist, in welcher Reihenfolge Sie die Einträge hinzufügen
Gilles

8
Sie sollten die Antwort dann verbessern zu verwenden , GROUPNAMEanstatt G, es deutlicher zu machen
knocte

24

Diese Frage passt gut zu Linux acl. Da Sie Ihr Betriebssystem nicht angeben, gehe ich im Folgenden von Linux aus. Hier ist eine Beispielsitzung.

Ich kenne kein wirklich gutes aclTutorial, aber Sie könnten es schlechter machen als http://www.vanemery.com/Linux/ACL/linux-acl.html

Beachten Sie, dass sich die Standardeinstellung aclwie eine lokale Umask verhält. Da umasks zumindest unter Linux global angewendet werden, ist dies der einzige Weg, den ich kenne, um den Effekt einer lokalen umask zu erzielen. Aus irgendeinem Grund ist dies ein wenig bekanntes Feature. Das Netz ist mit Leuten übersät, die nach einem lokalen Umask-Override fragen, aber fast niemand scheint daran zu denken, ihn zu benutzen acl.

Beachten Sie auch, dass Sie die Partition, in der Sie arbeiten, mit aclUnterstützung mounten müssen , z.

/dev/mapper/debian-acl /mnt/acl        ext3    defaults,acl        0       2

Sitzung folgt:

/mnt/acl$ mkdir foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: faheem
user::rwx
group::r-x
other::r-x

Legen Sie die Gruppe von foozu staffund die ACL von Gruppe und Benutzer von foozu fest rwx.

/mnt/acl$ chgrp staff foo
/mnt/acl$ setfacl -R -m u::rwx,g::rwx foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x

Setzen Sie auch die Standard-Acls von Benutzer und Gruppe auf rwx. Dies definiert Berechtigungen, von denen Dateien und Verzeichnisse erben foo. Alle unter foo erstellten Dateien und Verzeichnisse haben also Gruppenberechtigungen rw.

/mnt/acl$ setfacl -d --set u::rwx,g::rwx,o::- foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::---

Erstellen Sie nun einige Dateien fooals Benutzer faheemund john.

/mnt/acl$ cd foo
/mnt/acl/foo$ touch bar

# switch to user john for this next command.

/mnt/acl/foo$ touch baz

Dateien auflisten. Beachten Sie, dass sowohl Dateien im Besitz faheemals auch Dateien im Besitz von johnmit Gruppenberechtigungen erstellt werden rw.

/mnt/acl/foo$ ls -la
total 3
drwxrwxr-x+ 2 faheem staff  1024 May  9 01:22 .
drwxr-xr-x  4 faheem faheem 1024 May  9 01:20 ..
-rw-rw----  1 faheem faheem    0 May  9 01:20 bar
-rw-rw----  1 john   john      0 May  9 01:22 baz
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.