Seus scripts apache e PHP devem estar em execução no mesmo usuário.
Uma idéia que você pode criar (é a idéia da GarethTheRed) é criar um grupo www-devs
que contenha seus desenvolvedores, alterar a propriedade de /www-data
para apache:www-devs
e definir o modo como 0570
.
Isso fará com que o servidor da Web consiga ler o diretório, mas não possa escrevê-lo. Os membros do grupo www-devs
poderão escrever.
No entanto, isso tem um grande problema, novos arquivos adicionados por seus desenvolvedores serão de propriedade dos desenvolvedores. O Apache não será nem o proprietário desses arquivos nem o grupo que os possui. Assim, o apache não poderá lê-los.
A melhor solução é usar as ACLs do sistema de arquivos. Você pode usar ACLs para adicionar vários grupos diferentes com permissões diferentes. Você também pode definir novos arquivos para herdar essas permissões.
groupadd www-devs
setfacl -R -d -m g:www-devs:rwX -m g:www:r-X /www-data
setfacl -R -m g:www-devs:rwX -m g:www:r-X /www-data
A primeira linha setfacl
configura as permissões padrão para qualquer novo arquivo criado. A segunda linha setfacl
configura as permissões nos arquivos existentes.
As permissões acabam ficando assim:
$ getfacl --all-effective /www-data
getfacl: Removing leading '/' from absolute path names
# file: www-data
# owner: apache
# group: www
user::r-x
group::r-x #effective:r-x
group:www:r-x #effective:r-x
group:www-devs:rwx #effective:rwx
mask::rwx
other::---
default:user::rwx
default:group::rwx #effective:rwx
default:group:www:r-x #effective:r-x
default:group:www-devs:rwx #effective:rwx
default:mask::rwx
default:other::rwx
Isso mostra que o grupo www
só leu & executar permissões, enquanto www-dev
leu write & executar.
Vamos tentar criar um arquivo:
$ touch /www-data/foo
$ getfacl --all-effective /www-data/foo
getfacl: Removing leading '/' from absolute path names
# file: www-data/foo
# owner: root
# group: root
user::rw-
group::rwx #effective:rw-
group:www:r-x #effective:r--
group:www-devs:rwx #effective:rw-
mask::rw-
other::rw-
Isso mostra que no arquivo recém-criado, www
tem apenas acesso de leitura, enquanto www-devs
leu e gravou. Note que eu corri o comando touch
como root, então root é quem realmente possui o arquivo. Mas por causa da ACL, isso não afeta o que os grupos www
e www-data
podem fazer com o arquivo.