quinta-feira, 16 de fevereiro de 2017

SysLog: Sistema de log do Linux

Autor: Thiago Nobrega <thiago at pb.homeunix.org>
Data: 09/11/2005

O que é um LOG? E para que serve?



"A record of activities performed within a program, or changes in a database or file on a computer, and typically kept as a file in the computer."

Um sistema crítico (24/7) com centenas de milhares de acesso por dia, como se sabe se uma parte do hardware está com problemas? Se aconteceu ataques durante a noite? Se foi invadido?

Os arquivos de log proporcionam um radiografia completa do sistema, do funcionamento do hardware, de acesso, emails, programas...


Log em *UNIX



O syslogd possui duas funcionalidades, uma que é fazer os logs do sistema e outra capturar as mensagens do kernel. Suporta tanto login local como remoto.

O trecho abaixo foi originalmente escrito por Eric Allman.

O syslog tem duas funções:
  • Liberar os programadores de gerar seu arquivos de log (antes do syslog tinha que ser feito por cada programador, isso era terrível);
  • Deixar o administrador do sistema no controle dos logs.

O syslog é constituído de 3 partes:
  • O daemon syslogd;
  • Openlog, que são rotinas e bibliotecas chamadas para ter acesso ao syslog;

    #include <syslog.h>
    void openlog(const char *ident, int option, int facility);
    void syslog(int priority, const char *format, ...);
    void closelog(void);

    #include <stdarg.h>
    void vsyslog(int priority, const char *format, va_list ap);


  • Logger, que é um comando shell para o usuário enviar entradas para o syslog.


Daemon



O syslogd, escrito inicialmente por Eric Allman para *UNIX de kernel com poucos Kbytes, trabalhava com poucas mensagens de log. Os *UNIX modernos com kernels que podem variar de 400K a 16MB (Linux) passaram a produzir uma quantidade muito grande de logs, sem contar os programas (ssh, Postfix, SGBDS, etc), que produzem ainda mais log. Então o daemon do syslog foi divido em dois:
  • syslogd - Linux system logging utilities;
  • klogd - Kernel Log Daemon.

klogd


O klogd é o daemon responsável para por capturar as mensagens de lançadas pelo kernel.

O klogd guarda suas mensagens em dois locais, no /proc ou usando a "sys_syslog interface". O klogd escolhe qual dos dois vai usar da seguinte maneira: verifica se o /proc está montado, se estiver, utilizará o /proc/kmsg para gravar as mensagens de log, caso contrário utilizará o "system call interface" para mandar as mensagens de erro.

Uma vez que a mensagem é enviada para o syslogd, o klog pode priorizar as mensagens enviadas pelo kernel.

As mensagens enviadas pelo kernel tem a seguinte sintaxe:

<[0-7]> mensagem do kernel

Os valores <[0-7]> são definidos no kernel.h.

O klogd também envia as mensagens para o console toda a mensagem com valor menor que 7. Já as mensagens com valor 7 são tratadas como mensagem de debug.

O problema é que a configuração padrão gera mensagens em demasia na saída de tela, então normalmente se utiliza o klog da seguinte maneira:

# klogd -c 0

O comando acima mostra na tela apenas os logs de PANIC.

Kernel Address Resolution: Uma vez que o kernel detecta um erro interno, uma trigger é disparada mostrando todo o conteúdo que estava no processador no momento do erro. O klogd fornece essa facilidade de especificar que função foi chamada e quais variáveis estavam envolvidas no erro.

syslogd


Captura tanto as mensagens do kernel quanto as mensagens do sistema.

O syslogd dá suporte para logs remotos, por exemplo, você pode fazer todas as máquinas mandarem um log para uma máquina específica que analisa os logs de todas as máquinas de uma empresa.


Os arquivos



Um dos problemas do syslog é a falta de padronização dos arquivos de log, então dependendo da distribuição do seu Linux, pode haver alguma diferença.

Geralmente os arquivos de logs estão no diretório /var/log. Vejamos alguns exemplos dos arquivos de log que podem ser abertos com um editor de texto.

Arquivos de log:

