Definindo ACLs diferentes em diretórios e arquivos

15

Desejo configurar permissões padrão para um compartilhamento de arquivos, para que todos possam rwxtodos os diretórios e para que todos os arquivos criados recentemente sejam rw.

Todo mundo que está acessando esse compartilhamento está no mesmo grupo, então isso não é uma preocupação.

Eu olhei para fazer isso via ACLs sem alterar as umasks de todos os usuários e tal. Aqui estão minhas invocações atuais:

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

Meu problema é que, enquanto eu quero todos os recém-criados sub-diretórios para ser rwx, eu só quero recém-criados arquivos para ser rw.

Alguém tem um método melhor para alcançar o resultado final desejado? Existe alguma maneira de definir ACLs nos diretórios separadamente dos arquivos, em uma linha semelhante à chmod +xvs. chmod +X?

obrigado

durandal
fonte

Respostas:

12

Como Gilles aponta, setfaclas permissões padrão especificam as permissões máximas, basicamente substituindo o umask. Portanto, os arquivos criados recentemente serão a rwmenos que o aplicativo que criou o arquivo solicite especialmente que ele 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 as permissões efetivas acima. (Existem apenas alguns programas que pedirão para definir o bit de execução nos arquivos que ele cria, por exemplo, gccpara executáveis ​​e cpse o arquivo que está sendo copiado era executável.)

Ou você quis dizer que o primeiro comando setfacl estava funcionando do jeito que você queria, mas o segundo não? Em outras palavras, você deseja corrigir permissões nos arquivos antigos, certificando-se de que os diretórios possam ser percorridos, sem conceder permissões de execução a outros arquivos regulares?

Minha versão do setfaclpermite Xexatamente 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 do setfaclnão suporta isso, por que não usar find?

sobrescrever 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 '{}' ';' \)

definir permissões ACL do mygroup 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 de grupo fornece permissões efetivas. Caso contrário, você também precisará executar isso:

$ find . -type d -exec chmod g+rwX '{}' ';'
Mikel
fonte
4

Para futuros leitores, para usar setfaclem arquivos / pastas existentes sem adicionar o bit executável aos seus arquivos, a solução é esta parte da resposta do @ Mikel :

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

setfacl g:mygroup:rwX

Trecho relevante da setfacldocumentação :

O campo perms é uma combinação de caracteres que indicam as permissões: ler (r), escrever (w), executar (x), executar apenas se o arquivo for um diretório ou já tiver permissão de execução para algum usuário (X) .

Erik Koopmans
fonte
2

Tanto quanto eu entendo as ACLs do Linux, setfacl -Rdm g:mygroup:rwx share_namefaz exatamente o que você deseja. Experimentar:

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

Então, 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 para mygroupé o resultado de e a ACL_GROUPentrada de mygroup( rwx) com a entrada ACL_MASK ( rw-).

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

Gilles 'SO- parar de ser mau'
fonte