Bitácoras syslog centralizada con Graylog

De Apuntes
Saltar a: navegación, buscar

Las bitacoras del sistema son pieza clave para entender qué sucede con el servidor, sin embargo cuando se trata de múltiples servidores es complicado tener una visión holística de la situación en la avalancha de bitácoras que se pueden generar.

Graylog, es una sistema open source de administración de bitácoras, posee soporte para varios protocolos de bitácoras y es altamente escalable según la necesidad.

Esta guía mostrará la manera de desplegar Graylog "todo-en-uno" utilizando contenedores de Docker. Este despliegue es el más simple, no obstante el que posee menos rendimiento. Para despliegues más grandes sería bueno tomar en cuenta separar los servicios y permitir una escalabilidad más elástica. Ver [1] para más información.


Prerrequisitos

Servidores

Se requiere de al menos 1 servidor con suficiente disco duro para almacenar las bitácoras (el tamaño se puede estimar dependiendo de la cantidad de bitácoras que se generan por día y la cantidad de días que se desea almacenar), al menos 4 cores y 4 GB de RAM.

Software

Esta guía esta planteada para ser ejecutada en el sistema Debian GNU/Linux 9, con Docker y Docker Compose preinstalado, no obstante los pasos pueden ser replicados en cualquier equipo que posea Docker Compose.

Puede ver cómo instalar Docker y Docker Compose en la Guía de instalación de Docker o en el sitio oficial de Docker[2].

Despliegue

Se utilizarán directorios locales para crear los volúmenes de almacenamiento persistente. (Se puede también utilizar volúmenes de Docker)

NOTA: Se recomienda crear un punto de montaje en /opt/graylog con el almacenamiento necesario para guardar todas las bitácoras y metadatos

Para crear los directorios necesarios para almacenar los datos y asignar sus permisos se ejecutan los siguientes comandos:

sudo mkdir -p /opt/graylog/config/ /opt/graylog/es_data /opt/graylog/journal /opt/graylog/mongo_data
sudo chown 1100:1100 /opt/graylog/config/ /opt/graylog/journal
sudo chown 1000:1000 /opt/graylog/es_data
sudo chown 999:999 /opt/graylog/mongo_data

Luego se debe descargar la configuración de Graylog en el directorios de config:

