How To Install Graylog on CentOS 8

Si bien tenemos una infinidad de herramientas que nos habilitan la función de Syslog, me voy a enfocar en esta Suite que en mi opinión es bastante versátil, fácil de implementar, utilizar y configurar.

Lo primero que debemos tener en cuenta es que tenemos 2 formas de implementar Graylog.

Minimum Setup: Sirve para entornos chicos, no críticos o testing. Debemos tener en cuenta que ninguno de los componentes instalados es redundante. (Configuración que haremos en esta guía).
Multi-Node Setup: Sirve para cualquier entorno, conlleva una complejidad mayor, ya que se instalan y configuran los servicios para HA, balanceo y redundancia.

Requisitos

  • CentOS/RH 8
  • MongoDB: Solo almacena la Metadata como usuarios y las configuraciones de todos los ítems como streams, dashboards, etc.
  • Elasticsearch: Almacena los mensajes y permite que Graylog los lea para efectuar búsquedas y filtros.
  • Graylog Server: Permite la generación de diversos inputs, para luego hacer el parsing de la data obtenida.

Configuraciones previas

Primero vamos a configurar el repositorio EPEL, el cual utilizamos luego para instalar 3 aplicaciones.

sudo dnf install -y epel-release
sudo dnf install -y wget pwgen perl-Digest-SHA curl policycoreutils policycoreutils-python-utils

Instalamos y verificamos java.

sudo dnf install -y java-1.8.0-openjdk-headless
java -version

Vamos a ver un resultado similar a el siguiente:

openjdk version “1.8.0_262”
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

Instalación de Elasticsearch

sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

Generamos el archivo “/etc/yum.repos.d/elasticsearch.repo” y cargamos lo siguiente:

