Un SIEM (Security Information and Event Management) centraliza los logs de todos tus sistemas en un único punto donde puedes buscar, correlacionar y alertar sobre eventos de seguridad. Sin un SIEM, cuando hay un incidente pasas horas revisando logs en cada servidor por separado. En este artículo desplegamos Graylog, la opción más sencilla para empezar.
Por qué necesitas centralizar logs
- Detectar patrones que solo son visibles correlacionando eventos de múltiples sistemas.
- Conservar logs incluso si un servidor es comprometido y sus logs son borrados.
- Cumplimiento normativo (muchas regulaciones exigen retención de logs).
- Búsqueda histórica: «¿qué ocurrió en el servidor web el martes a las 2:00 AM?»
Opción 1: Graylog (más sencillo)
Despliegue con Docker Compose
version: '3.8'
services:
mongodb:
image: mongo:6.0
volumes:
- mongo_data:/data/db
opensearch:
image: opensearchproject/opensearch:2.4.0
environment:
- discovery.type=single-node
- OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g
- DISABLE_SECURITY_PLUGIN=true
volumes:
- os_data:/usr/share/opensearch/data
ulimits:
memlock: { soft: -1, hard: -1 }
graylog:
image: graylog/graylog:5.2
environment:
GRAYLOG_PASSWORD_SECRET: "unacadenamuylarga32caracteres!!!"
# SHA2 de tu contraseña admin (echo -n "password" | sha256sum)
GRAYLOG_ROOT_PASSWORD_SHA2: "8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918"
GRAYLOG_HTTP_EXTERNAL_URI: "http://192.168.1.100:9000/"
GRAYLOG_ELASTICSEARCH_HOSTS: "http://opensearch:9200"
GRAYLOG_MONGODB_URI: "mongodb://mongodb:27017/graylog"
ports:
- "9000:9000" # Web UI
- "1514:1514" # Syslog TCP
- "1514:1514/udp" # Syslog UDP
- "5044:5044" # Beats (Filebeat)
- "12201:12201" # GELF
- "12201:12201/udp"
depends_on:
- mongodb
- opensearch
volumes:
mongo_data:
os_data:
docker compose up -d
Enviar logs al SIEM
Syslog desde Linux (rsyslog)
. @192.168.1.100:1514 # UDP
. @@192.168.1.100:1514 # TCP (más fiable)
sudo systemctl restart rsyslog
Filebeat para logs de aplicaciones
sudo apt install filebeat
sudo nano /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
fields:
service: nginx
environment: production
- type: log
paths:
- /var/log/auth.log
fields:
service: auth
output.logstash:
hosts: ["192.168.1.100:5044"]
sudo systemctl enable --now filebeat
Logs de Windows con Winlogbeat
winget install Elastic.Winlogbeat
winlogbeat.event_logs:
- name: Application
- name: System
- name: Security
processors:
- script:
lang: javascript
id: security
file: ${path.home}/module/security/config/winlogbeat-security.js
output.logstash:
hosts: ["192.168.1.100:5044"]
Opción 2: ELK Stack
ELK (Elasticsearch + Logstash + Kibana) es más potente pero más complejo:
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- ES_JAVA_OPTS=-Xms2g -Xmx2g
volumes:
- es_data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
kibana:
image: docker.elastic.co/kibana/kibana:8.12.0
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
depends_on:
- elasticsearch
logstash:
image: docker.elastic.co/logstash/logstash:8.12.0
volumes:
- ./logstash/pipeline:/usr/share/logstash/pipeline
ports:
- "5044:5044"
- "5514:5514/udp"
depends_on:
- elasticsearch
volumes:
es_data:
Alertas en Graylog
En la UI de Graylog: Alerts → Event Definitions → Create Event Definition:
- Múltiples fallos de login (Event ID 4625 > 10 veces en 5 minutos): alerta por email o Slack.
- Nuevo administrador creado (Event ID 4720): alerta inmediata.
- Error 500 en Nginx: alerta cuando supere 50 en 10 minutos.
Un SIEM no es solo para grandes empresas. Con Graylog en Docker puedes centralizar los logs de toda tu infraestructura en un servidor con 4 GB de RAM y tener búsqueda histórica, dashboards y alertas automáticas. El tiempo de configuración inicial de 2-3 horas se amortiza la primera vez que detectas un incidente gracias a la correlación de logs.