Última actualización: 2026-05-05
Prometheus: http://192.168.1.12:9090
Windows Exporter: http://localhost:9182/metrics
SINTAXIS BÁSICA PROMQL
| Operador | Descripción | Ejemplo |
|---|---|---|
rate() | Tasa de cambio por segundo | rate(metric[5m]) |
irate() | Tasa instantánea (últimos 2 puntos) | irate(metric[5m]) |
avg() | Promedio | avg by(instance) (metric) |
sum() | Suma total | sum(metric) |
max() / min() | Valor máximo/mínimo | max(metric) |
count() | Contar series | count(metric) |
changes() | Cuántas veces cambió | changes(metric[1h]) |
increase() | Incremento total en período | increase(metric[1h]) |
by() | Agrupar por etiqueta | avg by(instance) (metric) |
without() | Excluir etiqueta | avg without(cpu) (metric) |
Rangos de tiempo: [1m], [5m], [15m], [1h], [24h]
1. MÉTRICAS DE CPU
Uso de CPU (%)
100 - (avg by(instance) (irate(windows_cpu_time_total{mode="idle"}[5m])) * 100)Explicación: Resta el tiempo idle de 100% para obtener uso real.
Umbral alerta: >80% warning, >95% critical
Posible causa: Malware, minería, proceso descontrolado
CPU por núcleo
100 - (irate(windows_cpu_time_total{mode="idle"}[5m]) * 100)Explicación: Muestra uso de cada core individualmente.
Útil para: Detectar si un proceso usa solo 1 core o todos
CPU por modo (user, kernel, idle)
irate(windows_cpu_time_total[5m])Explicación: Desglosa tiempo en modo usuario vs kernel.
Anomalía: Mucho tiempo en kernel = posible rootkit o driver malicioso
Top procesos por CPU
topk(10, rate(windows_process_cpu_time_total[5m]))Explicación: Los 10 procesos con más CPU en últimos 5 min.
Útil para: Identificar proceso específico consumiendo recursos
2. MÉTRICAS DE MEMORIA
Memoria usada (%)
(1 - (windows_os_physical_memory_free_bytes / windows_os_visible_memory_total_bytes)) * 100Explicación: Calcula porcentaje de memoria física usada.
Umbral alerta: >85% warning, >95% critical
Posible causa: Memory leak, ransomware cifrando,太多 aplicaciones
Memoria disponible (GB)
windows_os_physical_memory_free_bytes / 1073741824Explicación: Convierte bytes a GB para lectura fácil.
Útil para: Ver tendencia de consumo a lo largo del tiempo
Top procesos por memoria
topk(10, windows_process_private_bytes)Explicación: Los 10 procesos con más memoria privada.
Anomalía: Proceso desconocido con >1GB = investigar
Memoria de página (page file) usada
windows_os_page_file_size - windows_os_page_file_freeExplicación: Cuánto swap/pagefile está en uso.
Anomalía: Uso alto de pagefile = memoria física insuficiente
3. MÉTRICAS DE DISCO
Espacio en disco usado (%)
(1 - (windows_logical_disk_free_bytes / windows_logical_disk_size_bytes)) * 100Explicación: Porcentaje de disco ocupado por volumen.
Umbral alerta: >85% warning, >95% critical
Posible causa: Logs creciendo, ransomware cifrando, backups acumulados
Espacio libre por volumen
windows_logical_disk_free_bytes{volume="C:"} / 1073741824Explicación: GB libres en disco C:.
Útil para: Monitorear disco específico
Operaciones de disco por segundo
rate(windows_logical_disk_disk_reads_total[5m])
rate(windows_logical_disk_disk_writes_total[5m])Explicación: IOPS (lecturas/escrituras por segundo).
Anomalía: Pico de escrituras = posible ransomware o exfiltración
Tiempo de espera de disco
rate(windows_logical_disk_disk_read_seconds_total[5m])
rate(windows_logical_disk_disk_write_seconds_total[5m])Explicación: Cuánto tiempo pasa el disco leyendo/escribiendo.
Anomalía: >50% del tiempo = disco saturado o fallando
4. MÉTRICAS DE RED
Tráfico de red (bytes/s)
rate(windows_net_bytes_total[5m])Explicación: Bytes transmitidos/recibidos por segundo por interfaz.
Umbral alerta: >100MB/s sostenido = investigar
Posible causa: Exfiltración de datos, DDoS, backup en red
Tráfico por interfaz específica
rate(windows_net_bytes_total{nic="Ethernet"}[5m])Explicación: Filtra por nombre de interfaz de red.
Útil para: Monitorear NIC específica (ej: no contar localhost)
Paquetes con error
rate(windows_net_packets_outbound_errors_total[5m])
rate(windows_net_packets_received_errors_total[5m])Explicación: Errores de red por segundo.
Anomalía: >10 errores/s = problema de red o ataque
Conexiones TCP establecidas
windows_tcp_connections{state="established"}Explicación: Número de conexiones TCP activas.
Umbral alerta: >100 conexiones = posible botnet o C2
Posible causa: Malware comunicándose con servidor remoto
Conexiones por estado
windows_tcp_connectionsExplicación: Todas las conexiones agrupadas por estado (ESTABLISHED, SYN_SENT, TIME_WAIT, etc.)
Anomalía: Muchas SYN_SENT = posible escaneo de puertos saliente
5. MÉTRICAS DE SEGURIDAD
Windows Defender estado
windows_service_state{name="WinDefend"}
windows_service_state{name="WinDefend"} == 1Explicación: Estado del servicio Windows Defender.
Valores: 1=Stopped, 2=Running, 3=Paused
Alerta CRÍTICA: == 2 (detenido) = posible compromiso
Firewall estado
windows_service_state{name=~".*firewall.*"}Explicación: Estado de servicios de firewall.
Alerta CRÍTICA: == 2 (detenido) = sistema expuesto
Servicios de seguridad detenidos
windows_service_state{name=~".*(defend|security|firewall|update).*"} == 2Explicación: Detecta si cualquier servicio de seguridad está parado.
Posible causa: Atacante deshabilitó protecciones
Intentos de login fallidos
rate(windows_logon_total{status="failure"}[5m])Explicación: Logins fallidos por segundo.
Umbral alerta: >5/s = posible ataque de fuerza bruta
Requiere: WMI Exporter con collector logon habilitado
Sesiones activas de administrador
windows_logon_sessions{username=~".*admin.*"}
# Muestra sesiones activas (no fallidos, pero útil)
count(windows_logon_session)Explicación: Sesiones activas de usuarios admin.
Anomalía: Admin logueado en horario no laboral = investigar
Sistema reiniciado recientemente
changes(windows_system_system_up_time[1h]) > 0
time() - windows_system_system_up_time_seconds < 300Explicación: Detecta si el uptime cambió en última hora (reinicio).
Posible causa: Atacante reinició para persistencia o cubrir huellas
6. MÉTRICAS DE PROCESOS
Procesos activos totales
count(windows_process_start_time_seconds_total)Explicación: Número total de procesos corriendo.
Anomalía: >200 procesos = posible infección o malware
Pico de creación de procesos
rate(windows_process_start_time_seconds_total[5m])Explicación: Procesos nuevos iniciados por segundo.
Umbral alerta: >10 procesos/s = posible propagación de malware
Posible causa: Gusanos, ransomware, script malicioso
Proceso específico por nombre
windows_process_start_time_seconds_total{process_name="powershell.exe"}Explicación: Detecta si PowerShell está corriendo.
Anomalía: PowerShell a las 3 AM = investigar
Procesos sospechosos comunes
# PowerShell
windows_process_name{process_name="powershell.exe"}
count(windows_process_info{process_name="powershell.exe"})
# CMD
windows_process_name{process_name="cmd.exe"}
# WScript/VScript
windows_process_name{process_name=~".*wscript.*|.*cscript.*"}
# Certutil (usado para descargar malware)
windows_process_name{process_name="certutil.exe"}
# Bitsadmin (usado para exfiltración)
windows_process_name{process_name="bitsadmin.exe"}Explicación: Detecta procesos comúnmente abusados por atacantes.
Nota: No son maliciosos per se, pero requieren contexto
Proceso con CPU elevada
rate(windows_process_cpu_time_total[5m]) > 0.8Explicación: Procesos usando >80% CPU.
Posible causa: Minería de criptomonedas, malware
Proceso con memoria elevada
windows_process_private_bytes > 1073741824Explicación: Procesos usando >1GB de memoria.
Posible causa: Memory leak, ransomware cifrando en memoria
7. QUERIES DE DETECCIÓN DE AMENAZAS
Posible minería de criptomonedas
# CPU sostenida >90% por 30 minutos
avg_over_time(100 - (avg by(instance) (irate(windows_cpu_time_total{mode="idle"}[5m])) * 100)[30m:]) > 90Indicadores: CPU alta constante, mismo proceso todo el tiempo, temperatura alta
Posible ransomware cifrando
# Alta actividad de disco + CPU + red
(rate(windows_logical_disk_disk_writes_total[5m]) > 1000)
and
(100 - (avg by(instance) (irate(windows_cpu_time_total{mode="idle"}[5m])) * 100) > 50)Indicadores: Escrituras masivas, CPU alta, archivos .encrypted apareciendo
Posible exfiltración de datos
# Tráfico de red saliente anormalmente alto
rate(windows_net_bytes_total[5m]) > 100000000Indicadores: >100MB/s sostenido, horario no laboral, destino IP desconocido
Posible botnet/C2 communication
# Muchas conexiones establecidas + tráfico constante
windows_tcp_connections{state="established"} > 100Indicadores: >100 conexiones, mismas IPs externas, puertos inusuales
Posible ataque de fuerza bruta
# Múltiples logins fallidos
rate(windows_logon_total{status="failure"}[5m]) > 5Indicadores: >5 intentos/s, misma cuenta objetivo, origen IP externo
Posible movimiento lateral
# Nuevas conexiones SMB/RDP
windows_tcp_connections{state="established",destination_port="445"} > 10
windows_tcp_connections{state="established",destination_port="3389"} > 5Indicadores: Conexiones a múltiples hosts internos, horario no laboral
8. QUERIES DE RENDIMIENTO (BASELINE)
CPU promedio (última hora)
avg_over_time(100 - (avg by(instance) (irate(windows_cpu_time_total{mode="idle"}[5m])) * 100)[1h:])Útil para: Establecer baseline normal de tu sistema
Memoria promedio (última hora)
avg_over_time((1 - (windows_os_physical_memory_free_bytes / windows_os_visible_memory_total_bytes)) * 100[1h:])Útil para: Detectar desviación del consumo normal
Sistema más lento de lo normal
# CPU actual vs promedio histórico
(100 - (avg by(instance) (irate(windows_cpu_time_total{mode="idle"}[5m])) * 100))
-
avg_over_time(100 - (avg by(instance) (irate(windows_cpu_time_total{mode="idle"}[5m])) * 100)[24h:]) > 30Explicación: CPU actual es >30% más alta que el promedio de 24h
9. QUERIES PARA DASHBOARDS
Resumen del sistema (single stat)
# CPU Usage %
100 - (avg by(instance) (irate(windows_cpu_time_total{mode="idle"}[5m])) * 100)
# Memory Usage %
(1 - (windows_os_physical_memory_free_bytes / windows_os_visible_memory_total_bytes)) * 100
# Disk Usage % C:
(1 - (windows_logical_disk_free_bytes{volume="C:"} / windows_logical_disk_size_bytes{volume="C:"})) * 100
# Total Processes
count(windows_process_start_time_seconds_total)
# Active TCP Connections
sum(windows_tcp_connections{state="established"})Gráfico de líneas (time series)
# CPU por núcleo
100 - (irate(windows_cpu_time_total{mode="idle"}[5m]) * 100)
# Memoria usada vs libre
windows_os_physical_memory_free_bytes
windows_os_visible_memory_total_bytes - windows_os_physical_memory_free_bytes
# Tráfico de red (in/out)
rate(windows_net_bytes_received_total[5m])
rate(windows_net_bytes_transmitted_total[5m])Tabla (top N)
# Top 10 procesos por CPU
topk(10, rate(windows_process_cpu_time_total[5m]))
# Top 10 procesos por memoria
topk(10, windows_process_private_bytes)
# Top 10 discos por uso
topk(10, (1 - (windows_logical_disk_free_bytes / windows_logical_disk_size_bytes)) * 100)10. COMANDOS DE DEPURACIÓN
Ver todas las métricas disponibles
http://localhost:9182/metrics
Ver métricas de Prometheus
up
prometheus_tsdb_storage_blocks_bytes
prometheus_http_requests_totalVer estado de targets
http://192.168.1.12:9090/targets
Ver alertas activas
ALERTS
ALERTS{alertstate="firing"}Ver estado de reglas
http://192.168.1.12:9090/rules
RECURSOS ADICIONALES
| Recurso | URL |
|---|---|
| Documentación PromQL | https://prometheus.io/docs/prometheus/latest/querying/basics/ |
| Cheatsheet Oficial | https://prometheus.io/docs/prometheus/latest/querying/cheatsheet/ |
| Windows Exporter Metrics | https://github.com/prometheus-community/windows_exporter/blob/master/docs/collector.os.md |
| Grafana Dashboards | https://grafana.com/grafana/dashboards/ |
QUICK REFERENCE
Detección rápida de amenazas:
| Amenaza | Query | Umbral |
|---|---|---|
| Minería | CPU >90% por 30min | avg_over_time(...[30m:]) > 90 |
| Ransomware | Escrituras + CPU altas | disk_writes > 1000 AND CPU > 50% |
| Exfiltración | Red >100MB/s | rate(net_bytes[5m]) > 100000000 |
| Botnet | Conexiones >100 | tcp_connections{established} > 100 |
| Fuerza bruta | Logins fallidos >5/s | rate(logon_total{failure}[5m]) > 5 |
| Defender desactivado | Servicio detenido | service_state{name="WinDefend"} == 2 |
Autor: Sammi De Blas
Propósito: Cybersecurity Monitoring Lab
Contacto: analista@sammideblas.com