Instalação e Configuração do Syslog-ng com MySQL no Debian Squeeze

E ai galera, aqui eu vou abordar a instalação e a configuração do Syslog-ng trabalhando integrado com o MySQL e com o gerenciador Web para ficar melhor de monitoramos os logs, a ideia aqui é termos um local centralizado para acompanharmos os logs, com isso vamos configurar todos os clientes para enviarem os logs para este servidor.

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialsqueeze_en para que não falte nenhum pacote ou configuração.

O que vou utilizar:

  1. Nome Servidor: syslog-ng
  2. Ip LAN: 10.101.0.25/24
  3. Nome do Cliente: debian
  4. Ip LAN: 10.101.0.26/24

Vamos primeiro fazer um update dos repositórios e mandar fazer um upgrade do sistema.

aptitude update && aptitude dist-upgrade -y

Agora vamos mandar instalar as dependências

aptitude install mysql-server mysql-client apache2 php5 php5-mysql php5-imap syslog-ng -y
aptitude install php5-gd php5-mcrypt php5-json php5-xmlrpc php5-dev php5-common libapache2-mod-php5 php-pear -y
aptitude install libdbd-mysql libdbd-mysql-perl msttcorefonts php5-gd -y

Agora vamos obter o phpsyslog

cd /usr/src
wget -c http://wiki.douglasqsantos.com.br/Downloads/monitoring/php-syslog-ng-2.9.8a.tgz

Agora vamos descompactar ele

tar -xvf php-syslog-ng-2.9.8a.tgz 

Agora vamos copiar os arquivos do gerenciador web para a raiz do apache

cp -Rfa php-syslog-ng/html /var/www/phpsyslog

Agora precisamos fazer alguns ajustes no arquivo de controle do php

vi /etc/php5/apache2/php.ini 
[...]
magic_quotes_gpc = On 
[...]
display_errors = On 
[...]
session.save_path = "/tmp"
[...]
max_execution_time = 60 

Agora vamos acertar as permissões do phpsyslog

