Há definitivamente falta de documentação sobre isso. Pelo que posso dizer, com base em minha própria experiência, é isso:
setfacl
faz nada além de adicionar, modificar ou remover uma entrada de controle de acesso (ACE) para uma determinada lista de controle de acesso (ACL). Nenhuma outra ACE em qualquer outra ACL é afetada, mesmo que algumas dessas ACEs tenham sido herdadas da ACE que foi alterada. Essas outras ACEs "herdadas" permanecem inalteradas.
Uma ACE é herdada apenas no momento em que o arquivo ou diretório que a herda é criado .
Isso significa que, se você for modificar uma ACE com os bits de herança f
ou d
definido, será responsável por "propagar" manualmente essa alteração para qualquer coisa herdada anteriormente dela SE FOR O COMPORTAMENTO QUE VOCÊ QUER. Em alguns casos, pode não ser, o que provavelmente é o motivo pelo qual o FreeBSD não faz isso automaticamente para você.
Por exemplo:
mkdir -p test_dir
getfacl test_dir
# file: test_dir
# owner: root
# group: wheel
# owner@:rwxp--aARWcCos:-------:allow
# group@:r-x---a-R-c--s:-------:allow
# everyone@:r-x---a-R-c--s:-------:allow
setfacl -m g:staff:read_set:fd:allow test_dir # <- CREATE NEW ACE
getfacl test_dir
# file: test_dir
# owner: root
# group: wheel
# group:staff:r-----a-R-c---:fd-----:allow <- NEW INHERITING ACE
# owner@:rwxp--aARWcCos:-------:allow
# group@:r-x---a-R-c--s:-------:allow
# everyone@:r-x---a-R-c--s:-------:allow
mkdir -p test_dir/child_dir
getfacl test_dir/child_dir
# file: test_dir/child_dir
# owner: root
# group: wheel
# group:staff:r-----a-R-c---:fd----I:allow <- NEW ACE INHERITED ON CREATE
# owner@:rwxp--aARWcCos:-------:allow
# group@:r-x---a-R-c--s:-------:allow
# everyone@:r-x---a-R-c--s:-------:allow
touch test_dir/child_file
getfacl test_dir/child_file
# file: test_dir/child_file
# owner: root
# group: wheel
# group:staff:r-----a-R-c---:------I:allow <- NEW ACE INHERITED ON CREATE
# owner@:rw-p--aARWcCos:-------:allow
# group@:r-----a-R-c--s:-------:allow
# everyone@:r-----a-R-c--s:-------:allow
setfacl -m g:staff:full_set:fd:allow test_dir # <- MODIFY ACE
getfacl test_dir
# file: test_dir
# owner: root
# group: wheel
# group:staff:rwxpDdaARWcCos:fd-----:allow <- MODIFIED INHERITING ACE
# owner@:rwxp--aARWcCos:-------:allow
# group@:r-x---a-R-c--s:-------:allow
# everyone@:r-x---a-R-c--s:-------:allow
getfacl test_dir/child_dir
# file: test_dir/child_dir
# owner: root
# group: wheel
# group:staff:r-----a-R-c---:fd----I:allow <- DID NOT CHANGE
# owner@:rwxp--aARWcCos:-------:allow
# group@:r-x---a-R-c--s:-------:allow
# everyone@:r-x---a-R-c--s:-------:allow
getfacl test_dir/child_file
# file: test_dir/child_file
# owner: root
# group: wheel
# group:staff:r-----a-R-c---:------I:allow <- DID NOT CHANGE
# owner@:rw-p--aARWcCos:-------:allow
# group@:r-----a-R-c--s:-------:allow
# everyone@:r-----a-R-c--s:-------:allow
# MODIFY INHERITED ACEs TO MATCH MODIFIED INHERITING ACE
setfacl -m g:staff:full_set:fdI:allow test_dir/child_dir
setfacl -m g:staff:full_set:I:allow test_dir/child_file
Então, para responder às suas perguntas:
-
setfacl
não propaga nenhuma alteração para as ACEs herdadas existentes. - O FreeBSD não recalcula nada na hora.
- As premissions tornam-se efetivas somente depois de serem definidas manualmente.
- Não, você não precisa explicitar isso. Em seu cenário, você provavelmente deseja atualizar as ACEs herdadas existentes (aquelas com o conjunto de sinalizadores
I
) com as mesmas modificações feitas na ACE herdada.
Dois problemas relevantes do FreeBSD que você pode querer assistir: