Usando setfacl para criar permissões recursivas para o Apache com rsync

7

Eu tenho uma instalação do Dokuwiki localmente, a qual sincronizo regularmente com meu servidor com o rsync. Também vou dar a um amigo meu uma conta ssh e hospedar sua instalação pública do Dokuwiki. No entanto, estou tendo um problema com permissões de acesso - mesmo que o espelho seja somente leitura, o Dokuwiki ainda precisa de permissões de gravação para o diretório de dados para cache etc. O servidor Apache é executado como usuário www-data e toda vez que faço isso um rsync, redefine as permissões.

Baseado em algumas outras respostas neste site, eu tentei usar setfacl para definir permissões padrão, mas parece que não funciona - getfacl indica que as permissões existem, mas o Dokuwiki não roda, e quando tento escrever um arquivo como usuário www-data, também não funciona. O que estou perdendo?

wiki/data$ sudo su www-data
$ pwd
/var/www/wiki/data
$ whoami
www-data
$ touch hi
touch: cannot touch 'hi': Permission denied
$ getfacl /var/www/wiki/data
getfacl: Removing leading '/' from absolute path names
# file: var/www/wiki/data
# owner: stian
# group: admin
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:www-data:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

Aqui está o comando que eu usei para definir as permissões:

setfacl -R -d -m u:www-data:7 /var/www/*
    
por Stian Håklev 07.10.2013 / 01:10

1 resposta

3

Problema nº 1: o Rsync está descartando ACLs

Depois de aplicar as permissões de ACL, você precisa ter o cuidado de, quando executar o rsync , usar a opção -A ou --acls . Isso instrui rsync a ter certeza de preservá-los ao fazer a sincronização.

excerto da página de manual do rsync

    -A, --acls                  preserve ACLs (implies -p)

Problema nº 2: sem permissões de ACL

Ao analisar seu exemplo, ele contém permissões da seguinte forma.

perms tradicionais

# owner: stian
# group: admin
user::rwx
group::r-x
other::r-x

ACLs

default:user::rwx
default:user:www-data:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

Mas essas ACLs são para a criação de novos objetos e não funcionam exatamente da maneira que você pensa. Você precisa ainda criar uma entrada para o usuário www-data além dos perms padrão da ACL.

Exemplo

$ pwd
/tmp/somedir

$ mkdir data
$ setfacl -R -d -m u:gopher:7 data

$ getfacl data
# file: data
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:gopher:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

Uma experiência

Agora vamos tentar escrever um arquivo no diretório data como usuário gopher .

$ sudo -u gopher touch /tmp/somedir/data/afile
touch: cannot touch '/tmp/somedir/data/afile': Permission denied

Parece familiar?

Adicionando permissões adicionais de ACL

É porque você precisa adicionar uma ACL para o usuário www-data , as regras padrão não são para acesso, elas são para criar novos arquivos / diretórios.

$ setfacl -R -m u:gopher:7 data

Agora, verifique novamente o diretório data :

$ getfacl data
# file: data
# owner: root
# group: root
user::rwx
user:gopher:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:gopher:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

A única diferença é que agora temos uma ACL dizendo que o usuário gopher tem rwx access:

user:gopher:rwx

Repita a experiência

Tente gravar os dados no diretório novamente:

$ sudo -u gopher touch /tmp/somedir/data/afile
$

Funcionou !!! Verifique novamente o arquivo resultante:

$ ls -l /tmp/somedir/data/afile
-rw-rw-r--+ 1 gopher gopher 0 Oct  7 21:36 /tmp/somedir/data/afile
    
por 07.10.2013 / 01:47