De o padrão :
In words, Common Access Determination Algorithm is to be interpreted as follows (this description is a loose paraphrase of the common access determination algorithm which is specified in detailed pseudocode in ACL Managers ):
Match (in the sense defined in the pseudocode in ACL Managers ) the incoming PAC against the ACL's access ACLEs (in the top-to-bottom order shown, namely: UO, U, FU, GO/G/FG, O, FO, AO), stopping at the first such match (except that all matches are considered "simultaneously" in the case of the indicated group-like ACLEs), and note the permissions granted by the matched ACLE (or, in the case of the group-like ACLEs, the union of the permissions granted by all the matched ACLEs).
Mask (that is, intersect) the acquired permissions against the permissions in the ACL's mask ACLEs, as necessary (namely, mask with MASK_OBJ permissions if the match occurred in the center column1, and/or mask with UNAUTHENTICATED permissions if the PAC is unauthenticated). (If the ACL Manager doesn't support these two mask ACLEs, this step is a null operation.)
(ênfase no original, nota de rodapé adicionada)
Ou seja, se houver um arquivo com usuário e grupo root
e permissões 0600
chamado acl-test
, contendo a única linha read possible
, então:
$ getfacl acl-test
# file acl-test
# owner: root
# group: root
user::rw-
group::---
other::---
Agora, se eu (como usuário fox
) tentar cat
this:
$ cat acl-test
cat: acl-test: Permission denied
Permissões de grupo são unidas
Por acaso, estou nos grupos users
e wheel
, por isso podemos adicionar ACLs específicas para esses grupos:
# setfacl -m g:users:--- -m g:wheel:r-- acl-test
$ cat acl-test
read possible
Isso ocorre porque as entradas group
(consideradas simultaneamente) permitem permissão de leitura para um dos meus grupos. Estes podem ser combinados:
# setfacl -m g:users:-w- acl-test
$ getfacl acl-test
# file: acl-test
# owner: root
# group: root
user::rw-
group::---
group:wheel:r--
group:users:-w-
mask::rw-
other::---
$ printf '%s\n' 'write possible' >> acl-test
$ cat acl-test
read possible
write possible
Agora, posso ler e gravar o arquivo, mesmo que os grupos que permitem essas permissões não sejam do mesmo grupo.
Permissões específicas do usuário substituem todos os grupos
Como as regras do usuário se aplicam antes das regras do grupo, ainda podemos restringir um determinado usuário de ler e / ou escrever o conteúdo:
# setfacl -m u:fox:--- acl-test
$ getfacl acl-test
# file: acl-test
# owner: root
# group: root
user::rw-
user:fox:---
group::---
group:wheel:r--
group:users:-w-
mask::rw-
other::---
$ cat acl-test
cat: acl-test: Permission denied
Uma máscara, se configurada, substitui quase tudo
Se um arquivo for realmente de leitura para qualquer pessoa, exceto o proprietário:
# setfacl -x u:fox -m g::rw- -m m:r-- acl-test
$ getfacl acl-test
# file: acl-test
# owner: root
# group: root
user::rw-
group::rw- #effective:r--
group:wheel:r--
group:users:-w- #effective:---
mask::r--
other::---
$ printf '%s\n' 'now writing is impossible' >> acl-test
bash: acl-test: Permission denied
# printf '%s\n' 'owner can still write' >> acl-test
Curiosamente, a máscara não substitui as permissões outras , portanto:
# setfacl -x g:users -x g:wheel -m o:rw- -n acl-test
$ getfacl acl-test
# file: acl-test
# owner: root
# group: root
user::rw-
group::rw- #effective:r--
mask::r--
other::rw-
$ printf '%s\n' 'others can write now' >> acl-test
# chown :users acl-test
$ printf '%s\n' 'but not members of the owning group' >> acl-test
bash: acl-test: Permission denied
1 A "coluna central" refere-se a esta imagem e contém tudo, exceto UO e O, para que o usuário proprietário e outros não sejam afetados por uma máscara. Todos os grupos e usuários não proprietários com regras definidas são afetados.