Howto syslog server

De Tutoriales de Informatica
Saltar a: navegación, buscar

Pasos para la Instalación

Instalar herramientas de compilación

# apt-get install build-essential

Instalar y configurar Postgres

# apt-get install postgresql postgresql-server-dev-8.4

Creo el usuario rsyslog

# su postgres
# createuser rsyslog

Creo la base de datos rsyslog

# createdb rsyslog

le creo contraseña de rsyslog

# psql
# alter user rsyslog with password 'dsiredes';

Asignar permisos al usuario rsyslog sobre la base rsyslog

# GRANT ALL PRIVILEGES on database rsyslog to rsyslog;

Descargar e instalar RSyslog

# cd /usr/local/src
# wget http://rsyslog.com/files/download/rsyslog/rsyslog-5.9.5.tar.gz

Una vez descargado el paquete nos situamos en el directorio /tmp y ejecutamos el siguiente comando:

# cd /tmp
# tar xzvf /usr/local/src/rsyslog-5.9.5.tar.gz

Una vez descomprimido el paquete, nos situamos en el directorio creado y configuramos el instalador con los siguientes comandos:

# cd rsyslog-5.9.5
# ./configure --enable-pgsql --enable-mail

Una vez configurado el instalador ejecutamos los siguientes comandos:

# make
# make install

Configurar RSyslog

El siguiente paso es crear las tablas necesarias en la base de datos que creamos anteriormente, para ello tenemos que editar primero el script SQL que se encuentra en el directorio /tmp/rsyslog-5.9.5/plugins/ompgsql. Realizaremos una copia del script createDB.sql, donde editaremos a que base de datos ejecutar el script. Para ello ejecutamos los siguientes comandos:

# cd /tmp/rsyslog-5.9.5/pluging/ompgsql
# cp createDB.sql createDB.sql.orig
# nano createDB.sql

Comentar la línea la primera línea introduciendo #.

En la segunda línea cambiar la base de datos Syslog por rsyslog.

Importo los datos del script dentro de la base.

# psql -h localhost -U rsyslog < createDB.sql

Una vez creada la base de datos totalmente, vamos a parametrizar el fichero de configuración de RSyslog, que se encuentra en /etc/rsyslog.conf. Para ello realizaremos una copia de seguridad del fichero rsyslog.conf, para posteriormente configurar el módulo Postgres y añadir el parámetro para almacenar los registros en la base de datos. Para ello ejecutamos los siguientes comandos:

   # cd /etc
   # cp rsyslog.conf rsyslog.conf.orig
   # vi rsyslog.conf

En el apartado ## MODULES ## agregamos las líneas

   # provee conexion a Postgres
    $ModLoad ompgsql

   # Provee conexión a mail
    $ModLoad ommail

Y también en el apartado ##MODULES## descomentamos (o incorporamos) las siguientes lineas para habilitar la recepción de syslogs remotos:

# provides UDP syslog reception 
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

Al final del fichero agregamos las líneas

   # almacena TODOS los logs en Postgres

   # *.* :ompgsql:<ip_del_servidor>,<base_de_datos>,<usuario_pgsql>,<contraseña_usuario_pgsql>
   *.* :ompgsql:127.0.0.1,rsyslog,rsyslog,password 

   # Envia los log por mail - OPCIONAL

################################################################# 
$ModLoad ommail
$ActionMailSMTPServer 192.168.0.6
$ActionMailFrom rsyslog-correo@ejemplo.com
$ActionMailTo administrador@ejemplo.com
$template mailSubject,"Rsyslog Problema Critico, Error o Warning  desde  %hostname%"
$template mailBody,"%msg%"
$ActionMailSubject mailSubject
$ActionExecOnlyOnceEveryInterval 60
*.err;*.crit;*.warn   :ommail:;mailBody
##################################################################


