Como definir as ACLs padrão do Linux de maneira diferente para diretórios e arquivos

9

Eu tenho algumas ACLs definidas em um diretório da seguinte maneira:

# owner: root
# group: root
user::rwx
group::r--
mask::r-x
other::r--
default:user::r--
default:group::r--
default:mask::r-x
default:other::r--

Gostaria que os novos arquivos criados nessa pasta fossem u: apache: r-- e quaisquer novos diretórios fossem u: apache: rx. Como faço para especificar essa intenção usando ACLs?

Eu tentei o -dm u:apache:rXe não parece fazer nada diferente em comparação com apenasrx

overt htdocs # getfacl .
# file: .
# owner: root
# group: root
user::rwx
user:apache:r--
group::r--
mask::r-x
other::r--
default:user::r--
default:user:apache:r--
default:group::r--
default:mask::r--
default:other::r--

overt htdocs # setfacl -dm u:apache:rx .
overt htdocs # touch blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r-x                 #effective:r--
group::r--
mask::r--
other::r--

overt htdocs # rm blah.txt
overt htdocs # setfacl -dm u:apache:rX .
overt htdocs # touch blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r-x                 #effective:r--
group::r--
mask::r--
other::r--

A permissão maiúscula X parece ser útil apenas para definir permissões atuais, não para definir permissões padrão:

overt htdocs # setfacl -x u:apache blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
group::r--
mask::r--
other::r--

overt htdocs # setfacl -m u:apache:rX blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r--
group::r--
mask::r--
other::r--
joshperry
fonte

Respostas:

6

Bem, mas seu exemplo faz exatamente o que você deseja;)

Veja o segundo:

htdocs aberto # setfacl -dm u: apache: rx.
htdocs aberto # touch blah.txt
htdocs aberto # getfacl blah.txt
# file: blah.txt
# owner: root
# grupo: raiz
user :: r--
usuário: apache: rx #effective: r--
group :: r--
mask :: r--
outro :: r--

A linha importante é:

user:apache:r-x #effective:r--

Embora acl esteja definido como rx, ele é efetivamente r-- para arquivos. É por causa da máscara.

E a máscara sempre será apenas rw- para arquivos se o usuário a criou com as permissões rw- para o usuário. (Não tenho 100% de certeza, mas a máscara não pode ser menos restritiva que as permissões básicas).

Tão eficazmente você obtém r-- para arquivos e rx para diretórios.
Como os diretórios criados terão user: rx -> mask será rx -> a permissão efetiva será rx.
Para arquivos: eles terão r--, então a máscara será r-- e as permissões efetivas para ACLs também serão r--. (Se você criar um arquivo e conceder a ele permissões de user :: rx, a máscara será modificada e os usuários do ACL receberão o x também)

seda
fonte
Perdeu totalmente o #effectivetexto! Obrigado pela explicação de como as máscaras efetuam permissões efetivas.
Joshperry
2

Infelizmente, não há como fazer isso com as ACLs do Linux. É verdade que a máscara parecerá fazer exatamente o que você deseja, na medida em que as permissões efetivas. Mas da próxima vez que você fizer uma operação que recalcula a máscara de direitos, bam , todos os seus arquivos serão executados.

Você também pode renunciar a esperar que todos os arquivos em uma ACL sejam executáveis. Isso é realmente apenas uma conveniência e não um recurso de segurança, e contanto que você não coloque essas pastas no seu $ PATH, isso não deve ser um problema. Se isso ainda o incomoda, a única opção é colocar as pastas controladas pela ACL em um sistema de arquivos montado sem opção de execução.

Rashkae
fonte
1

-d (ou --default) é usado para definir os padrões no diretório para que as coisas criadas nele herdem as permissões (como você parece estar fazendo).

Aqui está uma rápida visão geral. http://www.vanemery.com/Linux/ACL/linux-acl.html#default

Não é possível ter arquivos com um padrão e dirs com um padrão diferente.

Você pode executar um script fora do cron que faça um setfacl em todos os diretórios a cada minuto - embora isso seja menos do que o ideal de uma solução.

localizar / caminho / para / top / dir -tipo d -exec setfacl -dm u: apache: rx {} \;

ou

localizar / caminho / para / topo / dir -type d | xargs setfacl -dm u: apache: rx

aspirador
fonte
1

Este post sobre ACLs e máscaras realmente me ajudou a entender como fazer o que eu queria e por quê.

A parte que faltava do meu entendimento era que, ao criar um arquivo, o kernel usa um conjunto de permissões padrão 0666 e para novos diretórios 0777. Portanto, por padrão, os diretórios terão o bit execute (transversal) definido.

A máscara da ACL é basicamente uma maneira de definir um nível umaskde diretório / arquivo / usuário.

joshperry
fonte