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.
fonte
Respostas:
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_IRWXG
sinalizadores 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
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_OBJ
terminologia da Sun e TRUSIX paraACL_MASK
), os bits de grupo de umachmod()
configuração serão configurados; caso contrário, eles definirão aGROUP_OBJ
entrada 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 forS_IRWXG
mapeado paraCLASS_OBJ
. Sem isso, configurar as permissões de arquivo antigas como000
não afetaria nenhumaUSER
ou asGROUP
entradas 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 000
e 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-rwx
e 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 antigoS_IRWXG
mapeieCLASS_OBJ
se ele existe, caso contrário, essechmod
comando não desativaria nenhuma entradaUSER
ouGROUP
controle 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
and
editados com as ACLs exigiriarwxrwxrwx
na 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
or
editados com as ACLs teria ochmod(…,000)
problema mencionado anteriormente.Leitura adicional
fonte
S_IRWXG
mais permissões. Ligue-me quando terminar.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.
fonte