Apache com problema de permissão chmod e usuario possivelmente errado

Iniciado por _ubuntu_, 23 de Março de 2015, 21:20

tópico anterior - próximo tópico

_ubuntu_

Olá galera, é o seguinte, estou com um problema, que esta fritando minha mente, eu nunca havia passado por isso antes.
Sem mais delongas...

apache instalado
php5 instalado

pasta do apache: /var/www/html

Esta ocorrendo o seguinte, criando-se uma pagina com nome teste.php e nessa pagina eu crio um simples script utilizando-se 'fopen' para criar um arquivo arquivo.txt, esse arquivo então é gerado com dono root e permissão 0644.
Certo, o problema é que se eu quiser gravar algo dentro desse arquivo, o linux não permite, pois o usuario do apache é www-data. Sendo assim o usuario www-data não tem permissão para escrever em um arquivo que foi criado pelo root com permissão 644.


Mas não basta eu dar um chmod 777 no arquivo.txt, pois isso foi apenas um exemplo, e é gerado varios e varios arquivos pelo site em questão, é não é possivel, eu ficar toda hora entrando no servidor somente para adicionar permissão 777, ou então para usar um chown www-data arquivo.txt.

Acredito que exista duas possiveis soluções:
1 - fazer com que o arquivo gerado receba como dono padrão www-data por padrão
2 - fazer com que o arquivo gerado, seja com permissão 777 por padrão

Obs: tudo que o apache faz, por exemplo um upload e uma imagem JPG, ele upa essa imagem como nomeImagem.jpg com permissão 644 e o dono root. sendo assim tambem não é possivel manipular essa imagem após seu upload.


Alguém, uma luz?

Felix

1. nunca, nunca, NUNCA dê permissões 777 - é um erro gravíssimo de segurança
2. você pode adicionar o usuário root no grupo www-data (uma das alternativas)
3. você pode adicionar seu próprio usuário no grupo www-data e torná-lo também propriertário da pasta /var/www/html (outra alternativa)

_ubuntu_

Citação de: Felix online 24 de Março de 2015, 08:26
1. nunca, nunca, NUNCA dê permissões 777 - é um erro gravíssimo de segurança
2. você pode adicionar o usuário root no grupo www-data (uma das alternativas)
3. você pode adicionar seu próprio usuário no grupo www-data e torná-lo também propriertário da pasta /var/www/html (outra alternativa)

O apache, ao axecutar o script dentro do PHP, ele gera um arquivo TESTE.TXT com dono ROOT e com o grupo EMPRESA.
com chmod 644.
E mesmo que eu adicione o root no grupo www-data ele não vai conseguir editar o arquivo teste.txt.

Isso porque já testei e sei que não funciona!!!

Tem alguma outra solução?


(Eu preciso que o arquivo criado pelo apache, seja do usuario www-data ou então que seja criado com permissão 777)

Rockwave

Atualmente qual usuario e grupo são donos da pasta /var/www/html ?
Você ja pensou em usar o sgid? Antes de fazer isso pesquise sobre as implicações de segurança.

Rockwave

Outra possibilidade que talvez possa ser pensada é alterar a umask do usuario que cria os arquivos.

_ubuntu_

Citação de: Rockwave online 25 de Março de 2015, 17:08
Atualmente qual usuario e grupo são donos da pasta /var/www/html ?
Você ja pensou em usar o sgid? Antes de fazer isso pesquise sobre as implicações de segurança.
Bom, ja tentei sim pra falar a verdade... com chmod 7770, ou 2770 ou 3770 na pasta html


CitarOutra possibilidade que talvez possa ser pensada é alterar a umask do usuario que cria os arquivos.

Já tentei adicionar umask na pasta, como 'umask 077 html'
e nada resolveu... agora essa questão de inserir umask no usuario, eu não sabia que era possivel!!
Vou tentar fazer isso e retorno aqui o que obtive!!

Obrigado!

zekkerj

