Protegendo o diretório www no Ubuntu / Apache sem restringir o acesso a quem precisa dele?

1

Estou configurando um servidor web Apache2 / Ubuntu e estou preso em como alcançar as configurações de segurança que eu preciso.

Na pasta www - a raiz da web - meu grupo www-data (a conta apache e PHP) precisa ter permissões limitadas para evitar que scripts em execução no Apache modifiquem ou excluam arquivos sem explícito permissão. No entanto, os usuários que se conectam usando WinSCP ou similares para transferir seus arquivos para a pasta www precisam ter permissões completas para que possam copiar arquivos para a raiz da web e remover arquivos antigos, etc.

O ideal é que eu parecesse precisar de um grupo - www-data - com permissões limitadas para o servidor operar e um grupo - digamos, "webdevelopers" para conter qualquer pessoa trabalhando em projetos da web - com permissões completas na pasta www .

Aqueles que configuram servidores web regularmente - podem me avisar como você protege a raiz da sua web corretamente, permitindo que os desenvolvedores adicionem e removam arquivos conforme necessário?

    
por Ambulare 25.09.2014 / 17:37

1 resposta

3

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.

    
por 25.09.2014 / 18:44