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-datagrupo. Meu problema é que não consigo modificar ou substituir nenhum dos arquivos via SFTP que pertencem a ele www-data, mesmo que faça charlesrparte do www-datagrupo. 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-dataarquivos 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/wwwse tornam parte do www-datagrupo 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-datasignifica 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/wwwdevem pertencer aroot:webmasters - Todos os desenvolvedores devem ser membros do
webmastersgrupo - Todos os diretórios em
/var/wwwdevem ser configurados para:2775ouu=rwx,g=rwxs,o=rx(rwxrwx-rx) - Todos os arquivos
/var/wwwdevem ser definidos como:0664ouug=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/wwwlocalização de seus arquivos por padrão:
sudo addgroup webmasterssudo adduser $USER webmasterssudo chown -R root:webmasters /var/wwwsudo 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) aowebmastersgrupo. - altera o proprietário de
/var/wwwpararoote o grupo parawebmastersgrupo. - 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/wwwe 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 dowebmastersgrupo. Faça o mesmo para todos os outros diretórios que precisam ser graváveis.
/var/wwwsem também adicioná-lo a esse grupo?