Olá _ubuntu_, será que vc não está executando esse script PHP na linha de comando como o root? Talvez seja nesse momento que o arquivo esteja sendo criado com o usuário errado.

Sobre o script, em si: foi você que o fez? Se foi, modifique-o para que não tente gravar no diretório corrente, e sim em um diretório onde seu usuário possa ter permissão de escrita, como "/var/lib/php/meuscript/".
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

_ubuntu_

Citação de: zekkerj online 10 de Abril de 2015, 12:04
Olá _ubuntu_, será que vc não está executando esse script PHP na linha de comando como o root? Talvez seja nesse momento que o arquivo esteja sendo criado com o usuário errado.

Sobre o script, em si: foi você que o fez? Se foi, modifique-o para que não tente gravar no diretório corrente, e sim em um diretório onde seu usuário possa ter permissão de escrita, como "/var/lib/php/meuscript/".
Esse script que me referi, é dentro do arquivo index.php
la dentro coloquei um 'fopen' apenas para abrir e ler um arquivo, caso esse arquivo não exista então a propria pagina php cria esse arquivo!
Mas, quando o index.php tenta criar esse arquivo, ele me retorna que foi criado o arquivo, e na segunda vez ele não deixa gravar nada dentro desse arquivo, pois esse arquivo é criado com o dono root e a permissão 755.

O que eu consigo entender disso é o seguinte, a hora que cria o arquivo, não sei pq cargas d'agua ele é gerado com as permissões citadas, porém na hora de adicionar dados dentro desse arquivo ele não aceita.

E o problema não é no codigo php, pois ao jogar esse mesmo codigo simples em um servidor pago online, ele funciona perfeitamente!
Estou usando o ubuntu 14.04.
Na versão 12.04 funcionava perfeitamente!

zekkerj

O diretório onde o arquivo está sendo criado é "suid"? Se for, isso explica pq a pasta cria os arquivos pertencendo ao root. Posta por favor a saída do comando abaixo.

sudo namei -om /var/www/html
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

_ubuntu_

Citação de: zekkerj online 01 de Julho de 2015, 15:11
O diretório onde o arquivo está sendo criado é "suid"? Se for, isso explica pq a pasta cria os arquivos pertencendo ao root. Posta por favor a saída do comando abaixo.

sudo namei -om /var/www/html


root@sweb:/var/www# namei -om /var/www/html/
f: /var/www/html/
drwxr-xr-x root     root     /
drwxr-xr-x root     root     var
drwxr-xr-x root     root     www
drwsrws--- www-data prestige html
root@sweb:/var/www#


zekkerj

OK... o diretório "/var/www/html" está com SUID e SGID, mas não pro usuário root, e sim para "www-data:prestige".

Pode repetir o comando com o tal arquivo que está vindo com as permissões erradas?
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

_ubuntu_

Citação de: zekkerj online 02 de Julho de 2015, 15:57
OK... o diretório "/var/www/html" está com SUID e SGID, mas não pro usuário root, e sim para "www-data:prestige".

Pode repetir o comando com o tal arquivo que está vindo com as permissões erradas?


O arquivo teste.php gera o arquivo teste.txt, porém na hora de tentar gravar em cima desse teste.txt novamente, o apache retorna o erro de acesso negado!

root@sweb:/var/www/html# ls -lsa teste.php teste.txt
1024 -rw-rw-rw- 1 root prestige 272 Jul  2 16:22 teste.php
   0 -rw-r--r-- 1 root prestige   0 Jul  2 16:22 teste.txt

root@sweb:/var/www/html# namei -om teste.txt teste.php
f: teste.txt
-rw-r--r-- root prestige teste.txt
f: teste.php
-rw-rw-rw- root prestige teste.php



CitarWarning: fopen(teste.txt): failed to open stream: Permission denied in /var/www/html/teste.php on line 4
Warning: fwrite() expects parameter 1 to be resource, boolean given in /var/www/html/teste.php on line 7

