Definindo ACLs diferentes em diretórios e arquivos

15

Desejo configurar permissões padrão para um compartilhamento de arquivos para que todos possam rwx de todos os diretórios e para que todos os arquivos recém-criados sejam rw .

Todos que acessam esse compartilhamento estão no mesmo grupo, então isso não é uma preocupação.

Procurei fazer isso por meio de ACLs sem alterar todos osksks e tal dos usuários. Aqui estão minhas invocações atuais:

setfacl -Rdm g:mygroup:rwx share_name
setfacl -Rm g:mygroup:rwx share_name

Meu problema é que, embora eu queira que todos os subdiretórios recém-criados sejam rwx , quero apenas que os arquivos sejam rw .

Alguém tem um método melhor para alcançar o resultado final desejado? Existe alguma maneira de definir as ACLs nos diretórios separadamente dos arquivos, de forma semelhante a chmod +x vs. chmod +X ?

Obrigado

    
por durandal 25.08.2010 / 16:05

3 respostas

12

Como Gilles aponta, as permissões padrão setfacl especificam as permissões máximas, basicamente substituindo o umask . Portanto, os arquivos recém-criados serão rw , a menos que o aplicativo que criou o arquivo solicite especialmente que seja executável.

$ mkdir test
$ touch test/oldfile
$ getfacl test/oldfile
# file: test/oldfile
# owner: myuser
# group: myuser
user::rw-
group::r--
other::r--

$ setfacl -m d:g:mygroup:rwx test
$ touch test/newfile
$ getfacl test/newfile
# file: test/newfile
# owner: myuser
# group: myuser
user::rw-
group::r-x                         #effective:r--
group:mygroup:rwx                  #effective:rw-
mask::rw-
other::r--

Observe os perms efetivos acima. (Existem apenas alguns programas que solicitarão para definir o bit de execução nos arquivos que ele cria, por exemplo, gcc para executáveis e cp se o arquivo que está sendo copiado for executável.)

Ou você quis dizer que o primeiro comando setfacl estava funcionando do jeito que você queria, mas o segundo não estava? Em outras palavras, você está procurando corrigir permissões nos arquivos antigos, certificando-se de que os diretórios sejam passíveis de serem executados, sem conceder permissões de execução a outros arquivos regulares?

Minha versão de setfacl permite X exatamente como você deseja, por exemplo:

setfacl g:mygroup:rwX

$ setfacl --version
setfacl 2.2.49
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ find test -ls
107513    4 drwxr-xr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-r--r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxr-xr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ setfacl -Rm g:somegroup:rwx test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rwxr--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ setfacl -Rm g:somegroup:rwX test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rw-r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir

Se a sua versão de setfacl não der suporte a isso, por que não usar find ?

sobrescreve as permissões, configurando-as para rw para arquivos e rwx para dirs

$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)

defina as permissões de mygroup ACL com base nas permissões de grupo existentes

$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)

Você provavelmente desejará verificar se a máscara do grupo fornece permissões efetivas. Se não, você terá que executar isso também:

$ find . -type d -exec chmod g+rwX '{}' ';'
    
por 22.12.2010 / 02:39
3

Para futuros leitores, para usar setfacl em arquivos / pastas existentes sem adicionar o bit executável a seus arquivos, a solução é essa parte de @ Resposta do Mikel :

My version of setfacl allows X exactly like you want, e.g.:

setfacl g:mygroup:rwX

Trecho relevante da setfacl documentação :

The perms field is a combination of characters that indicate the permissions: read (r), write (w), execute (x), execute only if the file is a directory or already has execute permission for some user (X).

    
por 16.02.2017 / 22:41
2

Tanto quanto eu entendo as ACLs do Linux, setfacl -Rdm g:mygroup:rwx share_name faz exatamente o que você quer. Experiência:

umask 007
mkdir foo
chgrp mygroup foo
chmod 2700 foo
setfacl -d -m group:mygroup:rwx foo
setfacl -m group:mygroup:rwx foo
touch foo/data
echo '#!/bin/ls' >foo/exec
chmod +x foo/exec

Em seguida, como um usuário diferente no grupo mygroup :

$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec

O que está acontecendo?

$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx                 #effective:rw-
mask::rw-
other::---

A ACL efetiva de mygroup é o resultado da entrada ACL_GROUP de mygroup ( rwx ) com a entrada ACL_MASK ( rw- ).

A página man do acl (5) explica o cálculo em "Algoritmos de verificação de acesso". Não explica como ACL_MASK entradas são geradas, mas na prática a coisa certa parece acontecer.

    
por 25.08.2010 / 22:26