Resumindo : é seguro conceder acesso root (usuário) a www-data?
Declaração mais longa : como muitas perguntas feitas sobre isso usando chmod g + s , POSIX ACLs e outros sites umask quanto à maneira apropriada de conceder privilégios para / var / www / html etc, mas o meu é um pouco diferente, e tudo que eu tentei não faz t parecem resolver o problema.
/ var / www / project / html < - contém todos os arquivos baseados na web
/ var / www / project / log < - contém todos os registros baseados em projetos
Eu também tenho crontab configurado para o usuário root para manutenção etc. Dentro desses scripts de manutenção (principalmente PHP para que eu possa usar minha biblioteca de funções comuns), eu tenho os resultados também canalizados para a pasta de log, sob o mesmo arquivo de log do dia, alguns scripts são executados uma vez por dia, outros (podem) executar a cada minuto.
Ao trazer meu aplicativo para cima (através do Vagrant), eu o deixo por alguns minutos (para que meus trabalhos cron possam postar no arquivo de log) e, em seguida, eu faço o login no aplicativo. Imediatamente recebo um erro ao gravar no arquivo de log de dias. Após a verificação, com certeza ele é de root: root - claro, as tarefas do cron criaram (se já não existissem) ...
Mas ! Como parte do script de instalação na criação do aplicativo, executo o seguinte no final:
chown -R www-data:www-data /var/www/project
chmod -R 775 /var/www/project
chmod g+s /var/www/project
... após o qual meu servidor é reinicializado (o nome do host também é alterado antes da reinicialização).
(Por favor, note: eu também tentei o acima com um trailing /)
Meu entendimento do último comando ("g + s") é que qualquer novo arquivo criado sob essa pasta adotaria as permissões da pasta pai. Esse obviamente não é o caso, já que o root está criando o arquivo e suas permissões são root: root.
Executando vários "ls -l" que eu vejo (removendo tamanho do arquivo, timestamps etc):
/var/www # ls -l
drwxrwsr-- www-data www-data project
/var/www # cd project
/var/www/project # ls -l
drwxrwsr-- www-data www-data html
drwxrwsr-- www-data www-data log
/var/www/project # cd log
/var/www/project/log # ls -l
-rw-r--r-- root root 170309.log
Então ... eu apago esse arquivo de log e repito os comandos chown, chmod e chmod g + s para ver se foi a reinicialização, ou mudança de nome de host, que está me jogando fora ... e com certeza, minha manutenção O script cria o arquivo de log mais uma vez, com privilégios root: root.
Se eu deixar o arquivo lá e repetir os comandos, obtenho o resultado que estava procurando:
/var/www/project/log # ls -l
-rwxrwxr-- 2 www-data www-data 170309.log
No entanto, não terei necessariamente a opção de aplicar esses comandos depois que o sistema for reinicializado, e tenho certeza de que no dia seguinte, eu terei os mesmos problemas que o arquivo de log será diferente e meu script de manutenção vai criá-lo primeiro.
AFAICS, tenho algumas soluções:
- Quando a função que cria o arquivo de log (seja através do trabalho cron ou através do aplicativo), eu verifico se ele já existe e se não existe, crie-o e, em seguida, "chown www-data: www- data todaysLogFile "e depois" chmod 774 "depois ... uma solução alternativa talvez, em vez de uma solução
- adicionar raiz ao grupo de dados www (algum problema de segurança potencial? ajudaria?)
- use ACLs POSIX
Estou realmente atrás de uma solução sólida aqui, em vez de hacks ou work-arounds. Eu sei que não sou o único a fazer isso, mas tem que ser mais fácil !!! : O)