SIEM básico: centraliza logs con Graylog o ELK Stack



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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *