Tornar todos os novos arquivos em um diretório acessíveis a um grupo

131

Suponha que eu tenha dois usuários Alice e Bob e um grupo GROUPNAME e uma pasta foo, ambos usuários sejam membros de GROUPNAME (usando Linux e ext3).

Se eu salvar como usuário Alice um arquivo com foo, as permissões são: -rw-r--r-- Alice Alice. No entanto, é possível conseguir que todo arquivo salvo em algum subdiretório de footenha permissões -rwxrwx--- Alice GROUPNAME(por exemplo, proprietário Alice, grupo GROUPNAME)?

aluna
fonte

Respostas:

91

Você pode controlar os bits de permissão atribuídos com umaske o grupo criando o diretório setgid como 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

Observe que você precisa fazer o chgrp/ chmodpara cada subdiretório; ele não se propaga automaticamente (ou seja, nem os diretórios existentes nem os criados posteriormente em um diretório setgid serão setgid , embora o último esteja em grupo GROUPNAME).

Observe também que umaské um atributo do processo e se aplica a todos os arquivos criados por esse processo e seus filhos (que herdam o umaskefeito em seus pais no fork()momento). Os usuários podem precisar configurá-lo ~/.profilee ter cuidado com coisas não relacionadas ao seu diretório que precisam de permissões diferentes. módulos podem ser úteis se você precisar de configurações diferentes ao fazer coisas diferentes.

Você pode controlar as coisas um pouco melhor se puder usar ACLs POSIX; deve ser possível especificar uma máscara de permissões e um grupo e fazer com que eles se propaguem de maneira sensata. O suporte para ACLs POSIX é um pouco variável, no entanto.

geekosaur
fonte
6
Os subdiretórios criados após a configuração do setgid no diretório pai terão o setgid definido automaticamente.
Arrowmaster
2
@Arrowmaster: Em alguns sistemas, talvez, mas não em todos; Eu testei no OSX e ele não se propaga, pelo menos para não-root.
geekosaur
2
Bem no Debian (e eu assumo a maioria das outras distribuições Linux), o nome do grupo e do grupo se propaga.
Arrowmaster
3
No OS X, o bit setgid em um diretório é apenas ignorado; novos arquivos e diretórios sempre recebem o grupo do diretório que os contém.
John Flatness
Também é possível que os arquivos copiados ou movidos para foo (usando cp resp. Mv) obtenham as permissões desejadas automaticamente ( -rwxrwx--- A G)?
student
106

Se possível, use as listas de controle de acesso (ACL) .

No Linux, verifique se o sistema de arquivos que você está usando suporta ACLs (a maioria dos sistemas de arquivos unix). Pode ser necessário alterar as opções de montagem para ativar as ACLs: com ext2 / ext3 / ext4, é necessário especificar aclexplicitamente a opção de montagem, para que a entrada em /etc/fstabseja semelhante /dev/sda1 / ext4 errors=remount-ro,acl 0 1. Execute mount -o remount,acl /para ativar as ACLs sem reiniciar. Instale também as ferramentas de linha de comando da ACL getfacle setfacl, geralmente fornecidas em um pacote chamado acl.

Agora que a configuração única foi concluída, altere a ACL do diretório para conceder ao grupo permissões de gravação e tornar essas permissões herdadas pelos arquivos recém-criados. No Linux:

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

Se ACLs não são uma opção, faça o diretório de propriedade do grupo GROUPNAME, e definir suas permissões para 2775 ou 2770: chmod g+rwxs /path/to/directory. O saqui significa o bit setgid; para um diretório, significa que os arquivos criados nesse diretório pertencerão ao grupo que possui o diretório.

Você também precisará definir umask de Alice e Bob para tornar todos os seus arquivos graváveis ​​em grupo por padrão. O umask padrão na maioria dos sistemas é 022, o que significa que os arquivos podem ter todas as permissões, exceto a gravação por grupo e outras. Altere para 002, ou seja, para proibir apenas a permissão de gravação por outra. Você normalmente colocaria essa configuração no seu ~/.profile:

umask 002    # or 007 to have files not readable by others
Gilles
fonte
6
+1 - resposta muito completa. Eu nunca soube que alguém poderia remontar / on-the-fly. Bom saber.
8119 Boehj
1
O comando setfacl -d não funciona para mim porque os arquivos contidos nesse diretório possuem uma máscara r-- que nega qualquer permissão de gravação. Adoraria alguma ajuda. Veja unix.stackexchange.com/questions/71743/…
Ben McCann
2
@its_me Q1: Eu mostro um mountcomando com a remountopção, para que ele não seja usado fstab. Ter aclduas vezes significa que o sistema de arquivos já foi montado com a aclopção e é inofensivo. acl é o padrão para ext4 nos kernels recentes, a propósito (o patch ainda era novo quando escrevi esta resposta). P2: você pode executar os comandos em qualquer ordem.
Gilles
1
@its_me Sim, o seu entendimento está correto, é apenas que não importa em que ordem você adicionar as entradas
Gilles
8
você deve melhorar a resposta em seguida, para usar GROUPNAMEem vez de G, para torná-la mais clara
knocte
24

Esta questão é uma boa opção para Linux acl. Como você não indica seu sistema operacional, assumirei o Linux a seguir. Aqui está uma sessão de exemplo.

Não conheço um acltutorial muito bom , mas você poderia fazer pior do que http://www.vanemery.com/Linux/ACL/linux-acl.html

Observe que o padrão aclse comporta como uma umask local. Como pelo menos no Linux, umasks são aplicadas globalmente, é a única maneira que conheço para obter o efeito de uma umask local. Por alguma razão, esse é um recurso pouco conhecido. A rede está cheia de pessoas perguntando sobre uma substituição local de umask, mas quase ninguém parece pensar em usar acl.

Observe também que você precisa montar a partição em que está trabalhando com aclsuporte, por exemplo.

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

A sessão segue:

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

Defina o grupo de foocomo ser staffe defina a ACL do grupo e o usuário de foocomo 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

Defina as acls padrão do usuário e do grupo rwxtambém. Isso define as permissões que os arquivos e diretórios herdam foo. Portanto, todos os arquivos e diretórios criados no foo terão permissões de grupo 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::---

Agora crie alguns arquivos foocomo usuários faheeme john.

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

# switch to user john for this next command.

/mnt/acl/foo$ touch baz

Listar arquivos. Observe que os arquivos pertencentes a faheeme os arquivos pertencentes a johnsão criados com permissões de grupo 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
Faheem Mitha
fonte