martes, 20 de noviembre de 2012

Configurar rsyslog centralizado y programar logrotate para backup semanal

Primero describiré el escenario para que se entienda la configuración.
Se requería que un servidor centralice los log del resto de servidores para poder almacenar estos log en una cinta tape (tape library). Estos log de servidor pueden servir para una auditoría posterior. Pero estos archivos deben ser almacenados con el nombre de archivo indicando el log al cual pertenece y la fecha ala que pertenece (por ejemplo: secure_20121120  seria el log de autenticación de los servidores pertenecientes al 20 de noviembre).

Como cuento con servidor RHEL (RedHat) la configuración sera hecha para esta distro, pero si se desea se pueden combinar distribuciones de linux incluso incluir algún windows (probé con ubuntu linux como servidor central).



Iniciamos instalando el paquete rsyslog que en este caso para RedHat es el:

rsyslog-3.22.1-7.el5.x86_64.rpm

este archivo se puede descargar de cualquier repositorio libre de rpm, o para mayor seguridad de la misma pagina de RedHat caso se tenga una subscripción, como es mi caso.

Para instalar nada mas ejecutamos:

rpm -ivh rsyslog-3.22.1-7.el5.x86_64.rpm

Antes de iniciar debemos detener el servicio syslog que viene por defecto ya que ahora funcionara con rsyslog. Para esto podemos ejecutar:

service syslog stop   (solo sera de manera temporal, podemos usar ntsysv para detener el servicio en el próximo arranque, esto es recomendable)

Luego iniciamos el servicio rsyslog:

service rsyslog start  (Debemos hacerlo también en ntsysv para que inicie en el próximo arranque).

Hasta ya tenemos instalado y ejecutando, ahora debemos configurarlo, que en si es nada mas agregar un par de lineas en su configuración:

En el archivo /etc/rsyslog.conf , agregamos las siguientes lineas
$ModLoad imudp
$UDPServerRun 514

Esto permitirá al rsyslog escuchar en el puerto 514 bajo el protocolo UDP, si quisiera sobre TCP también se puede pero como estandart el servicio debe ser UDP. Adicionalmente si desean redirigir los archivos log de algunos servicios pueden hacerlo en este archivo como verán lineas abajo (rsyslog.conf) menciona cual serán los archivos destino donde se centralizaran los tipos de logs de todos los servidores.

Hecho esto reinciamos el servicio con el comando:

service rsyslog restart

Si queremos ver si esta ejecutándose correctamente podemos mapear los puertos de nuestro server con:  nmap 127.0.0.1 -sU  (debe tenerse nmap instalado para hacer esto).

Hasta aqui nuestro servidor esta configurado y esperando a los clientes, para que le envien su log y este lo almacene, por lo cual en cada cliente debe editarse el archivo:

/etc/syslog.conf
y agregamos una linea similar a esta:
authpriv.*                        @ip_servidor_rsyslog
Deben seguir el modelo de configuración del archivo syslog.conf ya que en realidad se debe replicar cada linea que tenga cambiando únicamente el destino del log. Con esto lograremos que el log se almacene localmente y también se envié al servidor centralizado rsyslog que anteriormente configuramos. En caso de que el servicio rsyslog del server que centralizara sea por protocolo tcp se debe colocar dos @ al inicio del ip, esto es lo único que diferencia de udp para tcp.

Entonces regresemos al servidor rsyslog que habíamos configurado ahora programaremos que se generen archivos compresos cada semana con el log de los servidor para esto debemos hacer algunas tareas.

Primero ajustemos que se generen archivos backup cada semana, eso lo hacemos editando el archivo:

/etc/logrotate.conf

ahí debemos tener algo así:

weekly
rotate 4
create

Es nos indica que se generara un archivo con el log cada semana y que se almacenara 4 archivos únicamente y que posterior al backup 4 se eliminará el mas antiguo, esto evitara que tengamos muchos archivos y saturemos el disco duro del servidor rsyslog.


Ahora examinaremos específicamente las reglas de backup (rotate) para los archivos que nos interesan, para esto examinamos el archivo:

