Torna todos os novos arquivos em um diretório acessível para um grupo

121

Suponha que eu tenha dois usuários A e B e um grupo G e uma pasta foo, ambos os usuários são membros de G (usando linux e ext3).

Se eu salvar como um arquivo do usuário A em foo, as permissões serão: -rw-r--r-- A A . No entanto, é possível conseguir que todos os arquivos salvos em algum subdiretório de foo possuam permissões -rwxrwx--- A G (ou seja, proprietário A, grupo G)?

    
por student 08.05.2011 / 20:41

3 respostas

88

Você pode controlar os bits de permissão atribuídos com umask e o grupo fazendo o diretório setgid para G .

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

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

Observe também que umask é um atributo de processo e se aplica a todos os arquivos criados por esse processo e seus filhos (que herdam o umask em vigor em seu pai em fork() time). Os usuários podem precisar definir isso em ~/.profile e talvez precisem observar coisas não relacionadas ao seu diretório que precisam de permissões diferentes. Os 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.

    
por 08.05.2011 / 20:51
96

Se for possível, use 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 faz). Talvez seja necessário alterar as opções de montagem para ativar as ACLs: com ext2 / ext3 / ext4, é necessário especificar explicitamente a opção acl mount, portanto, a entrada em /etc/fstab deve parecer com /dev/sda1 / ext4 errors=remount-ro,acl 0 1 . Execute mount -o remount,acl / para ativar as ACLs sem reinicializar. Instale também as ferramentas de linha de comando da ACL getfacl e setfacl , normalmente fornecidas em um pacote chamado acl .

Agora que a configuração única acabou, 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:G:rwx /path/to/directory
setfacl -m group:G:rwx /path/to/directory

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

Você também precisará definir as umask de A e B 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 gravação por grupo e outros. Mude para 002, o que significa proibir apenas a permissão de gravação por outro. Você normalmente colocaria essa configuração no seu ~/.profile :

umask 002    # or 007 to have files not readable by others
    
por 08.05.2011 / 21:02
22

Esta questão é uma boa opção para o linux acl . Como você não informa seu sistema operacional, assumirei o Linux no que segue. Aqui está um exemplo de sessão.

Eu não sei de um bom tutorial de acl , mas você pode fazer pior do que o link

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

Observe também que você precisa montar a partição em que está trabalhando com acl support, 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 foo como staff e defina a acl de grupo e usuário de foo a 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 configurações padrão de usuário e grupo para rwx também. Isso define as permissões que os arquivos e diretórios herdam de 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 em foo como usuários 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

Listar arquivos. Observe que ambos os arquivos pertencentes a faheem e arquivos pertencentes a john sã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
    
por 08.05.2011 / 20:59