Por que o apache não pode criar arquivos de log?

1

Eu tenho uma pilha LAMP simples na configuração do CentOS. O Apache é configurado com vhosts e cada desenvolvedor tem seus arquivos da web dentro de sua pasta de usuário. A estrutura do diretório é assim (para o usuário test ):

/home/test
|_ apache
   |_ domain1.com
      |_ backups
      |_ conf
         |_ vhost.conf
      |_ logs
         |_ errors.log
         |_ images.log
         |_ web.log
      |_ private
      |_ public

A configuração do vhost está no arquivo vhost.conf. Os arquivos de log nos logs não existem quando a configuração é configurada pela primeira vez, e isso gera um erro no apache quando eu corro service httpd restart :

(13)Permission denied: httpd: could not open error log file /home/test/apache/domain1.com/logs/error.log.
Unable to open logs

Eu tentei executar httpd -X como root e ele criou os arquivos de log (com propriedade root / group). Eu pensei que seria um caso de se certificar de que os arquivos estão lá, com o grupo definido como apache e gravável (para que eu não precise fazer o diretório inteiro pertencer a apache group e gravável), mas isso confunde eu:

[root@dev logs]# ls -al
total 16
drwxr-xr-x. 2 test developers 4096 Apr 18 21:02 .
drwxr-xr-x. 8 test developers 4096 Apr 18 20:25 ..
-rw-r--r--. 1 test developers 1818 Apr 18 21:02 error.log
-rw-r--r--. 1 test developers   14 Apr 18 20:25 .gitignore
-rw-r--r--. 1 test developers    0 Apr 18 20:54 image.log
[root@dev logs]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [FAILED]
[root@dev logs]# touch web.log
[root@dev logs]# chown test:developers web.log
[root@dev logs]# service httpd restart
Stopping httpd:                                            [FAILED]
Starting httpd:                                            [  OK  ]

Estou confuso porque o apache é executado como usuário apache e não deveria ter acesso de gravação nos logs, deveria? Na verdade, posso até fazer isso:

[root@dev logs]# rm -f ./*.log
[root@dev logs]# touch {error.log,image.log,web.log}
[root@dev logs]# ls -al
total 12
drwxr-xr-x. 2 test developers 4096 Apr 18 21:10 .
drwxr-xr-x. 8 test developers 4096 Apr 18 20:25 ..
-rw-r--r--. 1 root root          0 Apr 18 21:10 error.log
-rw-r--r--. 1 test developers   14 Apr 18 20:25 .gitignore
-rw-r--r--. 1 root root          0 Apr 18 21:10 image.log
-rw-r--r--. 1 root root          0 Apr 18 21:10 web.log
[root@dev logs]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

Agora eu tenho arquivos de log de propriedade do root e ele ainda inicializa - e também grava neles - se eu rastrear o web.log e navegar até essa página, os logs começam a aparecer.

Eu obviamente não estou entendendo bem alguma coisa aqui, então o que estou perdendo? Eu preferiria não ter que criar os arquivos de log manualmente e permitir que o apache fizesse isso sozinho, mas independentemente disso, eu gostaria apenas de entender por que isso está acontecendo - especialmente quando eu permito que o PHP mexa com arquivos.

Atualizar

Conforme solicitado, aqui está o que eu vejo em audit.log quando tento iniciar o apache quando os arquivos de log não existem:

type=AVC msg=audit(1397906748.752:49390): avc:  denied  { write } for  pid=19433 comm="httpd" name="logs" dev=md2 ino=7210204 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=dir
type=SYSCALL msg=audit(1397906748.752:49390): arch=c000003e syscall=2 success=no exit=-13 a0=7f9bb740e598 a1=80441 a2=1b6 a3=752e6f632e74756f items=0 ppid=19432 pid=19433 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=128 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)

Ao executar com os logs existentes, nada mais é adicionado ao log. O erro Permission denied: httpd: could not ... foi do log geral.

    
por Leonard Challis 18.04.2014 / 22:14

4 respostas

1

Você está criando arquivos únicos usando o toque e, em seguida, altera o proprietário do arquivo por chown. Para o Apache criar seus próprios arquivos de registro, as permissões de gravação para o diretório contendo são necessárias. Use chown -R (capital R = recursivo) no diretório de log designado.

    
por 18.04.2014 / 22:42
1

Eu tive o mesmo problema agora. @Tim Alexander me apontou na direção certa. Desativar o selinux temporariamente provou que o problema estava na configuração do selinux.

Então, depois de pesquisar um pouco mais, achei uma sugestão que basicamente dizia para ter certeza de replicar qualquer configuração do selinux em / var / www / html no diretório do host virtual.

A primeira coisa que fiz foi reiterar um problema do selinux em arquivos de configuração que eu tinha de vez em quando, sobre os quais eu escrevi aqui: link

Mas esse não era o problema. No entanto, entrei em / var / www e emite "ls -Z" que mostrava

drwxr-xr-x. root      root system_u:object_r:httpd_sys_content_t:s0 html

então tudo que fiz agora foi

chcon -R system_u:object_r:httpd_sys_content_t:s0 /www/

e atualizar o navegador agora mostrou corretamente o índice do site, mas ainda tinha o erro "não é possível abrir o arquivo de log" em error_log.

Depois, fiz uma boa leitura (novamente) por meio do link

Uma boa ideia para executar, neste momento, é

sealert -a /var/log/audit/audit.log

Embora o wiki diga grep o audit.log e passe isso para sealert, acho que quero resolver todos os problemas do selinux, não apenas o que está me incomodando agora:)

Voltando ao nosso problema, o sealert mostra o seguinte alerta relevante:

SELinux is preventing /usr/sbin/rotatelogs from search access on the directory /etc/httpd

sealater sugere fazer o seguinte

#grep rotatelogs /var/log/audit/audit.log | audit2allow -M mypol
#semodule -i mypol.pp

E isso de fato resolveu o problema do log.

Então lá vai você, 3 questões de selinux eu continuo recebendo todo ano ou mais quando eu configuro um novo site com o apache no centos 5.x / 6.xe eu ainda preciso procurar no Google. Cada vez.

    
por 21.09.2015 / 23:54
0

Você alterou a propriedade dos arquivos para serem lidos / executáveis por grupo, mas não pode ser gravada por grupo, e acredito que aí está seu problema. Você provavelmente pode chmod 664 os arquivos para torná-los ler e gravável pelo proprietário e grupo (e legível por qualquer pessoa). Eles não precisam ser executáveis.

    
por 19.04.2014 / 01:20
0

eu tenho o mesmo problema que os logs do vhost sempre são de propriedade do root com 640 permissões quando criados, uma rodada de trabalho é escrever um script para chmod ou chown as permissões do nome do arquivo de log do vhost usando um curinga no final do nome do arquivo para capturar o formato de data, no final do arquivo em seguida, cron esse script e defini-lo uma vez por hora ou uma vez por dia, então seus loggs vhost terão as permissões que você deseja

    
por 12.08.2014 / 18:22