Rendi tutti i nuovi file in una directory accessibili a un gruppo


131

Supponiamo che io abbia due utenti Alice e Bob e un gruppo GROUPNAME e una cartella foo, entrambi gli utenti sono membri di GROUPNAME (usando Linux ed ext3).

Se salvo come utente Alice un file sotto foo, i permessi sono: -rw-r--r-- Alice Alice. Tuttavia, è possibile ottenere che ogni file salvato in una sottodirectory fooabbia autorizzazioni -rwxrwx--- Alice GROUPNAME(ad esempio il proprietario Alice, gruppo GROUPNAME)?


Risposte:


91

È possibile controllare i bit di autorizzazione assegnati con umaske il gruppo impostando la directory setgid su 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

Nota che devi fare il chgrp/ chmodper ogni sottodirectory; non si propaga automaticamente (ovvero, né le directory esistenti né quelle create successivamente in una directory setgid saranno setgid , sebbene quest'ultima sia nel gruppo GROUPNAME).

Si noti inoltre che umaskè un attributo di processo e si applica a tutti i file creati da quel processo e dai suoi figli (che ereditano gli umaskeffetti in quel fork()momento al loro genitore ). Gli utenti potrebbero aver bisogno di impostare questa opzione ~/.profilee potrebbe essere necessario fare attenzione alle cose non correlate alla directory che richiedono autorizzazioni diverse. i moduli possono essere utili se hai bisogno di impostazioni diverse quando fai cose diverse.

Puoi controllare le cose un po 'meglio se puoi usare gli ACL POSIX; dovrebbe essere possibile specificare sia una maschera di autorizzazione che un gruppo e farli propagare in modo ragionevole. Tuttavia, il supporto per gli ACL POSIX è alquanto variabile.


6
Le sottodirectory create dopo aver impostato setgid nella directory principale avranno setgid impostato automaticamente.
Arrowmaster

2
@Arrowmaster: su alcuni sistemi, forse, ma non su tutti; Ho testato su OSX e non si propaga, almeno per non root.
geekosaur,

2
Bene su Debian (e presumo che la maggior parte delle altre distro Linux) sia il setgid che il nome del gruppo si propaghino entrambi.
Arrowmaster

3
Su OS X, il bit setgid in una directory viene semplicemente ignorato; ai nuovi file e directory viene sempre assegnato il gruppo della loro directory di contenimento.
John Flatness,

È anche possibile che i file copiati o spostati su foo (usando cp resp. Mv) ottengano automaticamente le autorizzazioni desiderate ( -rwxrwx--- A G)?
studente

106

Se possibile, utilizzare gli elenchi di controllo di accesso (ACL) .

Sotto Linux, assicurati che il filesystem che stai usando supporti gli ACL (la maggior parte dei filesystem unix lo fanno). Potrebbe essere necessario modificare le opzioni di montaggio per abilitare gli ACL: con ext2 / ext3 / ext4, è necessario specificare aclesplicitamente l'opzione di montaggio, quindi la voce /etc/fstabdovrebbe apparire come /dev/sda1 / ext4 errors=remount-ro,acl 0 1. Esegui mount -o remount,acl /per attivare gli ACL senza riavviare. Installa anche gli strumenti della riga di comando ACL getfacle setfacl, generalmente forniti in un pacchetto chiamato acl.

Ora che l'installazione di una volta è terminata, cambia l'ACL della directory per dare al gruppo le autorizzazioni di scrittura e rendere queste autorizzazioni ereditate dai file appena creati. Sotto Linux:

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

Se ACL non sono un'opzione, rendere la directory di proprietà del gruppo GROUPNAME, e impostare le autorizzazioni a 2775 o 2770: chmod g+rwxs /path/to/directory. Il squi indica il bit setgid; per una directory, significa che i file creati in questa directory apparterranno al gruppo proprietario della directory.

Dovrai anche impostare umask di Alice e Bob per rendere tutti i loro file scrivibili in gruppo per impostazione predefinita. Il umask predefinito sulla maggior parte dei sistemi è 022, il che significa che i file possono avere tutte le autorizzazioni tranne la scrittura per gruppo e altro. Cambialo in 002, il che significa vietare solo l'autorizzazione di scrittura da parte di altri. In genere inseriresti questa impostazione nel tuo ~/.profile:

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

6
+1 - Risposta molto approfondita. Non ho mai saputo che si potesse rimontare / al volo. Buono a sapersi.
Boehj,

1
Il comando setfacl -d non funziona per me perché i file contenuti in quella directory hanno una maschera r-- che nega qualsiasi permesso di scrittura. Mi piacerebbe un po 'd'aiuto. Vedi unix.stackexchange.com/questions/71743/…
Ben McCann

2
@its_me Q1: mostro un mountcomando con l' remountopzione, quindi non lo usa fstab. Avere acldue volte significa che il filesystem era già montato con l' aclopzione ed era innocuo. acl è il default per ext4 negli ultimi kernel, tra l'altro (la patch era ancora nuova quando ho scritto questa risposta). Q2: è possibile eseguire i comandi in entrambi gli ordini.
Gilles,

1
@its_me Sì, la tua comprensione è corretta, è solo che non importa in quale ordine aggiungi le voci
Gilles,

8
dovresti migliorare la risposta da usare GROUPNAMEinvece di G, per renderla più chiara
knocte

24

Questa domanda è adatta per Linux acl. Dal momento che non dichiari il tuo sistema operativo, assumerò Linux in quanto segue. Ecco una sessione di esempio.

Non conosco un ottimo acltutorial, ma potresti fare di peggio di http://www.vanemery.com/Linux/ACL/linux-acl.html

Si noti che il valore predefinito aclsi comporta come un umask locale. Poiché almeno in Linux, le umask sono applicate a livello globale, questo è l'unico modo che conosco per ottenere l'effetto di una umask locale. Per qualche ragione questa è una caratteristica poco conosciuta. La rete è piena di gente che chiede un override di umask locale, ma quasi nessuno sembra pensare di usarlo acl.

Si noti inoltre che è necessario montare la partizione in cui si sta lavorando con il aclsupporto, ad es.

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

Segue sessione:

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

Imposta il gruppo di fooessere staffe imposta l'acl di gruppo e l'utente di fooa 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

Imposta anche acls predefiniti di utente e gruppo rwx. Questo definisce le autorizzazioni da cui ereditano file e directory foo. Quindi tutti i file e le directory creati sotto foo avranno autorizzazioni di gruppo 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::---

Ora crea alcuni file foocome utenti faheeme john.

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

# switch to user john for this next command.

/mnt/acl/foo$ touch baz

Elenca i file. Si noti che sia i file di proprietà faheemche i file di proprietà johnsono creati con autorizzazioni di gruppo 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.