Se eu for la na pasta onde se encontra o teste.txt, e dar um chmod 777 teste.txt
isso meio que resolve o problema, mas na real é que as paginas criadas precisam criar e apagar varios arquivos, não só txt, como jpg, png, gif etc.. e não posso ficar dando comando chmod toda vez que o site criar um arquivo entende?


zekkerj

Pois é, o estranho é que os arquivos deveriam estar sendo criados com o mesmo UID do dono da pasta. Mais estranho ainda teus processos do Apache estarem rodando como root. Confirma isso pra mim?

ps afx | egrep -i "apache|httpd"

Outra coisa, já te perguntei isso antes, vc não me respondeu (ou não lembro se respondeu). Já tentou criar esses arquivos em outra pasta? Não é difícil, basta passar o caminho completo na hora de abrir. Tipo, em vez de abrir "teste.txt", abrir "/tmp/teste.txt", por exemplo.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

_ubuntu_

Citação de: zekkerj online 02 de Julho de 2015, 16:53
Pois é, o estranho é que os arquivos deveriam estar sendo criados com o mesmo UID do dono da pasta. Mais estranho ainda teus processos do Apache estarem rodando como root. Confirma isso pra mim?

ps afx | egrep -i "apache|httpd"

Outra coisa, já te perguntei isso antes, vc não me respondeu (ou não lembro se respondeu). Já tentou criar esses arquivos em outra pasta? Não é difícil, basta passar o caminho completo na hora de abrir. Tipo, em vez de abrir "teste.txt", abrir "/tmp/teste.txt", por exemplo.

root@sweb:~# ps afx | egrep -i "apache|httpd"
1399 pts/2    S+     0:00          \_ egrep --color=auto -i apache|httpd
1065 ?        Ss     0:00 /usr/sbin/apache2 -k start
1095 ?        S      0:00  \_ /usr/sbin/apache2 -k start
1096 ?        S      0:00  \_ /usr/sbin/apache2 -k start
1097 ?        S      0:00  \_ /usr/sbin/apache2 -k start
1098 ?        S      0:00  \_ /usr/sbin/apache2 -k start
1099 ?        S      0:00  \_ /usr/sbin/apache2 -k start
1328 ?        S      0:00  \_ /usr/sbin/apache2 -k start
1334 ?        S      0:00  \_ /usr/sbin/apache2 -k start
1335 ?        S      0:00  \_ /usr/sbin/apache2 -k start
1336 ?        S      0:00  \_ /usr/sbin/apache2 -k start
1337 ?        S      0:00  \_ /usr/sbin/apache2 -k start


Tem um detalhe que talvez eu esqueci de falar, é que o caminho /var/www/html é um segundo HD, ou seja é um sdb1 que fica em outro servidor e é mapeado nesse diretorio.
Mas acredito que isso não influencie em nada..
entretanto, vou 'desmontar' esse sdb1, e colocar essa pagina para rodar no /var/www/html no proprio sda1. entendeu? espero que sim =p

Mas como esse servidor fica em produção durante o expediente de comercio, vou fazer esse teste somente a noite, e posto aqui o resultado..


Thank you in advanced!




zekkerj

O comando que eu te passei não incluiu o UID do processo. :(
Executa de novo, dessa vez assim:

ps -ef | grep -i apache2

CitarTem um detalhe que talvez eu esqueci de falar, é que o caminho /var/www/html é um segundo HD, ou seja é um sdb1 que fica em outro servidor e é mapeado nesse diretorio.
Mas acredito que isso não influencie em nada..
Qual é o tipo de compartilhamento que vc usa pra esse mapeamento? NFS, CIFS/SMB, SSHFS, o que é?

Citarentretanto, vou 'desmontar' esse sdb1, e colocar essa pagina para rodar no /var/www/html no proprio sda1. entendeu? espero que sim =p
Entendi sim, só espere um pouco antes de fazer.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D