Construyendo un servidor de logs usando Netcat, tail y Bash
Me toco entre estos días escribir un hack (no por lo malo sino por lo rápido que tenia que hacerlo) un servidor que debía proporcional el contenido de una bitacora la cual crece de manera continua durante el día. El grupo que nos pidio esto es de auditoria, lo cual implica que no debe perderse información.
Primero les muestro el código del programa y explico como funciona:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #!/bin/bash # author: josevnz@kodegeek.com # set -o monitor declare -a pids declare -r SCRIPT=${0##*/} declare -r FIFO="/tmp/$SCRIPT-$$.fifo" if [ -z "$1" ]; then echo "Please provide the file to tail and try again" exit 192 fi if [ -z "$2" ]; then echo "Please provide port and try again" exit 192 fi trap cleanup exit INT TERM if [ ! -e "$FIFO" ]; then mkfifo "$FIFO" if [ $? != 0 ]; then exit $? fi fi tail -F "$1" > "$FIFO" & trap "test -e $FIFO && rm -f $FIFO" exit INT TERM while true; do test -e "$FIFO" && netcat -v -v -v -l -p $2 < "$FIFO" done trap "kill -9 $! $$" exit INT TERM |
La idea es revisar los contenidos del archivo usando ‘tail -F’. La opción ‘-F’ le dice a tail que reintente si tiene problemas eyendo el archivo; De allí redirigimos los contenidos a una cola (FIFO, first in first out) en Unix la cual garantiza que aunque el servidor TCP muera los datos estaran allí listos para ser enviados al cliente. Dejamos a tail corriendo en segundo plano…
El siguiente paso es arrancar nuestro servidor TCP. Netcat recibe los contenidos de la cola que creamos en el paso anterior. Fijense como lo encerramos en un ciclo infinito ya que si el cliente se muere (o desconecta por otra razón) Netcat cerrará la conexión.
Finalmente le decimos al script que mate todos los procesos hijos o el mismo programa si decidimos matar al servidor o nos matan el proceso.
Bueno, aqui les muestro como correr el servidor:
auyan:~ josevnz$ ./nettail fakelog.log 9000
Listening on any address 9000 (cslistener)
Connection from 127.0.0.1:50754
Total received bytes: 0
Total sent bytes: 432
Listening on any address 9000 (cslistener)
Connection from 127.0.0.1:50819
Y un ejemplo de como conectarse:
auyan:~ josevnz$ nc -v -v -v localhost 9000
nc: connect to localhost port 9000 (tcp) failed: Connection refused
Connection to localhost 9000 port [tcp/cslistener] succeeded!
This is a kodegeek test: Sat Mar 14 00:02:15 EDT 2009
This is a kodegeek test: Sat Mar 14 00:02:45 EDT 2009
This is a kodegeek test: Sat Mar 14 00:03:15 EDT 2009
This is a kodegeek test: Sat Mar 14 00:03:45 EDT 2009
This is a kodegeek test: Sat Mar 14 00:04:15 EDT 2009
This is a kodegeek test: Sat Mar 14 00:04:45 EDT 2009
This is a kodegeek test: Sat Mar 14 00:05:15 EDT 2009
This is a kodegeek test: Sat Mar 14 00:05:45 EDT 2009
This is a kodegeek test: Sat Mar 14 00:06:15 EDT 2009
Espero les guste esta solución de 5 minutos
Veneblogs: bash, netcat, tail, kodegeek, server
Blogalaxia: bash, netcat, tail, kodegeek, server
To2blogs: bash, netcat, tail, kodegeek, server
Technorati: bash, netcat, tail, kodegeek, server
Del.icio.us: bash, netcat, tail, kodegeek, server
java, linux, opensource, ruby, venezuela







