it-swarm.it

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

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 in foo, le autorizzazioni sono: -rw-r--r-- Alice Alice. Tuttavia, è possibile ottenere che ogni file salvato in una sottodirectory di foo abbia le autorizzazioni -rwxrwx--- Alice GROUPNAME (ovvero il proprietario Alice, gruppo GROUPNAME)?

132
student

È possibile controllare i bit di autorizzazione assegnati con umask e 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

Si noti che è necessario eseguire chgrp/chmod per ogni sottodirectory; non si propaga automaticamente (ovvero, né directory esistenti né successivamente create in una directory setgid saranno setgid , sebbene quest'ultimo 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 umask in effetti nel loro genitore a fork() time) . Gli utenti potrebbero aver bisogno di impostare questo in ~/.profile E potrebbe essere necessario fare attenzione alle cose non correlate alla propria directory che richiedono autorizzazioni diverse. moduli può essere utile 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.

96
geekosaur

Se possibile, utilizzare 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 esplicitamente l'opzione di montaggio acl, quindi la voce in /etc/fstab dovrebbe apparire come /dev/sda1 / ext4 errors=remount-ro,acl 0 1. Correre mount -o remount,acl / per attivare gli ACL senza riavviare. Installa anche gli strumenti della riga di comando ACL getfacl e setfacl, generalmente forniti in un pacchetto chiamato acl.

Ora che la configurazione singola è 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 gli ACL non sono un'opzione, imposta la directory di proprietà del gruppo GROUPNAME e imposta le autorizzazioni su 2775 o 2770: chmod g+rwxs /path/to/directory. s qui indica il bit setgid; per una directory, significa che i file creati in questa directory apparterranno al gruppo proprietario della directory.

Dovrai anche impostare mask 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 che proibisce solo l'autorizzazione di scrittura da parte di altri. In genere inseriresti tale impostazione nel tuo ~/.profile:

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

Questa domanda è adatta a 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 tutorial acl, ma potresti fare di peggio di http://www.vanemery.com/Linux/ACL/linux-acl.html

Si noti che il valore predefinito acl si 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 usare acl.

Si noti inoltre che è necessario montare la partizione in cui si sta lavorando con il supporto acl, 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

Impostare il gruppo di foo su staff e impostare l'acl di gruppo e l'utente di foo su 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

Impostare anche acls predefiniti di utente e gruppo su rwx. Questo definisce le autorizzazioni che file e directory ereditano da 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 in foo come utenti faheem e 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 entrambi i file di proprietà di faheem e i file di proprietà di john sono 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
24
Faheem Mitha