As ACL Posix são a única maneira elegante de fazer isso, é assim que eu lido com conflitos de recursos compartilhados de leitura / gravação, particularmente em sistemas baseados na web. Aqui está um exemplo em execução.
No meu exemplo, tenho um diretório chamado /var/www/html/share
.
Além disso, tenho os usuários alice
, bob
, deploy
e bower
Primeiro, criei um grupo chamado html
e adicionei os usuários a esse grupo.
groupadd html
for i in alice bob deploy bower; do usermod -a -G html $user; done
Agora, adicionei um arquivo ACL contra esse grupo html
nessa pasta.
setfacl -m g:html:rwx /var/www/html/share
setfacl -d -m g:html:rwx /var/www/html/share
O segundo comando é importante, faz com que a herança ocorra.
Agora, podemos testar o comportamento disso.
# for user in alice bob bower deploy; do \
sudo -u $user touch "/var/www/html/share/file_${user}" \
done
[root@localhost html]# ls -l /var/www/html/share/
total 0
-rw-rw-r--+ 1 alice alice 0 May 13 23:08 file_alice
-rw-rw-r--+ 1 bob bob 0 May 13 23:08 file_bob
-rw-rw-r--+ 1 bower bower 0 May 13 23:08 file_bower
-rw-rw-r--+ 1 deploy deploy 0 May 13 23:08 file_deploy
[root@localhost html]#
À primeira vista, parece que as propriedades dos arquivos são simples e não permitem que um usuário interaja com outro. No entanto, podemos inspecionar o ACL usando getfacl
, o que mostra mais informações.
# getfacl file_Al
getfacl: file_Al: No such file or directory
[root@localhost share]# getfacl file_alice
# file: file_alice
# owner: alice
# group: alice
user::rw-
group::r-x #effective:r--
group:html:rwx #effective:rw-
mask::rw-
other::r--
Você pode ver que o grupo html
tem controle sobre esses arquivos.
Observação: a permissão GROUP unix padrão indica a máscara contra as permissões. Como é rw
para arquivos, também é efetivamente rw
para a ACL, apesar da permissão real concedida ser rwx
.
Permite que outros usuários possam modificar / excluir esses arquivos.
# sudo -u alice /bin/bash
[alice@localhost share]$ pwd
/var/www/html/share
[alice@localhost share]$ echo "hello world" >>file_alice
[alice@localhost share]$ echo "hello world" >>file_bob
[alice@localhost share]$ echo "hello world" >>file_deploy
[alice@localhost share]$ echo "hello world" >>file_bower
[alice@localhost share]$ ll
total 16
-rw-rw-r--+ 1 alice alice 12 May 13 23:15 file_alice
-rw-rw-r--+ 1 bob bob 12 May 13 23:15 file_bob
-rw-rw-r--+ 1 bower bower 12 May 13 23:15 file_bower
-rw-rw-r--+ 1 deploy deploy 12 May 13 23:15 file_deploy
[alice@localhost share]$ rm file_deploy
Finalmente, o pouco complicado. O que acontece quando Alice cria um diretório?
[alice@localhost share]$ mkdir dir_alice;
[alice@localhost share]$ ls -l
total 12
drwxrwxr-x+ 1 alice alice 0 May 13 23:16 dir_alice
-rw-rw-r--+ 1 alice alice 12 May 13 23:15 file_alice
-rw-rw-r--+ 1 bob bob 12 May 13 23:15 file_bob
-rw-rw-r--+ 1 bower bower 12 May 13 23:15 file_bower
[alice@localhost share]$ getfacl dir_alice
# file: dir_alice
# owner: alice
# group: alice
user::rwx
group::r-x
group:html:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:html:rwx
default:mask::rwx
default:other::r-x
Como passamos -d
para setfacl
, ele instrui os novos diretórios a também herdarem (e aplicar essa herança a outros subdiretórios). Então, agora como usuário deploy
, podemos adicionar e editar arquivos existentes dentro desse novo subdiretório.
[alice@localhost share]$ touch dir_alice/file_indir_alice
[alice@localhost share]$ exit
exit
# sudo -u deploy /bin/bash
[deploy@localhost share]$ cd /var/www/html/share/dir_alice/
[deploy@localhost dir_alice]$ touch file_indir_deploy
[deploy@localhost dir_alice]$ rm file_indir_alice
[deploy@localhost dir_alice]$