Por último cambiamos el orden de arranque de los servicios, ya que si arranca antes RSyslog que Postgres dará errores de conexión a la base de datos, para ello hacemos que arranque antes los servicios postgres cambiando los valores en el directorio /etc/rc2.d con los siguientes comandos:

   # cd /etc/rc2.d
   # ls -l

Observamos el orden de arranque de los servicios, serán los que modifiquemos.

Cambiaremos RSyslog para que arranque en el número 20, para ello ejecutamos el siguiente comando:

   # mv S10rsyslog S20rsyslog

Para un correcto funcionamiento de la nueva instalación de RSyslog, usaremos el script ya existente en Debian Lenny, ya que esta distribución ya lo trae en el sistema base instalado. Para ello haremos una copia de seguridad del script y lo configuraremos con los parámetros necesarios. Los comandos que vamos a ejecutar para realizar esta operación son los siguientes:

   # cd /etc/init.d
   # cp rsyslog rsyslog.orig
   # vi rsyslog

En el apartado PATH añadimos los directorios /usr/local/sbin y /usr/local/bin

En el apartado RSYSLOGD_BIN cambiamos el ejecutable /usr/sbin/rsyslogd por /usr/local/sbin/rsyslogd

Por último modificamos el fichero de configuración rsyslog creado por Debian durante la instalación, para activar el modo de compatibilidad con la nueva versión instalada y el modo de almacenar los ficheros de logs. Para ello ejecutamos los siguientes comandos:

   # cp /etc/default/rsyslog /etc/default/rsyslog.orig
   # vi /etc/default/rsyslog

Cambiamos el modo de compatibilidad de c3 a c4.

Por último sólo falta reiniciar el servicio, para ello ejecutamos el siguiente comando:

  # /etc/init.d/rsyslog restart

Instalar y configurar Apache + PHP

Una vez instalado y funcionando nuestro Rsyslog, es necesario instalar un servidor web como Apache con soporte PHP para poder ejecutar el software phpLogCon, para ello ejecutamos los siguientes comandos:

   # apt-get install apache2 php5 php5-pgsql php5-gd

Descargar e instalar Loganalyzer

Una vez instalado y funcionando nuestro RSyslog, vamos a instalar LogAnalyzer, para poder consultar nuestros logs desde una página web. Para ello nos dirigimos al sitio oficial y vamos a copiar el enlace de descarga para después descargarlo con wget.

Una vez copiado el enlace de descarga, nos ubicamos en el directorio /usr/local/src para descargarlo, ejecutando los siguientes comandos:

   # cd /usr/local/src
   # wget http://download.adiscon.com/loganalyzer/loganalyzer-4.1.5.tar.gz

Una vez haya finalizado la descarga nos ubicamos en el directorio /tmp y allí descomprimimos el paquete ejecutando los siguientes comandos:

   # cd /tmp
   # tar xzvf  /usr/local/src/loganalyzer-4.1.5.tar.gz

Una vez hemos descomprimido el paquete, vamos a copiar el contenido del directorio /tmp/phplogcon-2.6.5/src al directorio que crearemos en /var/www con el nombre phplogcon. Para ello ejecutamos los siguientes comandos:

   # mkdir /var/www/loganalyzer
   # cp -R /tmp/loganalyzer-4.1.5/src/* /var/www/loganalyzer

Configurar Loganalyzer

Ahora vamos a crear un sitio en nuestro Apache para poder ejecutar loganalyzer, para ello ejecutamos el siguiente comando:

   # echo 'Alias /loganalyzer "/var/www/loganalyzer"' > /etc/apache2/sites-enabled/001-loganalyzer
   # /etc/init.d/apache2 force-reload

Para poder ejecutar el asistente web de configuración, es necesario crear el fichero config.php. En el directorio /tmp/loganalyzer-4.1.5/contrib disponemos de un script para su creación, para ello ejecutamos los siguientes comandos:

   # cd /var/www/loganalyzer
   # chmod +x /tmp/loganalyzer-4.1.5/contrib/configure.sh
   # /tmp/loganalyzer-4.1.5/contrib/configure.sh

