Configurar Logstash para que obtenga datos de una base de datos SQL

Configurar Logstash para que obtenga datos de una base de datos SQL

En caso de que necesitemos que nuestro logstash obtenga datos de una base de datos lo podemos hacer utilizando el plugin logstash-input-jdbc para establecer la conexión y ejecutar las consultas directamente desde nuestro logstash

El plugin logstash-input-jdbc

Este plugin nos permite configurar como input de logstash cualquier fuente a la que se puede acceder con Java JDBC

En este tutorial configuraremos logstash para que acceda a una base de datos MySQL/MariaDB, luego ejecute una consulta SQL, una vez que reciba los datos los mismos pueden ser tratados con cualquier filtro que tengamos definido en nuestro logstash

Este turorial esta basado en:

S.O. : CentOS 7.2
Logstash : 5.0

Obtener el driver JDBC

Lo primero que tenemos que hacer es obtener el driver JDBC a utilizar, en este caso lo podemos descargar de https://dev.mysql.com/downloads/connector/j/, una vez que descarguemos el .zip debemos copiar el .jar que se encuentra dentro del mismo a nuestro servidor logstash a la ruta /etc/logstash/jdbc/mysql-connector-java.jar

mkdir /etc/logstash/jdbc
chown -R logstash /etc/logstash/jdbc
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.40.zip
unzip mysql-connector-java-5.1.40.zip
mv mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar /etc/logstash/jdbc/mysql-connector-java.jar

Con esto tendremos listo nuestro driver JDBC, ahora podemos comenzar a configurar el logstash

Instalar y configurar el plugin logstash-input-jdbc

Para instalar el plugin debemos ejecutar el siguiente comando:

/usr/share/logstash/bin/logstash-plugin install logstash-input-jdbc

Una vez instalado el plugin debemos configurar el input de logstash, para esto creamos el archivo /etc/logstash/conf.d/01-mysql-jdbc.conf

vi /etc/logstash/conf.d/01-mysql-jdbc.conf
input {
   jdbc {
    # Ruta del driver JDBC que utilizaremos
    jdbc_driver_library => "/etc/logstash/jdbc/mysql-connector-java.jar"
    # Clase a utilizar (consultar documentacion del driver)
    jdbc_driver_class => "com.mysql.jdbc.Driver"            
    # URl de la conexion a base de datos, deben reemplazar el host y el nombre de la BD
    jdbc_connection_string => "jdbc:mysql://host:3306/basededatos"
    # Usuario con el cual se conectara a la BD
    jdbc_user => "user"
    # Password del usuario
    jdbc_password => "pass"
    # Activa la opcion para utilizar el nombre de las columnas como nombre del campo
    use_column_value => "true"
    # Define que columna se utilizara para hacer el seguimiento de las consultas
    tracking_column => "fecha"
    # Se activa la opcion de registrar la última consulta
    record_last_run => "true"
    # Ruta donde se guardara un registro de la última consulta
    last_run_metadata_path => "/etc/logstash/jdbc/registro_volmap_last_run"
    # Consulta SQL, la variable :sql_last_value se reemplaza por el ultimo valor obtenido de la columna que se definio en tracking_column
    # con esto evitamos que logstash reciba datos repetidos, debido a que filtra los valores que se crearon luego de la última vez que
    # el consulto
    statement => "SELECT fecha, monto FROM ventas WHERE fecha > :sql_last_value"  
    # Desactiva la opcion de ejecutar una consulta como si fuese la primera vez siempre
    clean_run => "false"
    # Podemos definir los tags que tendran los datos recolectados
    tags => "mysql-jdbc"
    # Agendamos la ejecucion en formato crontab
    # Para que se ejecute cada 1 minuto: * * * * *
    schedule => "* * * * *"
   }
}

Una vez que guardamos en caso de que tengamos configurado nuestro logstash con autoreload veríamos en unos minutos que se ejecuta la consulta en el log /var/log/logstash/logstash-plain.log

Caso contrario debemos reiniciar el servicio logstash para que tome los cambios

Con esto tenemos una fuente JDBC como input de logstash, tal como dije al inicio, para logstash es como cualquier otro input por lo tanto podemos agregar filtros como si fuese un log normal

Para más informacion:
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html

Configurar elasticsearch x-pack para autenticar via LDAP

Configurar elasticsearch x-pack para autenticar via LDAP

Con el plugin x-pack de elasticsearh es posible que tanto nuestro elasticsearch como kibana utilice usuarios externos, los cuales pueden ser de LDAP, Active Directory o archivos

En este caso configuraremos nuestro elasticsearch para que autentique a traves de LDAP para los usuarios clientes y que autentique también vía archivos para los usuarios genéricos tales como el logstash, de manera a que en caso de que nuestro servidor LDAP tenga problemas no perdamos los datos que estén tratando de insertar en ese momento.

Configurar autenticacion vía LDAP

