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

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

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

Com base em algumas outras respostas neste site, tentei usar setfacl para definir permissões padrão, mas parece não funcionar - getfacl indica que as permissões existem, mas o Dokuwiki não será executado 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 usei para definir as permissões:

setfacl -R -d -m u:www-data:7 /var/www/*

Responder1

Problema nº 1: Rsync está descartando ACLs

Depois de aplicar as permissões ACL, você precisa tomar cuidado para que, ao executar o procedimento, rsyncesteja usando a opção -Aou --acls. Isso instrui você rsynca preservá-los ao fazer a sincronização.

trecho da página de manual do rsync

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

Problema nº 2: sem permissões ACL

Observando seu exemplo, ele contém as permissões a seguir.

permanentes 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 servem para a criação de novos objetos e não funcionam exatamente como você pensa. Você ainda precisa criar uma entrada para o usuário www-dataalém das permissões 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

Um experimento

Agora vamos tentar gravar um arquivo no datadiretório como user gopher.

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

Parece familiar?

Adicionando permissões ACL adicionais

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

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

Agora verifique o datadiretório novamente:

$ 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 gophertem rwxacesso:

user:gopher:rwx

Repita o experimento

Tente gravar 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

informação relacionada