chown -R www-data:www-data /var/www/*

Agora vamos remover um arquivo de configuração vazio que vem com o phpsyslog

rm -rf /var/www/phpsyslog/config/config.php

Agora vamos reiniciar o nosso apache

/etc/init.d/apache2 restart

Agora vamos acessar http://ip_servidor/phpsyslog

  1. Aqui na primeira tela precisamos ter todos os parâmetros na cor verde caso esteja tudo ok selecione Next
  2. Aqui na próxima tela precisamos aceitar a licença I understand that this software is released under the GNU/GPL License e selecionar Next
  3. Aqui na próxima tela precisamos informar:
    1. A senha do root do MySQL e confirmar ela.
    2. Em Syslog User Name vamos informar syslog
    3. Depois precisamos informar a senha para este usuário e confirmar ela
    4. Agora em Syslog Admin Name vamos informar syslog
    5. Depois precisamos informar a senha para este usuário e confirmar ela
    6. Agora vamos desmarcar Install Sample Data
    7. Caso não monitore algum dispositivo Cisco podemos desmarcar também Install CEMDB Data
    8. Agora selecione Next
  4. Depois de selecionar Next vamos ter um aviso sobre o banco de dados selecione OK.
  5. Na próxima tela podemos informar um nome de site para o phpsyslog no meu caso phpsyslog.douglasqsantos.com.br e selecione Next
  6. Na próxima tela informe o seu email em your e-mail e informe uma senha em admin password está vai ser a senha de acesso ao painel e selecione Next
  7. Caso esteja utilizando dispositivos Cisco na próxima tela selecione Install CEMDB caso contrário terminamos a instalação agora vamos fazer alguns ajustes.

Agora vamos jogar o phpsyslog para a raiz do apache

rm -rf /var/www/index.html
cd /var/www
mv /var/www/phpsyslog/* .

Vamos remover o diretório de instalação do phpsyslog

rm -rf /var/www/install/

Agora vamos fazer alguns ajustes no syslog-ng, primeiro vamos parar ele

/etc/init.d/syslog-ng stop

Vamos fazer um backup do arquivo de configuração

cp -Rfa /etc/syslog-ng/syslog-ng.conf{,bkp}

Agora vamos ajustar o syslog-ng.conf

vim /etc/syslog-ng/syslog-ng.conf
@version: 3.1
#
# Syslog-ng configuration file, compatible with default Debian syslogd
# installation. Originally written by anonymous (I can't find his name)
# Revised, and rewrited by me (SZALAY Attila <sasa@debian.org>)

# First, set some global options.
options { long_hostnames(off); flush_lines(0); use_dns(no); use_fqdn(no);
    owner("root"); group("adm"); perm(0640); stats_freq(0);
    bad_hostname("^gconfd$");
};

########################
# Sources
########################
# This is the default behavior of sysklogd package
# Logs may come from unix stream, but not from another machine.
#
source s_src { unix-dgram("/dev/log"); internal();
             file("/proc/kmsg" program_override("kernel"));

udp(
  ip(0.0.0.0)
  port(514)
);
tcp(
  ip(0.0.0.0)
  port(514)
);
};

# If you wish to get logs from remote machine you should uncomment
# this and comment the above source line.
#
#source s_net { tcp(ip(127.0.0.1) port(1000) authentication(required) encrypt(allow)); };

########################
# Destinations
########################
# First some standard logfile
#
destination d_mysql {
 sql(type(mysql)
 host("localhost") username("syslog") password("senha")
 database("syslog")
 table("logs")
 columns("host", "facility", "priority", "level", "tag", "datetime", "program", "msg")
 values("$HOST_FROM", "$FACILITY", "$PRIORITY", "$LEVEL", "$TAG", "$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC", "$PROGRAM", "$MSG")
 indexes("host", "facility", "priority", "datetime", "program"));

};
destination d_auth { file("/var/log/auth.log"); };
destination d_cron { file("/var/log/cron.log"); };
destination d_daemon { file("/var/log/daemon.log"); };
destination d_kern { file("/var/log/kern.log"); };
destination d_lpr { file("/var/log/lpr.log"); };
destination d_mail { file("/var/log/mail.log"); };
destination d_syslog { file("/var/log/syslog"); };
destination d_user { file("/var/log/user.log"); };
destination d_uucp { file("/var/log/uucp.log"); };

# This files are the log come from the mail subsystem.
#
destination d_mailinfo { file("/var/log/mail/mail.info"); };
destination d_mailwarn { file("/var/log/mail/mail.warn"); };
destination d_mailerr { file("/var/log/mail/mail.err"); };

# Logging for INN news system
#
destination d_newscrit { file("/var/log/news/news.crit"); };
destination d_newserr { file("/var/log/news/news.err"); };
destination d_newsnotice { file("/var/log/news/news.notice"); };

# Some `catch-all' logfiles.
#
destination d_debug { file("/var/log/debug"); };
destination d_error { file("/var/log/error"); };
destination d_messages { file("/var/log/messages"); };

# The root's console.
#
destination d_console { usertty("root"); };

# Virtual console.
#
destination d_console_all { file("/dev/tty10"); };

# The named pipe /dev/xconsole is for the nsole' utility.  To use it,
# you must invoke nsole' with the -file' option:
#
#    $ xconsole -file /dev/xconsole [...]
#
destination d_xconsole { pipe("/dev/xconsole"); };

# Send the messages to an other host
#
#destination d_net { tcp("127.0.0.1" port(1000) authentication(on) encrypt(on) log_fifo_size(1000)); };

# Debian only
destination d_ppp { file("/var/log/ppp.log"); };

########################
# Filters
########################
# Here's come the filter options. With this rules, we can set which 
# message go where.

filter f_dbg { level(debug); };
filter f_info { level(info); };
filter f_notice { level(notice); };
filter f_warn { level(warn); };
filter f_err { level(err); };
filter f_crit { level(crit .. emerg); };

filter f_debug { level(debug) and not facility(auth, authpriv, news, mail); };
filter f_error { level(err .. emerg) ; };
filter f_messages { level(info,notice,warn) and 
                    not facility(auth,authpriv,cron,daemon,mail,news); };

filter f_auth { facility(auth, authpriv) and not filter(f_debug); };
filter f_cron { facility(cron) and not filter(f_debug); };
filter f_daemon { facility(daemon) and not filter(f_debug); };
filter f_kern { facility(kern) and not filter(f_debug); };
filter f_lpr { facility(lpr) and not filter(f_debug); };
filter f_local { facility(local0, local1, local3, local4, local5,
                        local6, local7) and not filter(f_debug); };
filter f_mail { facility(mail) and not filter(f_debug); };
filter f_news { facility(news) and not filter(f_debug); };
filter f_syslog3 { not facility(auth, authpriv, mail) and not filter(f_debug); };
filter f_user { facility(user) and not filter(f_debug); };
filter f_uucp { facility(uucp) and not filter(f_debug); };

filter f_cnews { level(notice, err, crit) and facility(news); };
filter f_cother { level(debug, info, notice, warn) or facility(daemon, mail); };

filter f_ppp { facility(local2) and not filter(f_debug); };
filter f_console { level(warn .. emerg); };

########################
# Log paths
########################
log { source(s_src); destination(d_mysql); };
log { source(s_src); filter(f_auth); destination(d_auth); };
log { source(s_src); filter(f_cron); destination(d_cron); };
log { source(s_src); filter(f_daemon); destination(d_daemon); };
log { source(s_src); filter(f_kern); destination(d_kern); };
log { source(s_src); filter(f_lpr); destination(d_lpr); };
log { source(s_src); filter(f_syslog3); destination(d_syslog); };
log { source(s_src); filter(f_user); destination(d_user); };
log { source(s_src); filter(f_uucp); destination(d_uucp); };

log { source(s_src); filter(f_mail); destination(d_mail); };
#log { source(s_src); filter(f_mail); filter(f_info); destination(d_mailinfo); };
#log { source(s_src); filter(f_mail); filter(f_warn); destination(d_mailwarn); };
#log { source(s_src); filter(f_mail); filter(f_err); destination(d_mailerr); };

log { source(s_src); filter(f_news); filter(f_crit); destination(d_newscrit); };
log { source(s_src); filter(f_news); filter(f_err); destination(d_newserr); };
log { source(s_src); filter(f_news); filter(f_notice); destination(d_newsnotice); };
#log { source(s_src); filter(f_cnews); destination(d_console_all); };
#log { source(s_src); filter(f_cother); destination(d_console_all); };

#log { source(s_src); filter(f_ppp); destination(d_ppp); };

log { source(s_src); filter(f_debug); destination(d_debug); };
log { source(s_src); filter(f_error); destination(d_error); };
log { source(s_src); filter(f_messages); destination(d_messages); };

log { source(s_src); filter(f_console); destination(d_console_all);
            destination(d_xconsole); };
log { source(s_src); filter(f_crit); destination(d_console); };

# All messages send to a remote site
#
#log { source(s_src); destination(d_net); };

Agora vamos fazer um ajuste no mysql

mysql -u root -p
GRANT ALL PRIVILEGES ON syslog.* TO syslog@localhost IDENTIFIED BY 'senha';
FLUSH PRIVILEGES;
quit;

Agora vamos reiniciar o serviço do syslog-ng

/etc/init.d/syslog-ng restart

Agora vamos configurar o virtualhost para o nosso phpsyslog

vim /etc/apache2/sites-available/phpsyslog
<VirtualHost *:80>
 ServerName phpsyslog.douglasqsantos.com.br
 ServerAlias phpsyslog
 
 DocumentRoot "/var/www/"
 <Directory "/var/www/">
 Options -Indexes +FollowSymLinks +MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
 </Directory>
 
 ErrorLog ${APACHE_LOG_DIR}/phpsyslog.douglasqsantos.com.br-error.log
 CustomLog ${APACHE_LOG_DIR}/phpsyslog.douglasqsantos.com.br-access.log common
 
 ServerSignature Off
 
 LogLevel info
</VirtualHost>

Agora vamos desativar o virtualhost default do apache e vamos ativar o virtualhost do phpsyslog

a2dissite default
a2ensite phpsyslog

Agora vamos obter os arquivos do phpsyslog com algumas correções

cd /usr/src
wget -c http://wiki.douglasqsantos.com.br/Downloads/monitoring/php-syslog-patch.tar.gz

Agora vamos descompactar os arquivos

tar -xzvf php-syslog-patch.tar.gz

Agora vamos fazer backup dos arquivos que nós vamos modificar

cp -Rfa /var/www/logout.php{,.bkp}
cp -Rfa /var/www/includes/version.php{,.bkp}
cp -Rfa /var/www/config/config.php{,.bkp}
cp -Rfa /var/www/includes/jpgraph/jpgraph.php{,.bkp}

Agora vamos substituir os arquivos

cp -Rfa logout.php /var/www/
cp -Rfa version.php /var/www/includes/
cp -Rfa config.php /var/www/config/
cp -Rfa jpgraph.php /var/www/includes/jpgraph/

Agora vamos ajustar somente as senhas do arquivo de configuração

vim /var/www/config/config.php
[...]
define('DBUSER', 'syslog');
define('DBUSERPW', 'senha');
define('DBADMIN', 'syslog');
define('DBADMINPW', 'senha');
define('DBNAME', 'syslog');
define('DBHOST', 'localhost');
[...]

Agora vamos ajustar as permissões dos arquivos

chown -R www-data:www-data /var/www

Agora podemos reiniciar o nosso apache

/etc/init.d/apache2 restart

Agora já podemos acessar http://phpsyslog.douglasqsantos.com.br ou http://ip_servidor

  1. Usuário: admin
  2. Senha: senha que foi definida junto ao email do admin na instalação do phpsyslog

Configuração do Cliente

Agora vamos ajustar um cliente Debian para enviar os logs para o nosso servidor

vim /etc/rsyslog.conf
[...]
#Inserir no final do arquivo
*.*     @10.101.0.25
#caso queira enviar somente alguns tipos de logs podemos fazer da seguinte forma
#*.=emerg;*.=warn;*.=err;*.=alert   @10.101.0.25

Agora vamos reiniciar o rsyslog do cliente

/etc/init.d/rsyslog restart

Agora vamos consultar os logs enviados pelo cliente para o servidor

No servidor vamos visualizar os logs

tail -f /var/log/syslog 
Oct 26 12:10:53 syslog-ng mysqld: Begin safemalloc memory dump:
Oct 26 12:10:53 syslog-ng mysqld: 
Oct 26 12:10:53 syslog-ng mysqld: End safemalloc memory dump.
Oct 26 12:17:01 syslog-ng /USR/SBIN/CRON[5362]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Oct 26 12:20:01 syslog-ng /USR/SBIN/CRON[5419]: (root) CMD (test -x /usr/lib/atsar/atsa1 && /usr/lib/atsar/atsa1)
Oct 26 12:30:01 syslog-ng /USR/SBIN/CRON[5461]: (root) CMD (test -x /usr/lib/atsar/atsa1 && /usr/lib/atsar/atsa1)
Oct 26 12:31:08 syslog-ng syslog-ng[3007]: Termination requested via signal, terminating;
Oct 26 12:31:08 syslog-ng syslog-ng[3007]: syslog-ng shutting down; version='3.1.3'
Oct 26 12:42:54 syslog-ng syslog-ng[5705]: syslog-ng starting up; version='3.1.3'
Oct 26 12:50:01 syslog-ng /USR/SBIN/CRON[5922]: (root) CMD (test -x /usr/lib/atsar/atsa1 && /usr/lib/atsar/atsa1)
Oct 26 12:57:41 10.101.0.26 kernel: imklog 4.6.4, log source = /proc/kmsg started.
Oct 26 12:57:41 10.101.0.26 rsyslogd: [origin software="rsyslogd" swVersion="4.6.4" x-pid="1156" x-info="http://www.rsyslog.com"] (re)start

Notem que as ultimas entradas de logs são do endereço ip 10.101.0.26 que é o nosso cliente, agora já temos a configuração do servidor e do cliente.

Agora precisamos ir ajustando de acordo com as nossas necessidades.

Referências