A continuación vamos a ejecutar el asistente web para finalizar la instalación, para ello mediante nuestro explorador web introducimos la dirección http://<IP_servidor>/loganalyzer. Para comenzar la instalación hacemos clic con el ratón en la palabra here.


  • Para continuar y hacer un test de los requisitos previos hacemos clic con el ratón en el botón Next.
  • En el siguiente paso hace un test de permisos sobre el fichero config.php, para continuar hacemos clic con el ratón en el botón Next.
  • En el siguiente apartado nos permite configurar algunos parámetros básicos, como el número de mensajes por página, el límite de caracteres a mostrar en un mensaje, mostrar la descripción en una ventana emergente, etc. Una de las opciones es crear una base de datos para usuario, de este modo limitamos el acceso a nuestro visor web. En nuestro caso no vamos a marcar dicha opción, si alguien desea hacerlo puede usar la misma base de datos rsyslog y el usuario que creamos anteriormente. Dejamos como aparece todo de forma predeterminada y hacemos clic con el ratón en el botón Next.


  • A continuación vamos a configurar cual es nuestra fuente syslog, en nuestro caso un servidor Postgres, por lo que tenemos que elegir en el apartado Source Type la opción Postgres. Le asignaremos a dicha fuente el nombre e2h PiPo e introducimos los datos de la base de datos, como el nombre, usuario y contraseña. Dejamos también la opción Enable Row Counting, ya que en bases de datos con gran tamaño se ve un importante descenso de rendimiento. Es muy importante que el nombre de la tabla esté escrita exactamente como aparece, con mayúsculas y minúsculas, ya que es sensible a los caracteres, la tabla es SystemEvents. Una vez introducidos todos los datos hacemos clic en el botón Next.


  • Para finalizar hacemos clic con el ratón en el botón Finish y ya tendremos nuestro servidor totalmente instalado y en producción.


Por último y para dejar seguro nuestro loganalyzer, tenemos que dejar los permisos del fichero config.php con los mínimos posibles para el funcionamiento. Para ello ejecutamos el siguiente comando:

   # chmod 644 /var/www/loganalyzer/config.php

También sería importante que el fichero rsyslog.conf sólo pudiera ser leído por el usuario root, ya que aparece la contraseña de conexión a Postgres, para ello ejecutamos el siguiente comando:

   # chmod 600 /etc/rsyslog.conf

Seguridad

Configuración de Firewall

Creamos un script llamado firewall dentro del directorio /etc/init.d. Trabajando con POLICY DROP para mayor seguridad. Este script mantiene abiertos los puertos 22 tcp (ssh) 80 (administración web) 5432 tcp (administración web rsyslog) y 514 udp (servicio rsyslog).

#!/bin/bash
### BEGIN INIT INFO
# Provides:             iptables
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5
# Default-Stop:         
# Short-Description:    Firewall rsyslog
### END INIT INFO


/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -Z
/sbin/iptables -t nat -F

#### Politica del firewall DROP pra la cadena INPUT #####

/sbin/iptables -P INPUT DROP


### Excluyendo la direccion lo del firewall #####

/sbin/iptables -t filter -A INPUT -i lo -j ACCEPT

### Aceptamos todo lo que este server envie como peticiones hacia el exterior #####

/sbin/iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
/sbin/iptables -t filter -A INPUT -m state --state INVALID -j DROP


# Reglas que impiden el escaneo

/sbin/iptables -t filter -A INPUT -m state --state NEW  -p tcp --tcp-flags ACK,FIN FIN -j LOG --log-prefix "FIN: "
/sbin/iptables -t filter -A INPUT -m state --state NEW -p tcp --tcp-flags ACK,FIN FIN -j DROP

/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ACK,PSH PSH -j LOG --log-prefix "PSH: "
/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ACK,PSH PSH -j DROP

/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ACK,URG URG -j LOG --log-prefix "URG: "
/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ACK,URG URG -j DROP

