Eu tenho um servidor bastante padrão configurado executando Apache e PHP. Um aplicativo que estou executando cria arquivos, que são de propriedade do usuário do Apache www-data
. Os arquivos que eu carrego via SFTP pertencem ao meu próprio usuário charlesr
. Todos os arquivos fazem parte do www-data
grupo. Meu problema é que não consigo modificar ou substituir nenhum dos arquivos via SFTP que pertencem a ele www-data
, mesmo que faça charlesr
parte do www-data
grupo. Posso modificar os arquivos sem problemas através de uma sessão SSH.
Então, eu não tenho certeza do que fazer. Como concedo minhas permissões de sessão SFTP para modificar www-data
arquivos de propriedade?
Para um pouco de plano de fundo, estas são as anotações que escrevi para mim ao configurar o servidor:
Now set up permissions on `/var/www` where your files are served from by
default:
$ sudo adduser $USER www-data
$ sudo chgrp -R www-data /var/www
$ sudo chmod -R g+rw /var/www
$ sudo chmod -R g+s /var/www
Now log out and log in again to make the changes take hold.
The previous set of commands does the following:
1. adds the current user ($USER) to the `www-data` group;
2. changes `/var/www` to belong to the `www-data` group;
3. adds read/write permissions to the group that `/var/www` belongs to;
4. sets the SGID bit on `/var/www`; this final point bears some explaining.
Depois, explico a mim mesmo o que significa definir o bit SGID (ou seja, todos os arquivos criados /var/www
se tornam parte do www-data
grupo automaticamente).
ATUALIZAR
Parece que o problema foi causado pelo próprio aplicativo ou, mais especificamente, pela estrutura do aplicativo ( Kohana ), configurando determinados arquivos gravados em 0644 (rw-r - r--); ou seja, não gravável em grupo. Isso, juntamente com o fato de os arquivos também pertencerem, www-data
significa que eu não poderia editar os arquivos via SFTP quando conectado como charlesr
. Não sei por que eu poderia editar os arquivos via SSH. Meu palpite é que eu devo ter usado o sudo.
Aqui está a estratégia de permissões que agora uso, graças à ajuda incansável de Marty Fried , que apontou as falhas na minha estratégia anterior e também me ajudou a marinar no mundo das permissões do Linux até que eu finalmente a entendi. Obrigado Marty!
visão global
- Arquivos e diretórios
/var/www
devem pertencer aroot:webmasters
- Todos os desenvolvedores devem ser membros do
webmasters
grupo - Todos os diretórios em
/var/www
devem ser configurados para:2775
ouu=rwx,g=rwxs,o=rx
(rwxrwx-rx) - Todos os arquivos
/var/www
devem ser definidos como:0664
ouug=rw,o=r
(rw-rw-r--)
O seguinte deve pertencer a www-data:webmasters
(ou seja, esses são os diretórios nos quais o Apache precisa poder gravar):
- aplicativo / cache
- aplicativo / logs
- Envio
- client_helpers / upload
COMO
Para configurar permissões sobre a /var/www
localização de seus arquivos por padrão:
sudo addgroup webmasters
sudo adduser $USER webmasters
sudo chown -R root:webmasters /var/www
sudo find /var/www -type f -exec chmod 664 {} \;
sudo find /var/www -type d -exec chmod 775 {} \;
sudo find /var/www -type d -exec chmod g+s {} \;
sudo chown -R www-data:webmasters application/cache/
[etc ...]
Agora efetue logout e logon novamente para que as alterações ocorram.
O conjunto anterior de comandos faz o seguinte:
- Crie um novo grupo chamado
webmasters
; todos os usuários que precisam de acesso de gravação aos arquivos do aplicativo serão adicionados a este grupo. - adiciona o usuário atual (
$USER
) aowebmasters
grupo. - altera o proprietário de
/var/www
pararoot
e o grupo parawebmasters
grupo. - adiciona 664 permissões (-rw-rw-r--) a todos os arquivos em
/var/www
. - adiciona 775 permissões (drwxrwxr-x) a todos os diretórios em
/var/www
. - define o bit SGID
/var/www
e todos os diretórios nele; este ponto final tem algumas explicações. Observe também que você também pode colocar um 2 na frente do seu chmod octal (por exemplo, 2644) para fazer a mesma coisa. - define o proprietário como
www-data
(usuário do Apache) e o grupo do diretório fornecido comowebmaster
. Isso garante que o diretório seja gravável pelo Apache e por qualquer pessoa dowebmasters
grupo. Faça o mesmo para todos os outros diretórios que precisam ser graváveis.
/var/www
sem também adicioná-lo a esse grupo?