/etc/logrotate.d/syslog
en este archivo verificamos que existan estas lineas, caso contrario las adicionamos
    sharedscripts
    dateext
    compress

Estas lineas nos indican que (dataext) que los archivos que se generaran tendrán como parte de su nombre la fecha en la que se generaron (rotaron) y la ultima linea, indica que estos archivos generados deben ser compresos.

Con esto ya casi tenemos nuestros log centralizados y su backup respectivo cada semana, ahora solo nos queda ajustar que día de la semana y a que hora se hará el backup.

Para esto debemos editar el archivo de configuracion del cron de linux, que obviamente debe estar activo como servicio sino debe revisar ejecutando el comando ntsysv.

/etc/crontab
01 0 * * 1 root run-parts /etc/cron.weekly  (min, hora, día, mes, día de semana)

En este archivo edito la hora y fechas que se ejecuta las tareas semanales de linux, como verán edite para que se ejecute los lunes a las 00 horas con 1 minuto. Esto porque mis backup deben ser recogidos al library (tape library - cintas) los días lunes por la mañana.

Listo con esto tengo todo listo. Existen algunas pruebas que puedo realizar como forzar que se ejecute el backup (que se roten los archivos de log) usando el comando:

logrotate -f /etc/logrotate.conf

Con esto debe generar un archivo compreso en la carpeta /var/log/ (si es que no cambiamos la ruta de los log).

El siguiente paso para agregarle seguridad seria encriptar los archivos log usando criptografía asimétrica (con openssl) que en mi caso seria lo mejor, pero eso lo comentare en otro post.

NOTA.- Esta nota con mayusculas

Si estan usando udp en el servicio rsyslog, podrian tener lentitud en el registro de eventos, al menos yo tuve este inconveniente, asi que intente habilitando por tcp y de esta manera obtuve un registro inmediato.

Otra aclaración es que si están trabajando con Ubuntu habilitar el puerto tcp podría ser un problema debido a un pequeño bug y no conseguir el puerto correctamente. Para comprobar que el puerto este abierto podemos intentar ejecutando esto en nuestro server centralizador.

#nmap 127.0.0.1     (esto para ver los puertos tcp abiertos)
#nmap 127.0.0.1 -sU   (esto para ver los puertos udp abiertos)

Si no se muestra el 514 o el puerto que hayan configurado, probablemente haya un problema, y se puede ver el detalle viendo el /var/log/syslog o el sistema general de mensajes del propio server y veran una linea indicando que el puerto tcp no se pudo abrir, en mi caso como usaba ubuntu 12.04 lo que hice fue: Comentar dos lineas de configuracion en /etc/rsyslog.conf que fueron:
$PrivDroptoGroup y $PrivDroptoUser, con estas dos lineas comentadas reinicie el servicio rsyslog (service rsyslog restart) y luego volviendo a ejecutar nmap vi que ya tenia el puerto abierto, así que bueno solucione mi problema y mejore mi servicio de servidor centralizado de log. Otra solución que encontré a este problema de no poder levantar el puerto tcp 514 fue subiendo el numero de puerto es decir donde se indica el numero 514 lo reemplace por el 1024 o cualquier numero superior y si se logro levantar el servicio en tcp pero ya no en el 514 sino en el 1024 que puse.

NOTA 2.-Otra nota importante es si esta usando Ubuntu (12.04), hay una pequeña corrección que debe hacerse en el archivo /etc/logrotate.d/rsyslog

postrotate
# reload rsyslog >/dev/null 2>&1 || true
/sbin/restart rsyslog >/dev/null 2>&1 || true

Debe comentar la linea "reload rsyslog >/dev/null 2>&1 || true" y agregar o reemplazarla por la siguiente "/sbin/restart rsyslog >/dev/null 2>&1 || true", esto permitirá que rsyslog reinicie su servicio una vez hecha la rotación de archivos log, si no hace esto una vez que se roten los archivos el servicio rsyslog no se almacenara ningún registro mas. Esto parece ser un bug de configuración  pero bueno se soluciona con este reemplazo.

Mas adelante comentare otra solución que di sin usar rsyslog en el server de centralización y en lugar de este use tcpdump.

No hay comentarios.:

Publicar un comentario