/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL ALL -j LOG --log-prefix "XMAS scan: "
/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL ALL -j DROP

/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL NONE -j LOG --log-prefix "NULL scan: "
/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL NONE -j DROP

/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG --log-prefix "pscan: "
/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG --log-prefix "pscan 2: "
/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags FIN,RST FIN,RST -j LOG --log-prefix "pscan 2: "
/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags FIN,RST FIN,RST -j DROP

/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL SYN,FIN -j LOG --log-prefix "SYNFIN-SCAN: "
/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL SYN,FIN -j DROP

/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL URG,PSH,FIN -j LOG --log-prefix "NMAP-XMAS-SCAN: "
/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL URG,PSH,FIN -j DROP

/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL FIN -j LOG --log-prefix "FIN-SCAN: "
/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL FIN -j DROP

/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL URG,PSH,SYN,FIN -j LOG --log-prefix "NMAP-ID: "
/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags ALL URG,PSH,SYN,FIN -j DROP

/sbin/iptables -t filter -A INPUT   -p tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix "SYN-RST: "

##### Puertos de Administracion

/sbin/iptables -t filter -A INPUT -p tcp -s 0/0 -i eth0 --dport 22 -m state --state NEW -j ACCEPT
/sbin/iptables -t filter -A INPUT -p tcp -s 0/0 -i eth0 --dport 80 -m state --state NEW -j ACCEPT
/sbin/iptables -t filter -A INPUT -p tcp -s 0/0 -i eth0 --dport 5432 -m state --state NEW -j ACCEPT

#Puertos de rsyslog

/sbin/iptables -t filter -A INPUT -p udp -s 0/0 -i eth0 --dport 514 -m state --state NEW -j ACCEPT


Crear el link de arranque del firewall

Para que el firewall levante durante el arranque tenemos que crear un link soft en el directorio /etc/rc2.d ejecutando el siguiente comando.

# cd /etc/init.d

# update-rc.d firewall defaults

Creación de un usuario llamado redes

Es el único usuario que va a poder acceder al server usando ssh

adduser redes

Creación del grupo wheel

groupadd wheel

Este grupo se crea para que los usuarios que pertenezcan a este grupo sean los únicos que pueden usar el comando su.

Agregando el usuario redes al grupo wheel

usermod -G wheel redes

Modificación del archivo /etc/pam.d/su

Para que solo los miembros del grupo wheel puedan acceder al comando su tenemos que modificar el archivo /etc/pam.d/su. Abajo copio la linea agregada al archivo y marco con negritas.

auth required pam_wheel.so use_uid

Configuración de SSH

En cuanto al servicio de ssh trabajamos con las siguientes variables en el archivo /etc/ssh/sshd_config. ClientAliveInterval: tiempo de vida de la conexión cuando el usuario esta sin ejecutar ningun comando. ClientAliveCountMax: Configura el reloj en 0 cuando inicia la conexión ListenAddress: El servidor esta disponible para esta dirección. PermitRootLogin: No permite que el usuario root se conecte directamente al servicio de ssh. AllowUsers: Lista de usuarios que pueden usar el servicio de ssh.


ClientAliveInterval 300
ClientAliveCountMax 0
ListenAddress 10.20.0.11
PermitRootLogin no
AllowUsers redes

Configuración de envio de correo electrónico cuando se establecen conexiones por ssh

Para que cuando se establezca una conexión por ssh se envie un mail al usuario root podemos escribir la siguiente sintaxis en el archivo /root/.bashrc.

echo "ALERTA - SHELL de ROOT en el server: `hostname` logueado con el usuario: `who`"  | mail -s "Alerta: SHELL de root en el equipo `hostname` desde `who | cut -d'(' -f2 | cut -d')' -f1`" root

Modificación del alias de root

En este server los mails de root llegan al usuario sistemas. Para que los mails dirigidos a root lleguen al usuario redes tenemos que modificar el archivo /etc/aliases de la siguiente manera:

