Centreon, como enviar alertas usando un bot de Telegram

He seguido jugando un poco con el Centreon que tengo en un contenedor Docker en mi Raspberry y esta vez he conseguido configurar el envío de notificaciones a través de un bot de Telegram, por que eso de enviar correos es muy aburrido, ¿a que si?, así que venga, vamos a configurarlo con unos sencillos pasos.

CREACIÓN y configuración del bot de Telegram

Lo primero que hay que hacer es hablar con The Botfather para crear nuestro Bot:

Los pasos a seguir son los siguientes:

  1. /start -> inicia la conversación con The Botfather
  2. /newbot -> Nos pide el nombre del Bot y a continuación su nombre de usuario.
  3. Copiamos el API KEY

The Botfather nos devuelve un mensaje indicándonos que el bot ha sido creado satisfactoriamente y nos da un API Key para comunicarnos con él. A continuación meteremos al Bot en un grupo donde nos escribirá cada vez que haya una novedad:

Tened en cuenta que el Bot debe tener acceso a los mensajes, así que en este caso le hacemos Administrador.

Para poder enviar los mensajes directamente a este grupo debemos obtener el Chat ID de éste, así que la forma más rápida es ir a la URL que os dejo a continuación, sustituyendo ${API_KEY} por la Key que os ha dado The Botfather cuando habéis creado el bot:

https://api.telegram.org/bot${API_KEY}/getUpdates

Una vez allí veremos todos los mensajes nuevos y podremos obtener el Chat ID del grupo que hemos creado, en este caso en rojo veis el mensaje que he enviado y en azul el Chat ID:

Con el Chat ID y el API Key de nuestro bot en mano, ya podremos enviar mensajes directamente con el bot usando la siguiente llamada:

curl -s -X POST https://api.telegram.org/bot${API_KEY}/sendMessage -d text="Hola David, aquí estoy" -d chat_id=-${CHAT_ID}

CONFIGURACIÓN en Centreon

En realidad esto es realmente sencillo, simplemente basta con crear un comando de notificación normal, y asociarlo a nuestro usuario de Centreon, en mi caso admin, para que use este comando de notificación una vez haya algún host caído. Por ejemplo podríamos crear un comando como el siguiente:

curl -s -X POST https://api.telegram.org/bot${API_KEY}/sendMessage -d text="Oye! David el Host $HOSTNAME$ esta $HOSTSTATE$. Te dejo un poco más de información: $HOSTOUTPUT$" -d chat_id=-${CHAT_ID}

Y con esto una vez haya un host caido en nuestra red, nuestro Bot de Telegram nos lo dirá:

Ya veis que podéis jugar con la cantidad e información que envía el Centreon modificando el mensaje y añadiendo las variables de Centreon que más os guste.

Así que ya sabéis como saber el estado de vuestros equipos a través de Telegram.

Instalando Centreon en Docker sobre una Raspberry Pi 3

En esta ocasión vamos a instalar Centreon en un contenedor de Docker el cual instalamos hace poco. En mi Raspberry actualmente tengo instalado Pi-hole y esta funcionando como servidor DHCP a la vez que DNS. Sin Docker, la instalación de Centreon se me presentaba bastante difícil, y veía bastante imposible que conviviera junto con Pi-hole.

Para instalar Centreon en Docker he hecho dos cosas:

  1. Crear un Docker file para la configuración e instalación del contenedor.
  2. Hacer un fork de un script de instalación del usuario Kermith72 concretamente de su repositorio: auto_install con algunas modificaciones necesarias para poder instalar Centreon en Docker.

El docker file que he creado es el siguiente:

FROM debian:latest

ENV container docker
ENV LC_ALL C
ENV DEBIAN_FRONTEND noninteractive

