Lendo arquivos de log do aplicativo da web

1

Eu quero escrever uma pequena aplicação PHP para monitorar logs em um servidor Debian, incluindo logs syslog e mensagens Apache / PHP. O problema aqui é que o usuário do Apache (www-data) não tem acesso ao diretório / var / log. Qual seria a melhor maneira de conceder acesso a logs para aplicativos PHP? Vamos supor que os arquivos de log possam ser realmente grandes, como centenas de megabytes.

Eu tenho algumas ideias:

  • Escreva um shell script que seria executado via sudo e tail últimos 512 Kb de log em um arquivo separado que pode ser lido pelo aplicativo - que é ineficaz, por causa de um novo processo e ter que ler dados duas vezes

  • Adicione www-data ao grupo adm (que pode ler logs) - isso é inseguro

  • Inicie um processo PHP via cron a cada minuto para ler logs - isso não é muito bom, porque não permite monitoramento em tempo real. Além disso, esse script será iniciado mesmo quando eu não ler registros e consumir tempo de CPU (o servidor está na nuvem e eu terei que pagar por isso)

  • Crie um link físico para todos os arquivos de log com permissões reduzidas - eu acho que isso não funcionará porque o logrotate pode recriar arquivos de log e eles mudam o número do inode.

  • Inicie um servidor nginx / Apache separado em um usuário privilegiado que possa ler logs.

Talvez alguém tenha uma solução melhor?

    
por Egorinsk 12.02.2011 / 22:55

3 respostas

1

Eu recomendaria usar o rsyslogd para logar diretamente em um banco de dados mysql que pode ser acessado pelo php. Esta é uma configuração suportada do rsyslog. Eu acredito lenny + para debian rsyslog é o registrador sys padrão, então deve ser apenas instalar o mysql se ele ainda não estiver lá, configurando a segurança, configurando as tabelas e configurando o rsyslog.

link

exemplo:

*.*       :ommysql:database-server,database-name,database-userid,database-password

Espero que isso seja útil para você.

    
por 12.02.2011 / 23:22
1

Bem, embora o post original seja tranquilo há alguns meses, gostaria de compartilhar minha abordagem com você:

No meu caso, eu só quero monitorar /var/log/mail.log. Então eu adiciono a seguinte linha ao / etc / sudoers:

www-data  ALL=(:adm) NOPASSWD:/bin/cat /var/log/mail.log 

Isso permite que o www-data execute o comando /bin/cat /var/log/mail.log como membro do grupo adm.

Dentro do PHP, eu apenas chamo

$output = shell_exec('sudo -g adm cat /var/log/mail.log |/pipe/anywhere');

Espero que esta abordagem seja útil para alguém ...

Se você sentir que eu perdi alguns problemas de segurança, por favor, deixe um comentário

    
por 01.06.2012 / 18:38
0

Como pablo sugere - os arquivos de log não precisam ser gravados em / var / log. Eles não precisam ser escritos na máquina local - essas configurações podem ser configuradas imediatamente. O problema com o uso do MySQL, é que o seu sistema logging fica subitamente muito complexo - e o que acontece com as entradas de log invocadas quando o dbms está inativo?

Você pode configurar os arquivos para serem lidos por 'outros' (e os diretórios para serem executáveis por outros) dê uma olhada na página man do logrotate para ver como controlar as permissões nos arquivos de log.

Mas o processo que lê os logs não precisa ser executado pelo apache uid. De fato, eu recomendaria a execução do cron job - ou preferencialmente um daemon - como um usuário diferente para ler os logs - e extrair as informações necessárias para um repositório comum.

C.

    
por 13.02.2011 / 10:48