root: administrador@ejemplo.com

Una vez modificado el archivo necesitamos ejecutar el comando:


newaliases 

Esto significa que el usuario redes recibe los mails dirigidos a root.

Configuración de Logrotate

Logrotate es una herramienta para rotar los logs el archivo de configuración es /etc/logrotate.conf. El logrotate genera archivos vacios de log por default cada semana. El problema es que este va a ser un servidor de logs provenientes desde distintos host. Por lo tanto vamos a tener gran cantidad de información. Para evitar esto descomente la variable compress del archivo de configuración, ademas rote los logs diariamente y guarde los logs de un mes. Porque configuramos esto para trabajar con un segundo servicio que es el logwatch.

# see "man logrotate" for details
# rotate log files weekly
daily

# keep 4 weeks worth of backlogs
rotate 30

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

# system-specific logs may be configured here




Configuración de Logwatch

El servicio de logwatch verifica diariariamente cuales son los estados de los distintos servicios ademas si se instalan o desisntalan programas tambien si se agregan usuarios, cuantos se conectaron al servidor por ssh. Tambien es configurable para servicios particulares. En este caso particular lo use para que nos informe estas variables y que envie un mail diariamente con las modificaciónes. Simplemente lo instalamos con el comando apt.


# apt-get install logwatch 

Utilice la configuración por default y modifique la variable que envia los reportes por mail en vez de hacerlo en la terminal. El archivo de configuración esta guardado en el directorio: /usr/share/logwatch/default.conf el archivo de configuración es logwatch.conf.


########################################################
# This was written and is maintained by:
#    Kirk Bauer <kirk@kaybee.org>
#
# Please send all comments, suggestions, bug reports,
#    etc, to kirk@kaybee.org.
#
########################################################

# NOTE:
#   All these options are the defaults if you run logwatch with no
#   command-line arguments.  You can override all of these on the
#   command-line. 

# You can put comments anywhere you want to.  They are effective for the
# rest of the line.

# this is in the format of <name> = <value>.  Whitespace at the beginning
# and end of the lines is removed.  Whitespace before and after the = sign
# is removed.  Everything is case *insensitive*.

# Yes = True  = On  = 1
# No  = False = Off = 0

# Default Log Directory
# All log-files are assumed to be given relative to this directory.
LogDir = /var/log

# You can override the default temp directory (/tmp) here
TmpDir = /var/cache/logwatch

#Output/Format Options
#By default Logwatch will print to stdout in text with no encoding.
#To make email Default set Output = mail to save to file set Output = file
Output = mail
#To make Html the default formatting Format = html
Format = text
#To make Base64 [aka uuencode] Encode = base64
Encode = none

# Default person to mail reports to.  Can be a local account or a
# complete email address.  Variable Output should be set to mail, or
# --output mail should be passed on command line to enable mail feature.
MailTo = root
# WHen using option --multiemail, it is possible to specify a different
# email recipient per host processed.  For example, to send the report
# for hostname host1 to user@example.com, use:
#Mailto_host1 = user@example.com
# Multiple recipients can be specified by separating them with a space.

# Default person to mail reports from.  Can be a local account or a
# complete email address.
MailFrom = Logwatch

# if set, the results will be saved in <filename> instead of mailed
# or displayed. Be sure to set Output = file also.
#Filename = /tmp/logwatch

# Use archives?  If set to 'Yes', the archives of logfiles
# (i.e. /var/log/messages.1 or /var/log/messages.1.gz) will
# be searched in addition to the /var/log/messages file.
# This usually will not do much if your range is set to just
# 'Yesterday' or 'Today'... it is probably best used with
# By default this is now set to Yes. To turn off Archives uncomment this.
#Archives = No
# Range = Yesterday

# The default time range for the report...
# The current choices are All, Today, Yesterday
Range = yesterday

# The default detail level for the report.
# This can either be Low, Med, High or a number.
# Low = 0
# Med = 5
# High = 10