Lo primero que tenemos que hacer es asegurarnos de que nuestro LDAP acepte consultas anonimas, luego debebemos obtener los datos que necesitaremos:

- base dn: El DN donde el elasticsearch ejecutara la busqueda cuando un usuario trate de conectarse
- ldap url: Nombre o Ip de nuestro servidor LDP
- group base dn: El DN donde el elasticesarch buscara los grupos
- atributo de usuario: el atributo LDAP de nombre de usuario, normalmente es "cn" o "uid"

Una vez que tenemos todos esos datos debemos agregar al final del archivo /etc/elasticsearch/elasticsearch.yml lo siguiente:

xpack:
  security:
    authc:
      realms:
        ldap1:
          type: ldap
          order: 1
          url: "ldap://ldap.infratic.com:389"
          user_search:
            base_dn: "ou=People,dc=infratic,dc=com"
            attribute: uid
          group_search:
            base_dn: "ou=Groups,dc=infratic,dc=com"
          files:
            role_mapping: "/etc/elasticsearch/x-pack/role_mapping.y
          unmapped_groups_as_roles: false

Configurar roles para los usuarios y grupos de LDAP

Una vez que tenemos configurada la autenticacion via LDAP solo nos queda asignar los roles correspondientes a los grupos o usuarios, esto se hace en el archivo /etc/elasticsearch/x-pack/role_mapping.yml, por ejemplo:

superuser:
        # Para asignar el role a un usuario especifico
        - "uid=supervisor,,ou=People,dc=infratic,dc=com"
        # Para asignar el role a un grupo
        - "cn=administradores,ou=Groups,dc=infratic,dc=com"

Configurar autenticacion vía archivos locales

Es importante contar con un medio de autenticacion que no dependa de otros equipos para usuarios genéricos como el del logstash, esto para evitar que el logstash deje de insertar a elasticsearch cuando nuestro LDAP tenga problemas, es por eso que configuraremos también el método de autenticacion vía archivos:

Lo unico que debemos hacer es agregar al final del archivo /etc/elasticsearch/elasticsearch.yml lo siguiente:

        file1:
          type: file
          order: 0

Administrar usuarios locales

Una vez que agregamos la configuracion para autenticar via archivos locales, podemos administrar los usuarios con la herramienta /usr/share/elasticsearch/bin/x-pack/users.

Para crear un usuario:

/usr/share/elasticsearch/bin/x-pack/users useradd logstash

Para agregar un role a un usuario ya creado:

/usr/share/elasticsearch/bin/x-pack/users roles logstash -a superuser

Con el comando anterior asignamos el role superuser al usuario creado previamente.

Aplicar los cambios

Debemos reiniciar nuestro elasticsearch para que aplique todos los cambios que hicimos:

systemctl restart elasticsearch

Finalmente tenemos nuestro elasticsearch con 2 metodos de autenticaion, uno el metodo de archivos locales y el otro un servidor LDAP, no esta de mas decir que estos metodos son para autenticar usuarios, la creacion de roles se debe seguir haciendo a traves de la api del x-pack

Para mas informacion:

https://www.elastic.co/guide/en/x-pack/current/ldap-realm.html
https://www.elastic.co/guide/en/x-pack/current/file-realm.html
https://www.elastic.co/guide/en/x-pack/current/security-api-roles.html

Instalar ELK 5.0 en CentOS/RHEL/SL 7

Instalar ELK 5.0 en CentOS 7

Instalar pre-requisitos

Antes de comenzar debemos asegurarnos de tener instalados todos los paquetes necesarios:

yum install -y wget

Instalar java

Es necesario instalar la version 8 de java de Oracle, lo que lo podemos hacer con los siguientes comandos:

wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm"
yum -y localinstall jdk-8u73-linux-x64.rpm

Configurar los repositorios necesarios

Cada producto tiene su propio repositorio, podemos configurar dichos repositorios con el siguiente comando:

cat <<EOF > /etc/yum.repos.d/elk-5.0.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
 
[logstash-5.x]
name=Elastic repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
 
[kibana-5.x]
name=Kibana repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

Instalar elasticsearch

yum install -y elasticsearch

Una vez que instalamos elasticsearch debemos iniciar y habilitar el servicio

systemctl start elasticsearch
systemctl enable elasticsearch

Instalar logstash

yum install -y logstash

Luego debemos iniciar y habilitar el servicio

systemctl start logstash
systemctl enable logstash

Instalar kibana

yum install -y kibana

Procedemos a iniciar y habilitar el servicio

systemctl start kibana
systemctl enable kibana

Teniendo en cuenta que utilizaremos SystemD podemos eliminar el script de SysV para evitar conflictos:

rm /etc/init.d/kibana

Instalacion de plugins de logstash

Debemos instalar los plugins basicos que vamos a necesitar en nuestro logstash

/usr/share/logstash/bin/logstash-plugin install logstash-output-elasticsearch logstash-input-file logstash-input-beats