Interesante la propuesta, pero no entiendo por que tuviste que hacer eso, si syslog se puede configurar para que escuche transmisiones de logs desde otros servidores y así tener un servidor de logs para la red ( los datos se transmiten por UDP ), incluso una propuesta mejor sería syslog-ng que permite cifrado de los datos y usa TCP para la transmisión de los mismos.
Configurar syslog para que haga esto lleva menos de 5 minutos :-/
Richzendy,
Gracias por visitar mi blog, te explico a continuación porqué hice esto y no me fuí con Syslog
¿Porque no Syslog-ng?: Es matar un ratón con una escopeta de elefante. No necesito criptografia (la red interna de la compañia ya es segura) y netcat usa TCP or omisión al menos que tu le indiques lo contrario.
¿Porqué no Syslog?: Nuestra aplicación es la que genera estos datos y el cliente que los consume no es Syslog. Syslog requiere configuración para que esto trabaje, lo cual implica que hay que pedirle a un SA (administrador de sistemas) que lo haga por nosotros. Es una configuración no estándar la cual puede no ser soportada en una compañía grande. El cliente espera recibir datos en TCP no UDP, no queremos mandar otros mensajes no relacionados con el sistema (si le dices a Syslog que mande mensajes a otro servidor este pueden mandar potencialmente mucha más cosas, de nuevo requiere entonación).
Esta solución es simple, fácil de implementar y sobre todo divertida
Saludos.
Saludos,
Me parece una solución sucia cuando existe rsyslog (lo puedes configurar para que salga por UDP ó TCP y puedes encriptar el tunnel si lo deseas usando TLS), eso de que la red interna de la compañia ya “es segura” es un mito, podría hacerte demostraciones de como capturo/modifico tus datos de la LAN sin necesidad de pegar un jack a la red.
Piensa siempre que las aplicaciones deben procurar tener un margen mínimo de seguridad porque sino vas a tener logs ó cualquier tipo de data alterada.
@apostols
Hola ‘Apostols’,
El articulo dice bien claro que es un “hack”. En el tiempo que tu dejaste tu comentario yo terminé de escribir un servidor en Java el cual usa TCP, criptografía de más de 2048 bits y mensajes certificados (para segurarme de que los clientes no pierdan nada por razones de auditoria). A la final mi “solución sucia” me permitió salir del apuro en menos de 10 minutos, manteniendo contento al negocio (al cual lo que le interesa es generar dinero y no como esta implementado Sysloh-NG
).
Si hubiera querido hubiera utilizado Stunel o ‘SSH con tunneling’ para agregarle mayor seguridad, pero de nuevo eso no era necesario inicialmente.
No sé si alguna vez has trabajado en una compañía grande (de más de 50 mil empleados en varios países) pero en estos entornos hay niveles de organizaciones con los cuales hay que lidiar y esta es una manera rápida de hacer las cosas (sin esperar varias semanas hasta que la solución sea aprobada).
Como dice el dicho “Talk is cheap”, así que te invito a que escribas un articulo de como hacer lo que hice yo pero usando Syslog-NG. Te aseguro que muchos se van a beneficiar
José.
Hola.
Mi red costa de unos 60 mil servidores en diferentes paises, y si saco la cuenta de los clientes me quedo corto. No usé syslog-NG sino rsyslog. Pienso que tú con la aplicación que creaste reinventaste la rueda pero es cuestion de cada quien.
Sería bueno ver el código de esa aplicación bajo GPL-3, creo que a mucha gente le sería útil y podría ayudarte con el mantenimiento y evolución de la misma.
Éxitos!
@apostols
> Mi red costa de unos 60 mil servidores en diferentes paises, y si saco la cuenta de los clientes me quedo corto
Hola. Hmm. Prefiero no preguntar
> No usé syslog-NG sino rsyslog
La misma cosa. Syslog no era la mejor solución al problema
> Pienso que tú con la aplicación que creaste reinventaste la rueda pero es cuestion de cada quien.
Hack de 5 minutos. Más fácil que Syslog (r,ng, etc). Es cuestión del problema que tengas al frente y habran muchos que se resuelven mejor con este código.
> Sería bueno ver el código de esa aplicación bajo GPL-3, creo que a mucha gente le sería útil y podría ayudarte con el mantenimiento y evolución de la misma.
No lo creo. Es una aplicación vertical en la cual el “Know How” (como se hacen las cosas) es precisamente lo que la hace diferente a las demás. Contrario a la fantasía de muchos, no todo el código tiene que ser abierto (para que se sea bueno) ni todo el código cerrado es malo. No es un delito escribir código eficiente y competitivo, eso te lo puede decir incluso las compañías que hacen software Open Source (ojo, no libre o gratuito).
Pero ese es tema de otra discusión. Por cierto, aún le debes a todo el mundo el tutorial de RSyslog (http://www.rsyslog.com/doc) el cual hace lo mismo que mi programa
¡Saludos!
Está bien tu solución, que bueno que en 10 minutos sacaste el problema, eso es lo que cuenta, además si poco a poco lo vas mejorando, mejor aún. Que mal escuchar gente criticona, a mi se me hace que el que escribió que era una solucion sucia, seguro es de los que hacen gastar a sus empresas miles en la compra de productos como “Norton Internet “Security”".
como que formato guardo esta instruccionn ….. gracia esta bien hecho
@kofla
Kofla,
Este programa corre bajo Linux. Cuando lo guardes cambie su permiso de ejecución para tu usuario y asegurate de tener los programas relacionados para que el script funcione bien