Permissão SFTP negada em arquivos de propriedade da www-data

22

Eu tenho um servidor padrão que roda o Apache e o PHP. Um aplicativo que estou executando cria arquivos e estes são de propriedade do usuário do Apache www-data . Os arquivos que eu carrego via SFTP são de propriedade do meu próprio usuário charlesr . Todos os arquivos fazem parte do grupo www-data . Meu problema é que não posso modificar ou sobrescrever nenhum dos arquivos via SFTP que são de propriedade de www-data , mesmo que charlesr faça parte do grupo www-data . Eu posso modificar os arquivos sem problemas através de uma sessão SSH.

Não sei o que fazer. Como atribuo minhas permissões de sessão SFTP para modificar os arquivos www-data ?

Para um pouco de fundo, estas são as notas 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, passo a explicar a mim mesmo o que significa definir o bit SGID (ou seja, todos os arquivos criados em /var/www tornam-se parte do grupo www-data automaticamente).

UPDATE

Parece que o problema foi causado pelo próprio aplicativo ou, mais especificamente, a estrutura da aplicação ( Kohana ) definindo certos arquivos escreve para 0644 (rw-r - r--); isto é, não pode ser escrito em grupo. Isso, acoplado com o fato de que os arquivos também são de propriedade de www-data significava que eu Não foi possível editar os arquivos via SFTP quando efetuou login como charlesr . Eu não estou certeza porque eu poderia editar os arquivos via SSH. Meu palpite é que eu deve ter usado o sudo.

Aqui está a estratégia de permissões que uso agora 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 finalmente grokked isso. Obrigado Marty!

Visão geral

  • Arquivos e diretórios em /var/www devem pertencer a root:webmasters
  • Todos os desenvolvedores devem ser membros do grupo webmasters
  • Todos os diretórios em /var/www devem ser definidos como:   2775 ou u=rwx,g=rwxs,o=rx (rwxrwx-r-x)
  • Todos os arquivos em /var/www devem ser definidos como:   0664 ou ug=rw,o=r (rw-rw-r -)

Os seguintes itens devem pertencer a www-data:webmasters (ou seja, esses são os diretórios que o Apache precisa para gravar):

  • aplicativo / cache
  • aplicativo / logs
  • fazer upload
  • client_helpers / upload

HOWTO

Para configurar as permissões em /var/www de onde seus arquivos são exibidos por padrão:

  1. sudo addgroup webmasters
  2. sudo adduser $USER webmasters
  3. sudo chown -R root:webmasters /var/www
  4. sudo find /var/www -type f -exec chmod 664 {} \;
  5. sudo find /var/www -type d -exec chmod 775 {} \;
  6. sudo find /var/www -type d -exec chmod g+s {} \;
  7. sudo chown -R www-data:webmasters application/cache/ [etc ...]

Agora faça logout e faça login novamente para que as alterações sejam realizadas.

O conjunto anterior de comandos faz o seguinte:

  1. 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 esse grupo.
  2. adiciona o usuário atual ( $USER ) ao grupo webmasters .
  3. altera o proprietário de /var/www para root e o grupo para webmasters group.
  4. adiciona 664 permissões (-rw-rw-r--) a todos os arquivos em /var/www .
  5. adiciona 775 permissões (drwxrwxr-x) a todos os diretórios em /var/www .
  6. define o bit SGID em /var/www e todos os diretórios nele; este ponto final traz algumas explicações. Note também que você também pode colocar um 2 na frente do seu chmod octal (por exemplo, 2644) para fazer a mesma coisa.
  7. define o proprietário como www-data (usuário do Apache) e o grupo do diretório fornecido como webmaster . Isso garante que o diretório seja gravável pelo Apache e por qualquer pessoa no grupo webmasters . Faça o mesmo para todos os outros diretórios que precisam ser graváveis.
por Charles Roper 03.10.2012 / 21:00

2 respostas

10

O Ubuntu.com tem ótimos guias de servidor, como o Guia do Apache . Onde você conseguiu seus procedimentos que você tão cuidadosamente escreveu? Eu nunca precisei me preocupar tanto com nenhum dos servidores que configurei, embora esteja aberto à possibilidade de não ter feito tudo certo - também, na verdade, não tenho servidores qualquer coisa que seja muito pública ou muito grande, então pode haver falhas de segurança que eu não conheço.

No entanto, nunca precisei ser membro do grupo www-data e nenhum arquivo fonte em www é de propriedade da www-data. Meu entendimento é que isso é usado pelo Apache apenas para seus próprios arquivos, e não terá permissões de gravação para nenhum dos outros arquivos em si, porque, em teoria, nenhum arquivo importante permitirá que o www-data tenha permissão de gravação. Eu acho que os arquivos pertencentes a www-data dariam permissão somente leitura para todos os outros, e ninguém deveria ter permissão de escrita para seus arquivos. Eu poderia estar totalmente errado, é claro, e se eu for, espero que alguém me diga e me aponte para a documentação real que explica de forma diferente (não para algum fórum onde um usuário aleatório da internet como eu produziu instruções que funcionaram para ele).