sudo wget -O /opt/graylog/config/graylog.conf https://raw.githubusercontent.com/Graylog2/graylog-docker/2.4/config/graylog.conf
sudo wget -O /opt/graylog/config/log4j2.xml https://raw.githubusercontent.com/Graylog2/graylog-docker/2.4/config/log4j2.xml
sudo chown 1100:1100 /opt/graylog/config/*

Esta configuración se puede utilizar para futuros cambios.

Después, se ajustan los parámetros del kernel para el mapeo de la memoria virtual[3], este valor se debe ajustar dependiendo del contexto, pero es el valor recomendado para producción. Ejecutar los siguiente comandos como root:

echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p

Además a esto se requiere generar un hash en SHA256 con la contraseña del usuario admin para el sitio web de Graylog, se debe cambiar CONTRASEÑA_SEGURA por la nueva contraseña:

echo -n CONTRASEÑA_SEGURA | shasum -a 256

La salida del comando anteriores se utilizará más adelante.

Una vez configurados los requisitos anteriores se procede a crear el archivo /opt/graylog/docker-compose.yml con el siguiente contenido, donde se debe sustituir SECRETO_CAMBIELO por un salt para el cifrado de datos (una hilera de al menos 16 caracteres), CONTRASEÑA_SHA256 por la salida del comando ejecutado anteriormente (shasum) y IP_SERVIDOR por la dirección IP o el nombre de dominio del servidor que está hospedando Graylog.

version: '2'
services:
  # MongoDB: https://hub.docker.com/_/mongo/
  mongodb:
    image: mongo:3
    volumes:
      - /opt/graylog/mongo_data:/data/db
  # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/docker.html
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.6.10
    volumes:
      - /opt/graylog/es_data:/usr/share/elasticsearch/data
    environment:
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      # Disable X-Pack security: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/security-settings.html#general-security-settings
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 1g
  # Graylog: https://hub.docker.com/r/graylog/graylog/
  graylog:
    image: graylog/graylog:2.4
    volumes:
      - /opt/graylog/journal:/usr/share/graylog/data/journal
      # Mount local configuration directory into Docker container
      - /opt/graylog/config:/usr/share/graylog/data/config
    environment:
      # CHANGE ME!
      - GRAYLOG_PASSWORD_SECRET=SECRETO_CAMBIELO
      # Password: admin
      - GRAYLOG_ROOT_PASSWORD_SHA2=CONTRASEÑA_SHA256
      - GRAYLOG_WEB_ENDPOINT_URI=http://IP_SERVIDOR:9000/api
    links:
      - mongodb:mongo
      - elasticsearch
    depends_on:
      - mongodb
      - elasticsearch
    ports:
      # Graylog web interface and REST API
      - 9000:9000
      # Syslog TCP
      - 514:514
      # Syslog UDP
      - 514:514/udp
      # GELF TCP
      - 12201:12201
      # GELF UDP
      - 12201:12201/udp

Un vez que se ha creado el archivo, se procede a desplegar los contenedores con Docker Compose:

docker-compose up -d

Se debe esperar unos minutos a que se descarguen las imágenes de los contenedores y que estos se inicialicen. Para verificar el estado de los contenedores se puede ejecutar le siguiente comando:

docker ps

Debe mostrar algo similar a lo siguiente:

CONTAINER ID        IMAGE                                                  COMMAND                  CREATED             STATUS              PORTS                                                                                                                    NAMES
417e0434a402        graylog/graylog:2.4                                    "/docker-entrypoint.…"   3 hours ago         Up 3 hours          0.0.0.0:514->514/tcp, 0.0.0.0:9000->9000/tcp, 0.0.0.0:514->514/udp, 0.0.0.0:12201->12201/tcp, 0.0.0.0:12201->12201/udp   graylog_graylog_1
6990aa82686f        docker.elastic.co/elasticsearch/elasticsearch:5.6.10   "/bin/bash bin/es-do…"   3 hours ago         Up 3 hours          9200/tcp, 9300/tcp                                                                                                       graylog_elasticsearch_1
b5dc7577c568        mongo:3                                                "docker-entrypoint.s…"   3 hours ago         Up 3 hours          27017/tcp                                                                                                                graylog_mongodb_1

Uso del sistema

Acceso a Graylog

Una vez desplegados los contenedores se puede dirigir a la IP o dominio donde se desplegó Graylog, en le puerto 9000. Por ejemplo: http://1.2.3.4:9000/

En la pantalla de Inicio de sesión se coloca el usuario admin y la contraseña que se eligió durante el despliegue.

Graylog login.png

Antes de poder recibir bitácoras, se deben crear los input para la entrada de datos según el protocolo y formato que se desea en la Inputs del menú System de la barra superir. Para esta guía se creará el input para Syslog.

Archivo:Graylog inputs.png

En el combobox se selecciona el protocolo o formato del input: Syslog TCP y luego se da clic en el botón Lunch new input. (También se puede crear un input para Syslog en UDP)

Archivo:Graylog inputs combobox.png

Esto muestra un pop-up para la configuración del input.

Archivo:Graylog inputs popup.png

Se selecciona la opción Global, se asigna un título representativo y se ajustan las configuraciones según se crea necesario. Finalmente se da clic al botón de save para guardar el input y ponerlo en ejecución.

Configurar el envío de bitácoras

Para hacer que un servidor remoto envíe las bitácoras al Graylog se debe configurar el demonio de Rsyslog o similar para que las redireccione adecuadamente.

En Linux, se crea el archivo de configuración en /etc/rsyslog.d/00-graylog.conf con el siguiente contenido, donde IP_GRAYLOG es la dirección IP o nombre de dominio del servidor de Graylog:

*.* @172.16.251.33:514;RSYSLOG_SyslogProtocol23Format

Luego, se reinicia el demonio de Rsyslog:

systemctl restart rsyslog.service

Inmediatamente se debería estar visualizando las bitácoras generadas por el servidor en la interfaz de Graylog, para probarlo se puede generar un mensaje de log ejecutando el siguiente comando en el servidor remoto:

logger Mensaje de Prueba

Dicho mensaje debería ser visible en las bitácoras de Graylog.