Notificaciones de eventos de OSSEC en telegram

Una de las cacharradas que me apetecía probar desde hace tiempo era trastear con bots de Telegram, y gracias a jovimon que le está dando duro al tema últimamente y me ha echado una mano con la creación de bots, me he puesto manos a la obra. La idea es usar un bot de telegram para que me notifique de cualquier evento relevante sobre la infraestructura desplegada. Ya que tengo montado un OSSEC monitorizando mis servidores, he empezado por algo sencillito y facil.

Paso previo:

Crear un bot de telegram

Lo más sencillo es seguir la documentación oficial de telegram donde podremos crear el bot que será el encargado de notificarnos los eventos. Para poder hacer esto, se necesitan dos datos:

  • APIKEY del bot. Se muestra a la hora de crearlo
  • Chat_id: Este dato se refiere al id de la ventana de conversación creada entre nuestra cuenta de telegram y el bot. Para averiguarlo, debemos primero abrir una ventana de chat con el bot, y escribirle cualquier cosa. Una vez hecho esto, accedemos a la siguiente URL desde un navegador:
https://api.telegram.com/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getUpdates

Se debe modificar en la URL la apikey por la de nuestro bot.

La página resultante será del estilo como el siguiente:

{"ok":true,"result":[{"update_id":123454123,
"message":{"message_id":56,"from":{"id":5555555,"first_name":"minombre","username":"mialias"},"chat":{"id":5555555,"first_name":"minombre","username":"mialias","type":"private"},"date":1457646038,"text":"aaaaaa"}}]}

Esta información se refiere a los últimos mensajes recibidos por el bot. El dato que nos interesa es el chat_id, que en el ejemplo es 5555555 (No confundirse con update_id)

Una vez hecho esto, ya podemos crear un trigger en OSSEC que lance un mensaje a telegram cuando queramos.

Configuración de OSSEC

Deben definirse un comando, que será un script en bash que sea el encargado de lanzar el trigger, y una regla que lanzará el comando según las condiciones que queramos. Para ello, editamos el fichero ossec.conf y añadimos los siguientes trozos de código en sus respectivas secciones:

<command>
        <name>send-event</name>
        <executable>sendEvent.sh</executable>
        <expect></expect>
</command>
<active-response>
        <command>send-event</command>
        <location>local</location>
        <level>6</level>
</active-response>

Por un lado se ha definido el comando send-event asociado al script sendEvent.sh y por otro lado se ha definido una respuesta activa que en caso de que se lance un evento de nivel 6 o superior, se lance el comando send-event

Script

Una vez hecho esto, solo queda dejar caer el script sendEvent.sh en la carpeta active-response/bin que está en la carpeta de instalacción de ossec:

 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
34
35
#!/bin/sh

TOKEN="123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
CHAT_ID="5555555"

ACTION=$1
USER=$2
IP=$3
ALERTID=$4
RULEID=$5

LOCAL=`dirname $0`;
cd $LOCAL
cd ../
PWD=`pwd`


# Logging the call
echo "`date` $0 $1 $2 $3 $4 $5 $6 $7 $8" >> ${PWD}/../logs/active-responses.log


# Getting alert time
ALERTTIME=`echo "$ALERTID" | cut -d  "." -f 1`

# Getting end of alert
ALERTLAST=`echo "$ALERTID" | cut -d  "." -f 2`

# Getting full alert
ALERT=`grep -A 5 "$ALERTTIME" ${PWD}/../logs/alerts/alerts.log | grep -v ".$ALERTLAST: " -A 5`

curl -s \
-X POST \
https://api.telegram.org/bot$TOKEN/sendMessage \
-d text="$ALERT" \
-d chat_id=$CHAT_ID

De nuevo, hay que cambiar los parámetros TOKEN y CHAT_ID por los nuestros. El script no es más que una adaptación del script de la documentación oficial de OSSEC para crear una respuesta activa personalizada.

Hecho esto, solo queda reiniciar el servicio de OSSEC y comprobar que los eventos empiezan a llegarnos a nuestra cuenta de telegram \o/

social