Por que chmod (1) no grupo afeta a máscara ACL?

17

Estou tentando entender esse comportamento do Unix (que por acaso estou testando no Ubuntu 11.10):

$ touch foo
$ setfacl -m u:nobody:rwx foo
$ getfacl foo
# file: foo
# owner: michael
# group: michael
user::rw-
user:nobody:rwx
group::rw-
mask::rwx
other::r--

$ chmod g-rw foo
$ getfacl foo
# file: foo
# owner: michael
# group: michael
user::rw-
user:nobody:rwx         #effective:--x
group::rw-          #effective:---
mask::--x
other::r--

Observe que o comando chmod (1) atualizou a máscara da ACL. Por que isso acontece?

A página de manual do SunOS tem o seguinte a dizer:

Se você usar o comando chmod (1) para alterar as permissões de proprietário do grupo de arquivos em um arquivo com entradas da ACL, as permissões do proprietário do grupo de arquivos e a máscara da ACL serão alteradas para as novas permissões. Esteja ciente de que as novas permissões de máscara da ACL podem alterar as permissões efetivas para usuários e grupos adicionais que possuem entradas da ACL no arquivo.

Eu pergunto, porque seria conveniente para mim se o chmod (1) não tivesse esse comportamento. Espero que, ao entender por que ele faz o que faz, seja possível projetar melhor como configuro as permissões do sistema de arquivos.

Michael Kropat
fonte
2
Agora eu me pergunto se eu deveria ter perguntado isso em unix.stackexchange.com. Tentar escolher o site certo é sempre um desafio.
Michael Kropat

Respostas:

24

Seria não ser conveniente para você, se chmod()não tivesse esse comportamento.

Seria altamente inconveniente, porque coisas que as pessoas tradicionalmente esperam trabalhar no Unixes quebrariam. Esse comportamento lhe serve bem, você sabia disso?

É uma pena que o IEEE 1003.1e nunca tenha se tornado um padrão e tenha sido retirado em 1998. Na prática, catorze anos depois, é um padrão que uma ampla gama de sistemas operacionais - do Linux ao FreeBSD e Solaris - realmente implementa.

O rascunho de trabalho # 17 do IEEE 1003.1e facilita a leitura e eu o recomendo. No apêndice B § 23.3, o grupo de trabalho fornece uma lógica detalhada de oito páginas para a maneira um tanto complexa como as ACLs POSIX trabalham com relação aos antigos S_IRWXGsinalizadores de permissão do grupo. (Vale a pena notar que o pessoal da TRUSIX forneceu a mesma análise dez anos antes.) Não vou copiar tudo aqui. Leia a justificativa no rascunho da norma para obter detalhes. Aqui está uma breve descrição :

  • O manual do SunOS está errado. Ele deve ler

    Se você usar o chmod(1)comando para alterar as permissões de proprietário do grupo de arquivos em um arquivo com entradas ACL, tanto as permissões de proprietário do grupo de arquivos ou a máscara ACL são alteradas para as novas permissões.

    Esse é o comportamento que você pode ver acontecendo , apesar do que a página do manual atual diz, em sua pergunta. É também o comportamento especificado pelo rascunho do padrão POSIX. Se existir uma entrada de controle de acesso ( CLASS_OBJterminologia da Sun e TRUSIX para ACL_MASK), os bits de grupo de uma chmod()configuração serão configurados; caso contrário, eles definirão a GROUP_OBJentrada de controle de acesso.

  • Se não fosse esse o caso, os aplicativos que faziam várias coisas padrão com o `chmod ()`, esperando que funcionasse como o `chmod ()` tradicionalmente funcionava em Unixes antigos não-ACL, deixariam lacunas de segurança ou veriam o que eles acham que existem brechas na segurança:

    • Os aplicativos Unix tradicionais esperam poder negar todo o acesso a um arquivo, com pipe, dispositivo ou diretório chmod(…,000). Na presença de ACLs, isso desativa todas as permissões de usuário e grupo se o antigo for S_IRWXGmapeado para CLASS_OBJ. Sem isso, configurar as permissões de arquivo antigas como 000não afetaria nenhuma USERou as GROUPentradas e outros usuários, surpreendentemente, ainda teriam acesso ao objeto.

      Alterar temporariamente os bits de permissão de um arquivo para não ter acesso chmod 000e depois alterá-los novamente foi um mecanismo antigo de bloqueio de arquivos, usado antes do Unixes ganhar mecanismos de bloqueio consultivos, que - como você pode ver - as pessoas ainda usam hoje .

    • Os scripts Unix tradicionais esperam poder executar chmod go-rwxe terminar com apenas o proprietário do objeto capaz de acessar o objeto. Novamente - como você pode ver - essa ainda é a sabedoria recebida doze anos depois. E, novamente, isso não funciona, a menos que o antigo S_IRWXGmapeie CLASS_OBJse ele existe, caso contrário, esse chmodcomando não desativaria nenhuma entrada USERou GROUPcontrole de acesso, levando outros usuários que não o proprietário e grupos não proprietários a manterem acesso a algo que é espera-se que seja acessível apenas ao proprietário.

    • Um sistema em que os bits de permissão fossem separados e andeditados com as ACLs exigiria rwxrwxrwxna maioria dos casos os sinalizadores de permissão de arquivo , o que confundiria as muitas aplicações Unix que reclamam quando vêem o que pensam ser gravável em todo o mundo coisa.

      Um sistema em que os bits de permissão fossem separados e oreditados com as ACLs teria o chmod(…,000)problema mencionado anteriormente.

Leitura adicional

JdeBP
fonte
Impressionante, tudo isso faz muito sentido. Seu esclarecimento na página de manual confirmou minhas suspeitas sobre o comportamento, enquanto suas três explicações eram exatamente o que eu precisava para me esclarecer sobre o assunto. Fico muito mais feliz ao saber os porquês do design e estou muito feliz por você ter postado seu artigo, o que me impediu de fazer toda essa leitura para responder à única pergunta.
Michael Kropat
@hopeseekr Você sempre pode usar o Linux, centenas de utilitários GNU e milhares de softwares de terceiros para que eles não usem S_IRWXGmais permissões. Ligue-me quando terminar.
Tobia
0

Esse comportamento se aplica apenas a entradas POSIX ACL. A razão pela qual isso está aqui é que, se você tem uma pasta e, dentro dela, existe um arquivo, você pode acessar como rwx (por exemplo) a pasta e o arquivo. Se as permissões de grupo do arquivo forem rw- (que podem ser um cenário típico), a máscara concederá ao acl as permissões efetivas de rw- mesmo que a ACL indique explicitamente rwx.

Por outro lado, o diretório que quase sempre é + x possui permissões efetivas de máscara de ACL, permitindo também + x.

Em resumo, essa máscara é basicamente usada para diferenciar a permissão entre arquivos e pastas para o conjunto POSIX ACL, para que um arquivo não se torne executável quando normalmente não deveria ser.

Matthew Ife
fonte
Caso alguém acabe lendo isso, esta resposta está totalmente errada.
pgoetz 19/08