Talvez eu esteja sentindo falta de algo, mas seu problema deve ser bastante direto. O usuário que está logado usando o sftp precisa ser um membro do grupo www-data, e os arquivos que você está tentando modificar devem ter permissões de gravação para o grupo www-data. Não faz sentido para mim que você possa modificar os arquivos usando ssh, mas não usando o sftp; Você tem certeza de que está fazendo login na mesma conta para ambos? No sftp, você pode inserir comandos como !groups para listar seus grupos ou !whoami para verificar o nome de login que você está usando. Os resultados devem corresponder ao que você vê usando ssh (com os mesmos comandos menos o ponto de exclamação).

Você também deve ser capaz de usar chmod, chown, chgrp do sftp se tiver permissão para fazer isso.

A propósito, acho que sua lista tem pelo menos um comando muito ruim:

sudo chmod -R g+rw /var/www

Isso dá ao mundo permissão de gravação para todos os arquivos e pastas em / var / www. Isso soa como uma má ideia. Normalmente, apenas o root tem permissão de gravação para esses diretórios, a menos que os específicos precisem de mais permissões, geralmente apenas diretórios únicos.

Nota: Este foi um erro da minha parte. Obrigado a DonalLafferty por apontar isto, que especifica "g", não "a", por isso só muda permissões de grupo. Meus olhos velhos e cansados (ou uma fonte ruim) devem ter lido como "a".

Edições para esclarecimento

Normalmente, os arquivos criados pelo Apache são somente leitura para o grupo www-data e todos os outros usuários, da mesma forma que os arquivos de propriedade da raiz em / var / www. Portanto, não deve haver motivo para tornar qualquer um membro do www-data. A questão é dar acesso a todos, o que é um caso diferente. Isso deve ser feito disponibilizando diretórios específicos dentro de seu site, e isso é feito simplesmente usando chmod, seja com sudo, já que provavelmente pertence a root, ou fazendo o dono e não usando sudo.

Se você tiver mais desenvolvedores que precisam acessar o site inteiro, é quando você deseja criar um grupo de usuários, como "webmasters", torná-lo o proprietário do site, conceder permissões de gravação a esse grupo e torná-lo todos os membros devs desse grupo. Então, a listagem dos diretórios do site seria algo como:

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

Mais edições

Desde então, percebi que você não precisa criar um usuário "webmasters", apenas um grupo. Em seguida, os arquivos podem ser de propriedade de root: webmasters, ou seja, root é o proprietário, mas os webmasters são o grupo.

Em resposta às perguntas abaixo, os arquivos que o Apache escreve serão de propriedade da www-data e do grupo www-data. Esses arquivos normalmente não são algo para o qual você escreve, portanto, os não-membros do www-data podem ter acesso somente leitura - acho que depende das permissões do diretório. Se você precisar de mais do que o acesso ocasional à gravação, adicionar-se ao grupo pode ser útil. Geralmente, você torna o mundo dos diretórios específicos gravável para o conteúdo salvo pelo Apache. Considere também que a maioria dos sites compartilhados que executam o Apache sem acesso ao shell não teria nem mesmo uma maneira de configurar grupos.

Mas o Apache pode ler arquivos que são de propriedade do root. Quase todos os arquivos têm acesso legível ao mundo, mas não são graváveis. Então, a menos que você queira mudar isso, o Apache não precisa estar no grupo de webmasters.

Esta é toda a configuração básica do Linux, não realmente o Apache. O Apache só se preocupa com o acesso de dentro do servidor da web, e isso é definido pelos arquivos de configuração. Por esta razão, o link da documentação do Ubuntu que eu incluí no meu post deve ser considerado uma fonte melhor do que um wiki público.

A propósito, o O'Reilly Apache Cookbook diz que "diretórios de documentos, como htdocs, cgi-bin e ícones, terão que ter permissões definidas de uma maneira que mais sentido para o modelo de desenvolvimento do seu site em particular, mas sob nenhuma circunstância qualquer desses diretórios ou arquivos contidos neles deve ser gravável pelo usuário do servidor web. "

Por fim, o uso de ACLs é uma boa maneira de definir permissões de arquivos se você precisar de mais controle. Pode até ser uma boa maneira de defini-los o tempo todo, e é algo que eu deveria investigar.

    
por Marty Fried 06.10.2012 / 02:16
6

Eu notei que você não usou chown .

Para definir corretamente a propriedade dos arquivos / pastas, você pode definir o diretório inteiro desta maneira: chown -R www-data:www-data

Isso define a propriedade para o grupo www-data e usuário www-data

Além disso, você pode fazer isso como uma solução temporária:

chmod 777 /var/data/<filename> ou chmod 777 /var/data/<foldername>

edite o (s) arquivo (s) conforme necessário, então

chmod 644 /var/data/<filename> ou chmod 755 /var/data/<foldername>

Tenha cuidado ao usar a opção "-R", pois ela também altera as permissões de todos os arquivos e subpastas.

664 são as permissões de arquivo padrão do Apache e 755 as permissões de pasta padrão.

Espero que isso ajude:)

Estrela

    
por StarBlessed 03.10.2012 / 22:02