En caso de querer configurar el "autoreload" para el logstash debemos editar el archivo /etc/systemd/system/logstash.service

vi /etc/systemd/system/logstash.service

y agregamos --config.reload.automatic a la linea que inicia cono ExecStart
quedando de la siguiente manera:

ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash" --config.reload.automatic

Guardamos el archivo y reiniciamos el logstash para que tome los cambios

systemctl daemon-reload
systemctl restart logstash

Configurar X-PACK para elasticsearch y kibana

x-pack es el nuevo complemento que trae el stack elk en la version 5.0, basicamente lo que hace este plugin es "segurizar" el nuestro elasticsearch utilizando usuarios para acceder y roles para permitir el acceso a los distintos documentos

Debemos descargar el plugin x-pack:

cd /tmp
wget https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-5.0.0.zip

Instalamos el plugin a nuestro elasticsearch y le otorgamos todos los permisos que solicita el mismo

[root@elk ~]# /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///tmp/x-pack-5.0.0.zip
-> Downloading file:///tmp/x-pack-5.0.0.zip
[=================================================] 100%  
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: plugin requires additional permissions     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.lang.RuntimePermission accessClassInPackage.com.sun.activation.registries
* java.lang.RuntimePermission getClassLoader
* java.lang.RuntimePermission setContextClassLoader
* java.lang.RuntimePermission setFactory
* java.security.SecurityPermission createPolicy.JavaPolicy
* java.security.SecurityPermission getPolicy
* java.security.SecurityPermission putProviderProperty.BC
* java.security.SecurityPermission setPolicy
* java.util.PropertyPermission * read,write
* java.util.PropertyPermission sun.nio.ch.bugLevel write
* javax.net.ssl.SSLPermission setHostnameVerifier
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.
 
Continue with installation? [y/N]y
-> Installed x-pack

Luego instalamos el plugin a nuestro kibana

[root@elk ~]# /usr/share/kibana/bin/kibana-plugin install file:///tmp/x-pack-5.0.0.zip
Attempting to transfer from file:///tmp/x-pack-5.0.0.zip
Transferring 72364732 bytes....................
Transfer complete
Retrieving metadata from plugin archive
Extracting plugin archive
Extraction complete
Optimizing and caching browser bundles...
Plugin installation complete

Luego reiniciamos los dos servicios para que tomen los cambios

systemctl restart elasticsearch logstash

Con esto tenemos instalado ELK en nuestro servidor, solo debemos comenzar a crear los filtros de logstash y recibir datos

Configurar Logstash

Debido a que instalamos x-pack debemos crear un usuario para que logstash inserte los datos a elasticsearch
Primero debemos crear el role logstash_writer el cual tendra permisos de escritura en cualquier indice

curl -XPOST "http://elastic:changeme@localhost:9200/_xpack/security/role/logstash_writer" -d '
{
  "cluster": ["manage_index_templates", "monitor"],
  "indices": [
    {
      "names": [ "*" ],
      "privileges": ["write","delete","create_index"]
    }
  ]
}'

Luego creamos el usuario y le asignamos el role recien creado

curl -XPOST "http://elastic:changeme@localhost:9200/_xpack/security/user/logstash" -d '
{ "password" : "pass_para_logstash",
  "roles" : [ "logstash_writer" ]}'

Con el comando anterior creamos el usuario logstash con el password "pass_para_logstash" con el role superuser que es el role por defecto con todos los privilegios

Agregamos un input y output basico para que nuestro logstash capture datos de rsyslog

Primero debemos agregar el input que se encargaria de leer y parsear los archivos, para esto creamos el archivo /etc/logstash/conf.d/01-rsyslog.conf

vi /etc/logstash/conf.d/01-rsyslog.conf

Y agregamos lo siguiente:

input {
  file {
    path => "/var/log/*.log"
    start_position => "beginning"
    type => "logs"
  }
}
 
filter {
 if [type] == "logs" {
   grok {
     match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
   }
   syslog_pri { }
   date {
     match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
     target => "@timestamp"
   }
 }
}

Luego agregamos el output para insertar a elasticsearch

vi /etc/logstash/conf.d/99-elastic-output.conf

y agregamos

output {
  elasticsearch {
    hosts => [ "localhost:9200" ]
    sniffing => true
    manage_template => false
    index => "%{indice}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
        user    => logstash
        password => password_del_logstash
  }
}

Donde se debe cambiar password_del_logstash por el password que le asignamos al usuario logstash

Finalmente configuramos el kibana para que escuche en todas las IPs del equipo
Editamos el archivo /etc/kibana/kibana.yml

vi /etc/kibana/kibana.yml

y editamos la linea

server.host: "localhost"

dejandolo de la siguiente manera:

server.host: "0.0.0.0"

Reiniciamos kibana:

systemctl restart kibana

Con esto en unos minutos podemos comenzar a ver los logs accediendo a nuestro kibana:
http://ipdenuestoserver:5601
Las credenciales por defecto son:
user: elastic
password: changeme