Obtendo novos arquivos para herdar permissões de grupo no Linux

73

Estou tendo um problema com permissões em um servidor Linux. Eu estou acostumado com o BSD. Quando um diretório pertence a um grupo, o usuário que o possui não está em www-data, os arquivos criados nele pertencem a esse grupo. Isso é importante porque eu quero que os arquivos sejam legíveis pelo servidor da Web (que não executarei como root), mas, portanto, um usuário ainda pode colocar novos arquivos no diretório. Não posso colocar os usuários em www-data porque eles podem ler todos os outros sites de usuários.

Eu quero que o servidor da web leia todos os sites, quero que os usuários possam alterar os próprios.

As permissões são definidas assim nas pastas no momento ....

drwxr-x--- 3 john www-data 4096 Feb 17 21:27 john

É um comportamento padrão no BSD permitir que as permissões funcionem dessa maneira. Como obtenho o Linux para fazer isso?

    
por John Tate 18.02.2014 / 01:48

3 respostas

108

Parece que você está descrevendo a funcionalidade setgid bit onde, quando um diretório que o define, forçar qualquer novo arquivo criado dentro dele a ter seu grupo configurado para o mesmo grupo definido no diretório pai.

Exemplo

$ whoami
saml

$ groups
saml wheel wireshark

configure um diretório com perms + ownershiphips

$ sudo mkdir --mode=u+rwx,g+rs,g-w,o-rwx somedir
$ sudo chown saml.apache somedir
$ ll -d somedir/
drwxr-s---. 2 saml apache 4096 Feb 17 20:10 somedir/

toque em um arquivo como saml neste diretório

$ whoami
saml

$ touch somedir/afile
$ ll somedir/afile 
-rw-rw-r--. 1 saml apache 0 Feb 17 20:11 somedir/afile

Isso lhe dará aproximadamente o que parece que você quer. Se você realmente quer exatamente o que você descreveu, eu acho que você precisará recorrer à funcionalidade Listas de Controle de Acesso para conseguir isso (ACLs).

ACLs

Se quiser ter um pouco mais de controle sobre as permissões nos arquivos que são criados no diretório, somedir , você pode adicionar a seguinte regra de ACL para definir as permissões padrão dessa maneira.

antes

$ ll -d somedir
drwxr-s---. 2 saml apache 4096 Feb 17 20:46 somedir

definir permissões

$ sudo setfacl -Rdm g:apache:rx somedir
$ ll -d somedir/
drwxr-s---+ 2 saml apache 4096 Feb 17 20:46 somedir/

Observe o + no final, o que significa que esse diretório tem ACLs aplicadas a ele.

$ getfacl somedir
# file: somedir
# owner: saml
# group: apache
# flags: -s-
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:group:apache:r-x
default:mask::r-x
default:other::---

depois

$ touch somedir/afile
$ ll somedir/afile 
-rw-r-----+ 1 saml apache 0 Feb 17 21:27 somedir/afile
$ 

$ getfacl somedir/afile
# file: somedir/afile
# owner: saml
# group: apache
user::rw-
group::r-x              #effective:r--
group:apache:r-x        #effective:r--
mask::r--
other::---

Aviso com as permissões padrão ( setfacl -Rdm ) definidas para que as permissões sejam ( r-x ) por padrão ( g:apache:rx ). Isso força qualquer arquivo novo a ter apenas o r habilitado.

    
por 18.02.2014 / 02:11
22

TL: DR; para que arquivos novos herdam o grupo da pasta contêiner:

$ chmod g+s somefolder

Nota: está implícito na resposta aceita, isso é apenas um trecho.

    
por 01.11.2017 / 04:53
11

Como complemento da resposta do slm, observe que, em um sistema de arquivos ext2 / 3/4, é possível replicar o comportamento do BSD que você descreve usando a opção bsdgroups mount na partição. Na página mount(1) man:

grpid|bsdgroups and nogrpid|sysvgroups
              These options define what group id a newly  created  file  gets.
              When  grpid  is  set,  it takes the group id of the directory in
              which it is created; otherwise (the default) it takes the  fsgid
              of  the current process, unless the directory has the setgid bit
              set, in which case it takes the gid from the  parent  directory,
              and also gets the setgid bit set if it is a directory itself.
    
por 02.05.2014 / 08:00