Implementar SOC: Monitorización Completa con Prometheus, AlertManager, Grafana y Loki bajo Contenedores
Seguimos implementando nuestro SOC bajo OpenSource. Hoy le toca a la monitorización…
El stack de monitorización que voy a usar estará formado por Prometheus, AlertManager, Grafana y Loki proporciona una solución integral para observar, alertar y analizar el rendimiento y la salud de tus sistemas y aplicaciones. En esta entrada del blog, te explicaremos cómo configurar estas herramientas utilizando contenedores Docker y cómo cada componente contribuye a la gestión de tu infraestructura IT.
1. ¿Qué es Prometheus?
Prometheus es una plataforma de monitoreo y alerta diseñada originalmente por SoundCloud. Está orientada a recolectar métricas numéricas en series temporales a través de consultas en su propio lenguaje (PromQL). Prometheus se destaca por su modelo de datos flexible, su capacidad para manejar altos volúmenes de datos y su integración nativa con Kubernetes.
Funcionalidades Clave de Prometheus:
- Recolección de métricas: Mediante scrapers que se configuran para recolectar datos de aplicaciones y servicios.
- Almacenamiento de series temporales: Utiliza su propia base de datos de series temporales.
- PromQL: Un potente lenguaje de consulta para análisis de métricas.
- Alertas: Configuración de reglas para detectar condiciones específicas y activar alertas.
2. ¿Qué es AlertManager?
AlertManager es el componente de Prometheus encargado de gestionar las alertas generadas por Prometheus. Su principal función es agrupar, enrutarlas y enviar notificaciones a diferentes canales (email, Slack, PagerDuty, etc.).
Funcionalidades Clave de AlertManager:
- Agrupación: Agrupa alertas similares para reducir el ruido.
- Inhibición: Previene alertas redundantes.
- Enrutamiento: Configura reglas para enviar alertas a diferentes destinatarios según su gravedad o tipo.
- Silencios: Permite silenciar alertas durante mantenimientos planificados.
3. ¿Qué es Grafana?
Grafana es una plataforma de análisis y monitoreo que permite crear paneles visuales interactivos. Soporta múltiples fuentes de datos, incluyendo Prometheus y Loki, y ofrece una interfaz amigable para explorar métricas y logs.
Funcionalidades Clave de Grafana:
- Dashboards personalizables: Creación de paneles visuales con gráficos y alertas.
- Alertas integradas: Configuración de alertas directamente desde los paneles.
- Plugins: Soporte para una amplia gama de plugins y fuentes de datos.
- Compartir y colaborar: Posibilidad de compartir dashboards y colaborar en su creación.
4. ¿Qué es Loki?
Loki es un sistema de recolección y consulta de logs diseñado por Grafana Labs. A diferencia de otras soluciones de logging, Loki no indexa el contenido completo de los logs, sino que indexa los labels (etiquetas), haciendo que sea más ligero y eficiente.
Funcionalidades Clave de Loki:
- Recolección de logs: Integra con Promtail, Fluentd, Logstash y otros agentes de logs.
- Consulta de logs: Utiliza el lenguaje de consultas LogQL similar a PromQL.
- Almacenamiento eficiente: Bajo consumo de recursos gracias a la indexación de etiquetas.
Requisitos máquina virtual para Stack de Monitorización bajo Docker
Para implementar este laboratorio, lo vamos a hacer bajo Proxmox como suele ser habitual. Crearé un container LXC con las siguientes características:
- Debian 12
- 4GB de RAM
- 2 vCPU
- 20GB de disco mínimo
- Docker instalado. En la parte inferior tenéis la entrada como se hace. Acordaros que la máquina virtual tiene que tener parámetros adicionales a los normales para que pueda virtualizar contenedores:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
root@minis2:~# cat /etc/pve/lxc/110.conf arch: amd64 cores: 2 features: nesting=1,keyctl=1 hostname: DOCKER01 memory: 4096 net0: name=eth0,bridge=vmbr0,hwaddr=BC:24:11:8E:DC:74,ip=dhcp,ip6=dhcp,type=veth ostype: debian rootfs: UNRAID:110/vm-110-disk-0.raw,size=8G swap: 4096 unprivileged: 1 lxc.apparmor.profile: unconfined lxc.cap.drop: lxc.cgroup.devices.allow: a lxc.mount.auto: proc:rw sys:rw lxc.init.cmd: /sbin/init lxc.seccomp.profile: /usr/share/lxc/config/common.seccomp lxc.cgroup.devices.allow: c 10:237 rwm lxc.cgroup.devices.allow: a |
Os dejo el consumo en cada caso:
1. Memoria RAM
- Total: Al menos 4 GB de RAM.
- Prometheus: ~1 GB
- AlertManager: ~256 MB
- Grafana: ~512 MB
- Loki: ~1 GB
- Sistema Operativo y Otros Servicios: ~1.5 GB
2. CPU
- Total: Al menos 2 vCPUs.
- Prometheus: 1 vCPU
- AlertManager: 0.5 vCPU
- Grafana: 0.5 vCPU
- Loki: 1 vCPU
3. Almacenamiento
- Total: Al menos 20 GB de disco.
- Prometheus: ~5 GB (puede variar según la cantidad de datos recolectados)
- AlertManager: ~1 GB
- Grafana: ~2 GB
- Loki: ~10 GB (puede variar según la cantidad de logs almacenados)
- Sistema Operativo y Otros Servicios: ~2 GB
Configuración del Stack de Monitorización
Para configurar Prometheus, AlertManager, Grafana y Loki bajo contenedores Docker, sigue los pasos detallados a continuación:
Paso 1: Preparación del Entorno
Asegúrate de tener Docker y Docker Compose instalados. Puedes verificar su instalación ejecutando los siguientes comandos:
1 2 3 4 |
root@DOCKER01:~# docker --version Docker version 24.0.5, build 24.0.5-0ubuntu1 root@DOCKER01:~# docker-compose --version docker-compose version 1.29.2, build unknown |
Paso 2: Estructura del Proyecto
Crea un directorio para tu proyecto y navega dentro de él:
1 2 3 |
root@DOCKER01:~# mkdir monitoring-stack root@DOCKER01:~# cd monitoring-stack/ root@DOCKER01:~/monitoring-stack# |
Dentro del directorio del proyecto, crea los siguientes subdirectorios y archivos:
1 2 3 4 5 6 7 8 9 10 |
mkdir prometheus alertmanager grafana loki touch docker-compose.yml touch prometheus/prometheus.yml touch alertmanager/config.yml mkdir -p grafana/provisioning/dashboards/ touch grafana/provisioning/dashboards/dashboards.yml mkdir -p grafana/provisioning/datasources/ touch grafana/provisioning/datasources/datasources.yml mkdir -p loki/index loki/chunks touch loki/loki-config.yml |
Comprobamos con tree:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
root@DOCKER01:~/monitoring-stack# tree . |-- alertmanager | `-- config.yml |-- docker-compose.yml |-- grafana | `-- provisioning | |-- dashboards | | `-- dashboards.yml | `-- datasources | `-- datasources.yml |-- loki | `-- loki-config.yml `-- prometheus `-- prometheus.yml 8 directories, 6 files |
Paso 3: Configuración de Prometheus
Edita el archivo prometheus/prometheus.yml:
1 2 3 4 5 6 7 8 9 10 11 |
global: scrape_interval: 15s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['prometheus:9090'] - job_name: 'loki' static_configs: - targets: ['loki:3100'] |
Paso 4: Configuración de AlertManager
Edita el archivo alertmanager/config.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
global: resolve_timeout: 5m route: group_by: ['alertname'] group_wait: 30s group_interval: 5m repeat_interval: 1h receiver: 'email' receivers: - name: 'email' email_configs: - to: 'your-email@example.com' from: 'alertmanager@example.com' smarthost: 'smtp.example.com:587' auth_username: 'username' auth_password: 'password' |
Para esto suelo usar una cuenta de gmail para apps que os mostré en esta entrada. Podéis validar la configuración cuando esté montado AlertManager de la siguiente forma:
1 |
alertmanager --config.file=alertmanager.yml --dry-run |
Paso 5: Configuración de Grafana
Edita el archivo grafana/provisioning/datasources/datasources.yml:
1 2 3 4 5 6 7 8 9 10 11 |
apiVersion: 1 datasources: - name: Prometheus type: prometheus access: proxy url: http://prometheus:9090 - name: Loki type: loki access: proxy url: http://loki:3100 |
Edita el archivo grafana/provisioning/dashboards/dashboards.yml:
1 2 3 4 5 6 7 8 |
apiVersion: 1 providers: - name: 'default' orgId: 1 folder: '' type: file options: path: /var/lib/grafana/dashboards |
Paso 6: Configuración de Loki
Edita el archivo loki/loki-config.yml:
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 36 37 38 39 40 41 42 |
auth_enabled: false server: http_listen_port: 3100 ingester: lifecycler: ring: kvstore: store: inmemory replication_factor: 1 chunk_idle_period: 3m chunk_retain_period: 1m max_transfer_retries: 0 schema_config: configs: - from: 2020-10-24 store: boltdb object_store: filesystem schema: v11 index: prefix: index_ period: 168h storage_config: boltdb: directory: /loki/index filesystem: directory: /loki/chunks limits_config: enforce_metric_name: false reject_old_samples: true reject_old_samples_max_age: 168h chunk_store_config: max_look_back_period: 0s table_manager: retention_deletes_enabled: false retention_period: 0s |
Paso 7: Configuración de Docker Compose
Edita el archivo docker-compose.yml:
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 36 37 38 |
version: '3.8' services: prometheus: image: prom/prometheus:latest container_name: prometheus volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml ports: - 9090:9090 alertmanager: image: prom/alertmanager:latest container_name: alertmanager volumes: - ./alertmanager/config.yml:/etc/alertmanager/config.yml ports: - 9093:9093 grafana: image: grafana/grafana:latest container_name: grafana volumes: - grafana-storage:/var/lib/grafana - ./grafana/provisioning:/etc/grafana/provisioning ports: - 3000:3000 loki: image: grafana/loki:latest container_name: loki volumes: - ./loki/loki-config.yml:/etc/loki/local-config.yaml ports: - 3100:3100 volumes: grafana-storage: |
Paso 8: Levantar el Stack de Monitoreo
Ejecuta el siguiente comando para levantar todos los contenedores:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
root@docker01:~/monitoring-stack# docker-compose up -d Creating network "monitoring-stack_default" with the default driver Creating volume "monitoring-stack_grafana-storage" with default driver Pulling prometheus (prom/prometheus:latest)... latest: Pulling from prom/prometheus 9fa9226be034: Pull complete 1617e25568b2: Pull complete 3ecda1bfd07b: Pull complete ac9f4de4b762: Pull complete ea63b2e6315f: Pull complete fbd390d3bd00: Pull complete 9b1ac15ef728: Pull complete 8682f304eb80: Pull complete 5fbafe078afc: Pull complete 7fb53fd2ae10: Pull complete 592798bd3683: Pull complete 473fdc983780: Pull complete Digest: sha256:075b1ba2c4ebb04bc3a6ab86c06ec8d8099f8fda1c96ef6d104d9bb1def1d8bc Status: Downloaded newer image for prom/prometheus:latest Pulling alertmanager (prom/alertmanager:latest)... latest: Pulling from prom/alertmanager 9fa9226be034: Already exists 1617e25568b2: Already exists e769c9462d1b: Pull complete 697c2f9afe54: Pull complete 27aac892fbe9: Pull complete 5c5751833485: Pull complete 4f4fb700ef54: Pull complete Digest: sha256:e13b6ed5cb929eeaee733479dce55e10eb3bc2e9c4586c705a4e8da41e5eacf5 Status: Downloaded newer image for prom/alertmanager:latest Pulling grafana (grafana/grafana:latest)... latest: Pulling from grafana/grafana 4abcf2066143: Pull complete 17c7b7b51500: Pull complete 3a874871ebf5: Pull complete 4d8b5d34b1ef: Pull complete ea2f71d64768: Pull complete 2d8d8a45d8d1: Pull complete 8eef243a7847: Pull complete 5d8ca4014ed0: Pull complete 2a0008f5c37f: Pull complete Digest: sha256:0dc5a246ab16bb2c38a349fb588174e832b4c6c2db0981d0c3e6cd774ba66a54 Status: Downloaded newer image for grafana/grafana:latest Pulling loki (grafana/loki:latest)... latest: Pulling from grafana/loki 619be1103602: Pull complete 7459dada6da4: Pull complete 2701a3c07f98: Pull complete 9b51a38ca28a: Pull complete cd876ff84c48: Pull complete 1d2889b3468e: Pull complete Digest: sha256:8b5bd7748d0e4da66cd741ac276e485517514af0bea32167e27c0e1a95bcf8aa Status: Downloaded newer image for grafana/loki:latest Creating prometheus ... done Creating alertmanager ... done Creating loki ... done Creating grafana ... done |
Paso 9: Acceso a los Servicios
- Prometheus: http://localhost:9090
- AlertManager: http://localhost:9093
- Grafana: http://localhost:3000
- Loki: http://localhost:3100
Paso 10: Configuración Adicional en Grafana
Inicia sesión en Grafana (usuario y contraseña por defecto: admin/admin) y verifica que las fuentes de datos (Prometheus y Loki) estén correctamente configuradas.
Si queréis parar los contenedores:
1 2 3 4 5 6 7 8 9 |
root@docker01:~/monitoring-stack# docker-compose down Stopping grafana ... done Stopping alertmanager ... done Stopping prometheus ... done Removing loki ... done Removing grafana ... done Removing alertmanager ... done Removing prometheus ... done Removing network monitoring-stack_default |
ENTRADAS RELACIONADAS CREACION SOC OPENSOURCE
-
- Crear SOC mediante herramientas OpenSource
- Implementar SOC: Instalación Suricata bajo Proxmox
- Instalar Docker sobre contenedor LXC Proxmox
- Implementar SOC: Instalación Wazuh
- Implementar SOC: Instalar TheHive, Cortex y MISP
- Implementar SOC: Instalación Patrowl
- Implementar SOC: Instalación Opensearch
- Implementar SOC: Decoders, Playbooks y Workflows
- Implementar SOC: Directorios Windows, Linux y MacOS a revisar
- Implementar SOC: Monitorización Completa con Prometheus, AlertManager, Grafana y Loki bajo Contenedores
- Implementar SOC: Instalar Security Onion sobre Proxmox
- Implementar SOC: Códigos de estado, Mensajes y Alertas
- Suricata: Cómo crear y testear reglas personalizadas
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?