[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/oss-6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

Ahora instalamos el servicio.

sudo dnf install -y elasticsearch-oss

Configuración de Elasticsearch

sudo vi /etc/elasticsearch/elasticsearch.yml

Debemos editar las siguientes líneas:

  • cluster.name: Nombre del cluster
  • node.name: Nombre del nodo.
  • network.host: Dirección en la que escucha el servicio.
  • http.port: Puerto de escucha
  • action.auto_create_index: false

Elasticsearch inicia una VM de Java para su operatoria, con lo cual es recomendable hacer el seteo de la misma. Debemos tener en cuenta que los valores de Memoria “Mínimo” y “Máximo” deben ser iguales y se recomienda no superar el 50% de la memoria total del host. Con lo cual si tenemos un Host con 8 GB de RAM la VM no debe superar los 4 GB.

sudo vi /etc/elasticsearch/jvm.options
## JVM configuration

################################################################
## IMPORTANT: JVM heap size
################################################################
##
## You should always set the min and max JVM heap
## size to the same value. For example, to set
## the heap to 4 GB, set:
##
## -Xms4g
## -Xmx4g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## for more information
##
################################################################

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms4g
-Xmx4g

Para mejorar el rendimiento es recomendable no trabajar con SWAP, por lo que la vamos a deshabilitar con el siguiente parámetro:

sudo swapoff -a

Otra opción bastante viable es configurar el parámetro de memoria dentro del archivo de configuración de elasticsearch “/etc/elasticsearch/elasticsearch.yml“.

# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
bootstrap.memory_lock: true
#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.

Debemos generar la apertura en el firewall para dicho servicio:

sudo firewall-cmd --permanent --add-port=9200/tcp
sudo firewall-cmd --reload
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl restart elasticsearch

Validar el estado del servicio:

sudo systemctl status elasticsearch
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-09-02 07:34:02 -03; 54min ago
     Docs: http://www.elastic.co
 Main PID: 52452 (java)
    Tasks: 45 (limit: 23791)
   Memory: 1.3G
   CGroup: /system.slice/elasticsearch.service
curl -X GET http://localhost:9200
{
  "name" : "GLSRV01",
  "cluster_name" : "graylog",
  "cluster_uuid" : "iB-fkzlESS-tLXEivscS2Q",
  "version" : {
    "number" : "6.8.12",
    "build_flavor" : "oss",
    "build_type" : "rpm",
    "build_hash" : "7a15d2a",
    "build_date" : "2020-08-12T07:27:20.804867Z",
    "build_snapshot" : false,
    "lucene_version" : "7.7.3",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

Instalación de MongoDB

Para instalar MongoDB, debemos agregar el repositorio:

sudo vi /etc/yum.repos.d/mongodb-org-4.4.repo
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc

Luego instalamos la base.

sudo dnf install -y mongodb-org
sudo systemctl daemon-reload
sudo systemctl enable mongod.service
sudo systemctl start mongod.service
sudo systemctl status mongod.service

 mongod.service - MongoDB Database Server
   Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-08-31 12:20:51 -03; 1 day 20h ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 29785 (mongod)
   Memory: 147.1M
   CGroup: /system.slice/mongod.service
           └─29785 /usr/bin/mongod -f /etc/mongod.conf

Aug 31 12:20:50 localhost.localdomain systemd[1]: Starting MongoDB Database Server...
Aug 31 12:20:50 localhost.localdomain mongod[29783]: about to fork child process, waiting until server is ready for connections.
Aug 31 12:20:50 localhost.localdomain mongod[29783]: forked process: 29785
Aug 31 12:20:51 localhost.localdomain mongod[29783]: child process started successfully, parent exiting
Aug 31 12:20:51 localhost.localdomain systemd[1]: Started MongoDB Database Server.

Instalación de Graylog Server

sudo dnf install -y https://packages.graylog2.org/repo/packages/graylog-3.3-repository_latest.rpm
sudo dnf install -y graylog-server

Configuración de graylog

Para configurar el Graylog Server, vamos primero a generar unas claves las cuales vamos a utilizar posteriormente en el archivo de configuración del server. Genera un código que deberemos poner en el parámetro “password_secret

pwgen -N 1 -s 96
asPxlUPxFuBpqIj8st0MQxtigtQz0LcPCTmZ9QnEO3jFgIeeukBnACrFlA9l1vebYE3K3HkLUHVgWbEeUbS8BbkL27MfAtB3

Ahora debemos encriptar la clave que vamos a utilizar para el primer login, osea para el usuario “admin“. Vamos a suponer que la clave es “Guia01Graylog

echo -n Guia01Graylog | shasum -a 256
3d1876df6d594eaa1d52d135ec8184a0ff8a2dacbe2c978ba8679d78e52da369
sudo vi /etc/graylog/server/server.conf

Vamos a editar las siguientes líneas:

password_secret = asPxlUPxFuBpqIj8st0MQxtigtQz0LcPCTmZ9QnEO3jFgIeeukBnACrFlA9l1vebYE3K3HkLUHVgWbEeUbS8BbkL27MfAtB3 (Colocamos la clave generada en el paso anterior)
root_password_sha2 = 3d1876df6d594eaa1d52d135ec8184a0ff8a2dacbe2c978ba8679d78e52da369
root_email = "mail@gmail.com"
root_timezone = America/Buenos_Aires (Para ver zonas validas ir a "https://www.joda.org/joda-time/timezones.html")
http_bind_address = 192.168.0.23:9000 (colocar la IP del server)
transport_email_enabled = true 
transport_email_hostname = smtp.gmail.com 182 
transport_email_port = 465 
transport_email_use_auth = true
transport_email_use_tls = true
transport_email_use_ssl = true
transport_email_auth_username = alerts@test.local #Esta cuenta es una creada para tal fin
transport_email_auth_password = Y0urPassw0rd!
transport_email_subject_prefix = [graylog]
transport_email_from_email = graylog@test.local

Ahora vamos a habilitar los puertos y hacer la habilitación del servicio:

sudo firewall-cmd --permanent --add-port=smtp
sudo firewall-cmd --reload
sudo firewall-cmd --permanent --add-port=9000/tcp
sudo firewall-cmd --reload
sudo systemctl daemon-reload
sudo systemctl restart graylog-server
sudo systemctl enable graylog-server

Con estas configuraciones ya podremos ingresar a nuestra web “http://ip-del-server:9000“, utilizando el usuario “admin” y la clave que configuramos en el paso anterior.

Para configurar la recepción de logs, debemos ir a System ⇾ Inputs y cargar los datos del equipo. Recordar qu el puerto default que propone es 514, pero al ser un puerto reservado, es preferible personalizar esta opción con un puerto superior al 1024. Luego cargar la regla de firewall para habilitar el mismo. En otra guía hablaremos de estas opciones y vamos a profundizar en el tunning de Graylog
Guias de referencia:
https://docs.graylog.org/en/3.3/pages/installation/os/centos.html
https://www.itzgeek.com/post/how-to-install-graylog-on-centos-8-rhel-8/
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/
https://computingforgeeks.com/how-to-install-graylog-on-centos-rhel/

Author: Nicolas Ventre

Virtualization architect with more than 15 years implementing complex environments. Security Specialist and Linux instructor