Nome Descrição
messages Um dos principais arquivos de log do sistema (kernel/sistema)
syslog Um dos principais arquivos de log (kernel)
secure Uso do su, sudo, mudança de senhas pelo root, etc
maillog Arquivo de log do servidor de email
cron Log do cron


O syslog também gera arquivos de contabilidade, que não podem ser abertos por editores de textos e sim por programas especiais (ex: "last" para o wtmp).

Arquivos de contabilidade:

Nome Descrição
wtmp Contabilidade do tempo de conexão
acct/pacct Contabilidade de processo BSD/Sysv



Entendo o syslog.conf



Bem, toda a configuração do syslogd está no arquivo /etc/syslog.conf. A sintaxe básica do syslog.conf é a seguinte:

recurso.nível       ação

Onde "recurso" é o recurso do sistema que envia a mensagem. São 18 os recursos definidos na maioria das versões, mas o syslog já define 21 (para uso futuro).

Recurso Programas que utilizam
kernel O kernel
user Processos do usuário
mail mail server
daemon Daemons do sistema
auth Autenticação/segurança
cron Cron
syslog Mensagens internas do syslog
* Todos exceto o mark


"Nível" determina o grau de severidade do log:

Nível Significado
emerg É aquela famosa "Eita p...."
alert Situações de emergências
crit Condições críticas
err Erros
warning Mensagem de advertência
notice Algo que merece uma investigação
info Informativas
debug Depuração


Ações do syslog:

Ação Significado
nomedoarquivo Grava a mensagem no arquivo (path completo)
@nomedohost/ipdohost Encaminha a mensagem para um syslog em outra máquina
usuário1,usuário2, Imprime as mensagens na tela do usuário se ele estiver logado


O syslog permite entradas com operador lógico (OR) e wildcards (*,!) da seguinte maneira:
recurso.nível;recurso2.nível4       ação 
recurso1,recurso2.nível             ação
*.nível                             ação
recurso.!                           ação

Alguns *UNIX aprimoraram seu syslog, os *UNIX derivados do BSD (O Slackware em especial) implementou os seguintes qualificadores:

Seletor Significado
kernel.info Seleciona as mensagens com nível info ou mais altos
kernel.>=info O mesmo do kernel.info
kernel.= info Só as mensagens de info
kernel.!= info As mensagens diferentes de info
kernel.<=info As mensagens com o nível < ou = a info
kernel.<info Seleciona as mensagens com prioridade menor que info
kernel.>info Seleciona as mensagens com prioridade maior que info


Alguns syslogs também implementam o m4, que é um pré-processador de macro. Vejamos um exemplo:

auth.notice   ifdef('LOGSERVER', '/var/log/xpto' , '@LOGSERVER' )

Essa linha direciona a mensagem para o /var/log/xpto se o LOGSERVER não estiver definido.


Login remoto



Para montar um servidor de log temos que verificar se temos que fazer duas coisas:
  • Iniciar o syslogd com a opção -r, para que o syslog receba mensagens enviadas pela rede;
  • Fazer o daemon escutar a porta 514 (/etc/services), tanto no servidor quanto no cliente.

Pronto, basta configurar o syslog.conf do servidor e dos clientes.

Questão de segurança


O uso de um servidor de log pode deixar seu servidor susceptível à ataques D.O.S. Para evitar possíveis D.O.S:
  • Definir no firewall quem poderá enviar mensagens;
  • Fazer com que os logs não fiquem na partição raiz do sistema (evitando que o sistema encha apenas com os logs);
  • Definir uma "quota" para os arquivos de log.


Política



Como fazer para não me afogar nos logs?

O Linux faz um rotação automática dos logs, descartando os logs antigos.

A política default do Linux é guardar os logs por quatro semanas e depois descartá-los.

Quem faz essa rotação é o logrotate, que pode ser configurado no arquivo /etc/logrotate.conf.


Ferramentas



O syslog é ótimo para gerar os logs, mas no fim das contas esses não passam de um monte de arquivos. Muitas vezes extrair informações dos logs é uma coisa sacal, pois as informações estão em vários locais diferentes.

Então, para simplificar essas tarefas, foram desenvolvidas ótimas ferramentas:
[]'s

Thiago Nóbrega
http://eva.homeunix.org




0 comentários: