Permissão SFTP negada em arquivos pertencentes a www-data

23

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: 2775ou u=rwx,g=rwxs,o=rx(rwxrwx-rx)
  • Todos os arquivos /var/wwwdevem ser definidos como: 0664ou ug=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:

  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 efetue logout e logon novamente para que as alterações ocorram.

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 este grupo.
  2. adiciona o usuário atual ( $USER) ao webmastersgrupo.
  3. altera o proprietário de /var/wwwpara roote o grupo para webmastersgrupo.
  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 /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.
  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 do webmastersgrupo. Faça o mesmo para todos os outros diretórios que precisam ser graváveis.
Charles Roper
fonte

Respostas:

10

O Ubuntu.com possui guias de servidor muito bons, como o guia Apache . Onde você conseguiu seus procedimentos que anotou com tanto cuidado? Eu nunca tive tanto trabalho com qualquer um dos servidores que configurei, embora esteja aberto à possibilidade de não estar fazendo o certo - além disso, na verdade, não instalei servidores para qualquer coisa que seja muito pública ou muito grande, para que possa haver falhas de segurança que eu não conheça.

No entanto, nunca precisei ser membro do grupo www-data e nenhum arquivo de origem em www pertence a 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, porque, em teoria, nenhum arquivo importante permitirá que www-data tenha permissão de gravação. Eu acho que os arquivos pertencentes ao www-data dariam permissão somente leitura a todos os outros, e ninguém deveria ter permissão de gravação em seus arquivos. Eu posso estar totalmente errado, é claro, e se estiver, espero que alguém me diga e me indique uma documentação real que explique de maneira diferente (não em algum fórum em que um usuário aleatório da Internet como eu tenha produzido instruções que funcionaram para ele).

Talvez esteja faltando alguma coisa, mas seu problema deve ser bastante direto. O usuário que está conectado usando sftp precisa ser 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 sftp; Tem certeza de que está fazendo login na mesma conta para ambos? No sftp, você pode inserir comandos como !groupslistar seus grupos ou !whoamiverificar qual nome de login 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 poder usar chmod, chown, chgrp do sftp se tiver permissão para fazê-lo.

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 parece 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ão, geralmente apenas diretórios únicos.

Nota: Este foi um erro da minha parte. Obrigado a DonalLafferty por apontar isso, que especifica "g", não "a", portanto, apenas altera as permissões de grupo. Meus velhos olhos cansados ​​(ou uma fonte ruim) devem tê-lo lido como "a".

Edições para esclarecimentos

Normalmente, os arquivos criados pelo Apache são somente leitura para o grupo www-data e todos os outros usuários, iguais aos arquivos de propriedade raiz em / var / www. Portanto, não deve haver razão para tornar alguém membro do www-data. A questão está dando a todos acesso de gravação, o que é um caso diferente. Isso deve ser feito disponibilizando diretórios específicos em seu site, e isso é simplesmente usando chmod, seja com sudo, já que provavelmente pertence ao root, ou tornando o proprietário você mesmo e não usando o sudo.

Se você tiver mais desenvolvedores que precisam acessar todo o site, ou seja, quando desejar criar um usuário + grupo como "webmasters", torne-o o proprietário do site, conceda permissões de gravação a esse grupo e faça com que todos os membros sejam desenvolvedores desse grupo. Portanto, a lista para os diretórios do site seria algo como:

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

Mais edições

Desde então, percebi que você realmente 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 webmasters é o grupo.

Em resposta às perguntas abaixo, os arquivos que o Apache grava serão de propriedade de www-data e agruparão 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 acesso ocasional de gravação, adicionar-se ao grupo pode ser útil. Geralmente, você torna os diretórios específicos graváveis ​​mundialmente para o conteúdo salvo pelo Apache. Considere também que a maioria das hospedagem compartilhada da Web executando o Apache sem acesso ao shell nem sequer teria uma maneira de configurar grupos.

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

Essa é toda a configuração básica do Linux, não o Apache. O Apache se preocupa apenas com o acesso a partir do servidor da web, e isso é definido pelos arquivos de configuração. Por esse motivo, o link de documentação do Ubuntu que incluí na minha postagem deve ser considerado uma fonte melhor do que um wiki público.

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

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

Marty Fried
fonte
Oi @ marty-fried, obrigado pela resposta, isso me dá muito para experimentar. Ré. suas perguntas. Reuni as informações de várias fontes (por isso, escrevi no meu guia de uso próprio) e não consigo me lembrar da fonte exata. Embora eu não tenha usado essa fonte em particular (solução 1) (apenas a encontrei), ela fornece uma boa justificativa para minha decisão. No guia do Apache que você menciona, ele recomenda a criação de um grupo chamado 'webmasters', mas se eu fizesse isso, como o Apache escreveria no /var/wwwsem também adicioná-lo a esse grupo?
Charles Roper
E eu não preciso dar a outros usuários acesso a /var/wwwentão eu pensei que dar acesso ao grupo para www-datae fazer a todos um membro desse grupo seria uma boa solução. Agora eu posso ver o problema do Apache sobrescrever qualquer arquivo lá. Dado que apenas 2 desenvolvedores (incluindo eu) têm acesso ao código, é relativamente seguro a curto prazo.
Charles Roper
1
Obrigado Marty. Esta parte do Apache Cookbook me fez rir: "Você deve estar ciente de que, se você pedir a 12 pessoas as maneiras corretas de definir permissões de arquivo no servidor Apache, receberá uma dúzia de respostas diferentes". Você me deu quase tudo o que preciso para progredir agora. Muito obrigado pelo seu tempo. :-)
Charles Roper
1
Também aprendi um pouco, e é por isso que gosto de discussões aprofundadas - geralmente isso ajuda a esclarecer algumas das partes nebulosas. Sou principalmente um programador que é solicitado a corrigir problemas e configurar sites, por isso estou sempre aprendendo maneiras melhores de fazer as coisas. Sinta-se livre para perguntar se existem outras perguntas.
Marty Fried
1
AFAIK, sudo chmod -R g + rw / var / www fornece acesso ao 'grupo'. Use 'a + rw' para acesso ao mundo.
Donal Lafferty
7

Notei que você não tinha usado chown.

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

Isso define a propriedade como grupo www-datae usuáriowww-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 e

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

Tenha cuidado ao usar a opção "-R", pois ela altera as permissões de todos os subarquivos e pastas.

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

Espero que isto ajude :)

Estrela

StarBlessed
fonte
Olá, obrigado por responder, é muito apreciado. No entanto, isso realmente não ajuda. A seleção dos arquivos torna TODOS eles inalteráveis ​​ao usar o SFTP (é exatamente o oposto do que estou procurando!). Não posso realmente usar a solução alternativa chmod porque a) não tenho permissões para chmod no SFTP; b) Eu realmente não quero fazer login via SSH, alterar permissões, fazer meu SFTPing, alterar novamente, etc .; ec) alguns arquivos têm permissões diferentes por razões de segurança, portanto não posso chmod em massa de qualquer maneira.
Charles Roper
O que é /var/data? Além disso, qual diretório você está sugerindo que ele use o comando chown -R www-data:www-data? Espero que não /var/www.
Marty Fried