RUN echo "deb http://ftp.es.debian.org/debian/ buster main contrib non-free" >> /etc/apt/sources.list
RUN apt-get update \
    && apt-get install -y systemd git gpg wget curl \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN rm -f /lib/systemd/system/multi-user.target.wants/* \
    /etc/systemd/system/*.wants/* \
    /lib/systemd/system/local-fs.target.wants/* \
    /lib/systemd/system/sockets.target.wants/*udev* \
    /lib/systemd/system/sockets.target.wants/*initctl* \
    /lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup* \
    /lib/systemd/system/systemd-update-utmp*

RUN cd /root && wget https://raw.githubusercontent.com/deividgdt/dockerpicentreon/master/centreon_central.sh
RUN chmod +x /root/centreon_central.sh

VOLUME [ "/sys/fs/cgroup" ]

CMD ["/lib/systemd/systemd"]

Como siempre, ya sabéis que lo podréis encontrar en mi Github actualizado: Dockerfile

Para el script de instalación de Centreon he tenido que realizar algunas modificaciones, ya que he usado la versión Raspbian de Kermith72 sobre un contenedor base de Debian:buster. El script de instalación os lo dejo por aquí también: centreon_central.sh

INSTALACIÓN

Bien, a lo que vinimos, crearé un directorio llamador Docker en /root y dentro el fichero Dockerfile con el contenido que os he dejado arriba.

mkdir -p /root/docker
cd /root/docker
wget https://raw.githubusercontent.com/deividgdt/dockerpicentreon/master/Dockerfile

A continuación construimos la imagen:

root@raspberrypi:~/docker# docker build -t centreon:0.0 .
Sending build context to Docker daemon   2.56kB
Step 1/11 : FROM debian:latest
latest: Pulling from library/debian
3182cf45068c: Pull complete
Digest: sha256:a63d0b2ecbd723da612abf0a8bdb594ee78f18f691d7dc652ac305a490c9b71a
Status: Downloaded newer image for debian:latest
 ---> 756aa643c9cd
Step 2/11 : ENV container docker
 ---> Running in a0cf5171a92e
Removing intermediate container a0cf5171a92e
------------------------------[SALIDA OMITIDA]--------------------------

Comprobamos que nuestra imagen esta correctamente creada:

root@raspberrypi:~# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centreon            0.0                 e940169369c9        52 minutes ago      241MB
debian              latest              756aa643c9cd        10 days ago         92.8MB

Una vez construida la imagen base, vamos a levantar el contenedor con el volumen /sys/fs/cgroup que nos proporciona acceso a los control groups. Ademas le pasamos el parámetro –privileged para que el contenedor pueda hacer uso de las funciones del Kernel, en nuestro caso para que podamos usar systemd.

root@raspberrypi:~/docker# docker run -d --name centreon --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro centreon:0.0

Si comprobamos nuestro contenedor debería estar arrancado con el comando “/lib/systemd/systemd”.

Ahora levantamos una shell de bash en modo interactivo, ejecutando:

root@raspberrypi:~/docker# docker exec -it centreon bash

Ahora ejecutaremos el script central_centreon.sh que estará en /root/:

root@eaf8c81f0380:/# /root/centreon_central.sh

El script ejecutará un total de 12 pasos. Todos ellos deberían de finalizar correctamente para que la instalación sea correcta. El final del script debería verse como a continuación:

Ahora debemos comitar el contenedor para convertirlo en una nueva imagen. Este proceso puede durar bastante tiempo, en mi caso tomó: unos 12 minutos.

Entonces, para comitar usaremos el CONTAINER_ID:

root@raspberrypi:~/docker# docker commit eaf8c81f0380

Ahora tendremos una nueva imagen, con todos los cambios realizados, como podréis observar a continuación:

Como no tenemos ningún nombre ni tag asociado al IMAGE_ID, vamos a darle un nombre y tag:

root@raspberrypi:~/docker# docker image tag e4a5a414c93b centreon:1.0
root@raspberrypi:~/docker# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centreon            1.0                 e4a5a414c93b        15 minutes ago      2.4GB

Recordemos que tenemos el contenedor centreon:0.0 corriendo, así primero debemos detenerlo

root@raspberrypi:~/docker# docker stop centreon

Habiendo comitado y detenido el contenedor Centreon, procederemos a levantar la nueva imagen con los siguientes parámetros:

  • -d –> lanzamos el contenedor en modo demonio para que se quede en segundo plano.
  • –name –> Nombre del contenedor.
  • –privileged –> para que el contenedor pueda hacer uso de las funciones del Kernel. Necesario para usar systemd.
  • -p 8080:80 –> Redirigimos el puerto 8080 de nuestra Rasp al 80 del contenedor, que es donde corre Centreon.
  • -p 3306:3360 –> Redirigimos el puerto 3306 de nuestra Rasp al 3306 del contenedor, que es donde esta escuchando MySQL
  • -v /sys/fs/cgroup:/sys/fs/cgroup:ro –> Montamos este volumen que nos proporciona acceso a los control groups. Necesario para usar systemd.
root@raspberrypi:~/docker# docker run -d --name centreon1 --privileged -p 8080:80 -p 3306:3306 -v /sys/fs/cgroup:/sys/fs/cgroup:ro centreon:1.0

Con esto ya tendríamos nuestro contenedor corriendo Centreon. Ahora, si nos vamos a la URL: http://raspberry_ip:8080/centreon podremos configurar Centreon Central:

La configuración es realmente sencilla y no hay que tocar nada, a no ser de que queráis personalizar algún directorio. Aparte de esto os pedirá:

  • Contraseña del usuario admin de Centreon
  • Contraseña del usuario root de MySQL
  • Contraseña del usuario centreon propietario de la bbdd centreon_storage

Una vez finalizada la configuración deberíamos ver lo siguiente:

Y finalmente el mensaje que nos confirma que Centreon ha sido instalado correctamente:

Tras terminar esta instalación he comprobado el consumo de memoria RAM, CPU, y espacio en SD, y la verdad que es casi imperceptible:

Esta configuración usa unos 3GB de espacio en disco, unos 200MB de RAM, y el load average ha subido un poco pero nada para llevarse las manos a la cabeza ni mucho menos.

RESUMEN PARA LOS QUE LLEVAN PRISA

Os dejo un resumen de todas las ordenes ejecutadas, por si lleváis prisa y no sois de letras.

root@host# mkdir -p /root/docker
root@host# cd /root/docker
root@host# wget https://raw.githubusercontent.com/deividgdt/dockerpicentreon/master/Dockerfile
root@host# docker build -t centreon:0.0 .
root@host# docker run -d --name centreon --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro centreon:0.0
root@host# docker exec -it centreon bash
root@centreon00# /root/centreon_central.sh
root@centreon00# exit
root@host# docker commit $TAG_ID_CENTREON00
root@host# docker image tag $TAG_ID_CENTREON10 centreon:1.0
root@host# docker stop centreon
root@host# docker run -d --name centreon1 --privileged -p 8080:80 -p 3306:3306 -v /sys/fs/cgroup:/sys/fs/cgroup:ro centreon:1.0
Ir a http://$RASP_IPADDRESS:8080/centreon y configurar Centreon.

Recordad que si tenéis algún problema con la instalación podéis ponerlo en los comentarios y os echaré una mano. Ahora a monitorizar todos vuestros dispositivos o lo que queráis! 😉

Instalando Docker en una Raspberry Pi 3

Hoy vamos a instalar Docker en nuestra Raspberry. En mi caso tengo instalado Raspbian 10 Buster, así que lo primero que voy hacer es crear un directorio para los repositorios de Docker y crear el fichero docker.list con el contenido que veis a continuación:

root@raspberrypi:/etc/apt/sources.list.d/# mkdir docker
root@raspberrypi:/etc/apt/sources.list.d/# cd docker  
root@raspberrypi:/etc/apt/sources.list.d/docker# vi docker.list
deb [arch=armhf] https://download.docker.com/linux/raspbian buster stable

El repositorio esta firmado así que tenemos que añadir la clave:

Continuar leyendo “Instalando Docker en una Raspberry Pi 3”

XRDP: Escritorio remoto para Raspberry

La entrada de hoy es rápida pero MUY útil. Se trata de configurar el software XRDP, el cual es una implementación open source del RDP de Windows, pero usando X Window System.

Lo primero que haré será comprobar si esta disponible en mis repositorios:

root@raspberrypi:~# apt search xrdp
Sorting... Done
Full Text Search... Done
xorgxrdp/stable 1:0.2.9-1 armhf
  Remote Desktop Protocol (RDP) modules for X.org

xrdp/stable 0.9.9-1 armhf
  Remote Desktop Protocol (RDP) server

Como podéis observar la versión 0.9.9 esta disponible.

Antes que nada debemos instalar un entorno gráfico (Desktop Environment), ya que en mi caso no tengo alguno instalado. Como entorno gráfico instalaré Pixel que es el que suele venir por defecto con Raspbian:

Continuar leyendo “XRDP: Escritorio remoto para Raspberry”

LVM: Logical Volume Manager

Hace poco he empezado a administrar servidores que soportan BBDD Oracle, en este entorno se necesita una gran capacidad de escalabilidad ya que en muchos casos las BBDD crecen a TB por semana, por lo que se hace un gran uso de LVM, así que esta vez he tenido que repasar todos los comandos de gestión.

Básicamente en un entorno donde se usa Logical Volumen Manager, la arquitectura básica podría ser como la anterior mostrada en el gráfico. Tres PV, osea 3 discos físicos que pertenecen todos a un VG, donde ese VG esta dividido en 3 LV. Debemos tener en cuenta que para Linux cada LV es tratado como si fuese un disco físico, por lo que puede ser formateado con cualquier sistema de archivos deseado. Una vez ese sistema de archivos se llena, se puede ampliar perfectamente, por ejemplo añadiendo un PV más al VG y así aumentando su capacidad.

Los comandos de administración LVM se crean con un prefijo que determina el objeto y con un sufijo que determina la acción a realizar, tenemos la siguiente tabla:

Continuar leyendo “LVM: Logical Volume Manager”

El mejor análisis técnico de Stuxnet

En el curso de CCNA Cybersecurity Operations, me han recomendado el que vendría a ser el mejor análisis técnico de Stuxnet. La verdad que el análisis es realmente fantástico y recomiendo al 100% la lectura, dejo el enlace a continuación:

https://www.langner.com/wp-content/uploads/2017/03/to-kill-a-centrifuge.pdf

La cita en la portada, que se puede ver en la imagen principal:

“The definitive analysis of Stuxnet”

Bruce Schneier

Es hecha por un experto en seguridad informatica y criptografo que llevo siguiendo varios años en su blog: https://www.schneier.com/ el cual recomiendo.

Así que echadle un vistazo al análisis de Stuxnet y al blog del señor Schneier.

Asignación de una segunda IP a una interfaz en Linux

Feliz año a todos!! 😉

La entrada de hoy será rápida, pero de esas utiles. Básicamente se trata de asignar una dirección IP a una interfaz de red de manera temporal creando una subinterfaz. Un caso practico en el que podemos usar esto, es por ejemplo, para poder acceder a una red a la que no tengamos acceso debido a que nuestra IP principal no este en la red a la que queremos llegar.

En este caso, en mi Raspberry tengo la interfaz eth0, con la dirección IP: 192.168.1.102

Continuar leyendo “Asignación de una segunda IP a una interfaz en Linux”