Instalación de ELK Stack 7.10.x en Debian 10 (parte II)

Teniendo en cuenta que hemos realizado la instalación de todos los componentes del stack en la Parte I de este tutorial, procederemos a configurar la seguridad.

Paso 1.- Preparar el entorno y generar certificados.

Para cada instancia crearemos una entrada en el host del equipo:

 192.168.1.95 elk.node1.local
 192.168.1.95 elk.kibana.local
 192.168.1.95 elk.logstash 

Hemos utilizado la ip pública del equipo porque la conexión a Kibana y logstash se realizará desde nuestra red de equipos y en el caso del node1 (elasticsearch) por si incluyésemos nuevos nodos para un cluster de Elastick.

Crearemos una carpeta temporal, por ejemplo “tmp_certs” bajo el directorio “/etc/elasticsearch” para generar todos los certificados de una vez. En la carpeta crearemos el fichero “instances.yml” para definir los nodos y elementos que vamos a utilizar en el stack. El contenido será el siguiente:

instances:
   - name: 'node1'
     dns: [ 'elk.node1.local' ]
   - name: 'kibana'
     dns: [ 'elk.kibana.local' ]
   - name: 'logstash'
     dns: [ 'elk.logstash.local' ] 

Ahora generaremos los certificados del servidor y CA, en nuestro caso utilizamos la propia CA que viene incluida en Elasticsearch y que es gestionada a través del comando elasticsearch-certutil

# /usr/share/elasticsearch/bin/elasticsearch-certutil cert --keep-ca-key --pem --in /etc/elasticsearch/tmp_certs/instances.yml --out /etc/elasticsearch/tmp_certs/certs.zip

Descomprimimos el archivo para poder acceder a los certificados:

# cd /etc/elasticsearch/tmp_certs
# unzip certs.zip

Los certificados creados son los siguientes:

Paso 2.- Configuración de TLS en Elasticsearch

Iremos el directorio de Elasticseach y crearemos una nueva carpeta llamada “/etc/elasticseach/certs”  y copiaremos los certificados para Elasticsearch del paso anterior:

# cd /etc/elasticsearch
# mkdir certs
# cp ./tmp_certs/ca/ca* ./tmp_certs/node1/* certs

En la carpeta “/etc/elaticsearch/certs” deberán estar los siguientes archivos:

Ahora procederemos a añadir en el archivo de configuración de Elasticsearch (/etc/elasticsearch/elasticsearch.yml) las siguientes configuraciones:

 
# Nombre del nodo
# ---------------
node.name: node1
network.host: elk.node1.local
 
# Configuración de seguridad
# --------------------------
xpack.security.enabled: true
xpack.security.http.ssl.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.key: certs/node1.key
xpack.security.http.ssl.certificate: certs/node1.crt
xpack.security.http.ssl.certificate_authorities: certs/ca.crt
xpack.security.transport.ssl.key: certs/node1.key
xpack.security.transport.ssl.certificate: certs/node1.crt
xpack.security.transport.ssl.certificate_authorities: certs/ca.crt
 
# En caso de multinodo
# --------------------
# discovery.seed_hosts: [ "node1.elastic.test.com" ]
# cluster.initial_master_nodes: [ "node1" ]
 
# Indicamos que solo hay un nodo
# ------------------------------
discovery.type: single-node

Iniciaremos el servicio de Elasticsearch:

# systemctl start elasticsearch

Paso 3.- Configuración de las contraseñas de acceso

Elasticsearch dispone de una herramienta para la creación de las contraseñas de acceso para los distintos usuarios del stack. En nuestro caso ejecutaremos el comando elasticsearch-setup-passwords con el parámetro auto para que nos genere las contraseñas automáticamente.

# /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto -u https://elk.node1.local:9200

Paso 4.- Comprobación nodo Elasticsearch

Comprobaremos a través del API de Elasticsearch el estado del nodo1:

# curl --cacert /etc/elasticsearch/tmp_certs/ca/ca.crt -u elastic 'https://elk.node1.local:9200/_cat/nodes?v'

Paso 5.- Habilitar TLS para Kibana

Crearemos la carpeta /etc/kibana/certs y copiaremos los certificados.

# cd /etc/kibana
# mkdir certs
# cp /etc/elasticsearch/tmp_certs/kibana/* /etc/elasticsearch/tmp_certs/ca/ca.crt /etc/kibana/certs

Quedando de la siguiente forma:

Ahora procederemos a añadir en el archivo de configuración de Kibana (/etc/kibana/kibana.yml)  las siguientes configuraciones:

# Nombre del host
# ----------------
server.name: "kibana"
server.host: "elk.kibana.local"

# Configuracion de Seguridad
# ---------------------------
server.ssl.enabled: true
server.ssl.certificate: /etc/kibana/certs/kibana.crt
server.ssl.key: /etc/kibana/certs/kibana.key
Configuración con Elasticsearch
elasticsearch.hosts: ["https://elk.node1.local:9200"]
elasticsearch.username: "kibana"
elasticsearch.password: "moJa8w7iHWNzeucQO39V"
elasticsearch.ssl.certificateAuthorities: [ "/etc/kibana/certs/ca.crt" ]

Teniendo en cuenta de cambiar la contraseña del usuario “Kibana” creado anteriormente en el “Paso 3”.

Paso 6.- Iniciar Kibana y comprobar que funciona correctamente

Para inciar Kibana

# systemctl start kibana

Comprobar el acceso con el usuario “elastic” en la URL https://elk.kibana.local:5601

Paso 7.- Preparar los usuarios para Logstash

Para que Logstash pueda gestionar los índices hace falta que creemos un rol con permiso de escritura y un usuario asignado al Rol. La forma de crear el usuario más rápida es a través de la herramienta de comandos en Kibana, podemos encontrarla en Management/Dev Tools:

Primero creamos el rol “logstash_writer_role”:

POST /_security/role/logstash_writer_role
{
    "cluster": ["monitor","manage_index_templates","manage_ilm"],
    "indices": [
      {
        "names": [
          "logstash*"
        ],
        "privileges": [
          "write",
                 "create",
          "create_index",
                 "manage",
                 "manage_ilm"
        ],
        "field_security": {
          "grant": [
            "*"
          ]
        }
      }
    ],
    "run_as": [],
    "metadata": {},
    "transient_metadata": {
      "enabled": true
    }
}

Al crearlo obtendremos la siguiente respuesta:

Ahora crearemos el usuario “logstash_internal” con un password que posteriormente se usara en los archivos de configuración de Logstash:

 POST /_security/user/logstash_internal
  {
      "password" : "kfssfSSS45454",
      "roles" : [ "logstash_writer_role"],
      "full_name" : "Internal Logstash User"
  }

El resultado deberá ser el siguiente:

Paso 8.- Habilitar TSL para Logstash

Crearemos la carpeta «/etc/logstash/certs» y copiaremos los certificados:

# cd /etc/logstash
# mkdir certs
# cp /etc/elasticsearch/tmp_certs/logstash/* /etc/elasticsearch/tmp_certs/ca/ca.crt /etc/logstash/certs

Quedando de la siguiente forma:

Ahora procederemos a añadir en el archivo de configuración de Logstash (/etc/logstash/logstash.yml) las siguiente configuración:

# Nombre del nodo
# ----------------
node.name: logstash.local
 
# Configuración de elasticsearch
# --------------------------------
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: 'WLkNRDcX7i952uTGyU0m'
xpack.monitoring.elasticsearch.hosts: [ 'https://elk.node1.local:9200' ]
xpack.monitoring.elasticsearch.ssl.certificate_authority: /etc/logstash/certs/ca.crt

Teniendo en cuenta de cambiar la contraseña del usuario “logstash_system” creado anteriormente en el “Paso 3”.

Paso 9.- Crear un certificado para los Beats

Para que los Beats se comuniquen de forma segura con el Logstash convertiremos logstash.key a formato PKCS#8 para usarlo en el plugin de entrada de los Beats.

# openssl pkcs8 -in /etc/logstash/certs/logstash.key -topk8 -nocrypt -out /etc/logstash/certs/logstash.pkcs8.key

Tendremos que dar permisos de lectura al usuario logstash del sistema al fichero que hemos creado, logstash.pkcs8.key

Paso 10.- Configurar una regla en logstash

Definiremos una entrada y salida de datos en Logstash. Para la salida utilizaremos la contraseña del usuario “logstash_internal” creada en el Paso 7. La definición se realiza creando un fichero de tipo Yalm (pero con la extensión .conf) en la carpeta «/etc/logstash/conf.d». En nuestro caso crearemos el fichero prueba.conf con el siguiente contenido:

input {
  beats {
    port => 5044
    ssl => true
    ssl_key => '/etc/logstash/certs/logstash.pkcs8.key'
    ssl_certificate => '/etc/logstash/certs/logstash.crt'
  }
}
output {
  elasticsearch {
    hosts => ['https://elk.node1.local:9200']
    cacert => '/etc/logstash/certs/ca.crt'
    user => 'logstash_internal'
    password => 'kfssfSSS45454'
  }
}

Paso 11.- Comprobar que Logstash funciona

Debemos tener en cuenta que Logstash si no tiene ninguna regla definida se ira reiniciando sólo hasta que la encuentre, por lo que es importante tener realizado el Paso 10.

Para iniciarlo ejecutaremos:

# systemctl start logshtash

Para comprobar que funciona podemos consultar si esta escuchando el puerto que hemos definido para el Beat:

# netstat –tan|grep 5044

En esté punto ya podríamos monitorizar desde Kibana el stack, habilitando la monitorización en el apartado de “Management/Stack Monitoring”:

Paso 11.- Configurar y ejecutar Filebaet

Crearemos la carpeta /etc/filebeat/certs y copiaremos el certificado:

# cd /etc/filebeat
# mkdir certs
# cp /etc/elasticsearch/tmp_certs/ca/ca.crt /etc/filebeat/certs

Para tener un archivo de configuración más “limpio” procederemos a mover el archivo «/etc/filebeat/filebeat.yml» a «/etc/filebeat/filebeat.yml.orig» y crearemos un archivo vacío llamado «/etc/filebeat/filebeat.yml» añadiéndole las siguientes líneas:

filebeat.inputs:
 - type: log
   enabled: true
   paths:
    - /var/log/*.log
output.logstash:
   hosts: ["elk.logstash.local:5044"]
   ssl.certificate_authorities:
     - /etc/filebeat/certs/ca.crt 

Básicamente le estamos indicando que envíe los logs a Logstash de los archivos .log en el directorio «/var/log«
Iniciaremos el servicio:

# systemctl start filebeat

Paso 12.- Visualización de los logs en Kibana

El primer paso para poder visualizar los datos enviados por los Beats es crear un patrón de índice. En Kibana iremos a Management/Stack Management/Kibana/Index Patterns:

Pulsaremos crear índice e indicaremos que queremos crear un patrón para logstash:

Indicaremos el campo primario para la marca de tiempo del registro:

Al pulsar el botón de crear índice nos mostrará una pantalla con todos los campos asociados al índice.
Ahora ya podemos ver los logs que son enviados desde Filebeat en el panel de Kibana en el apartado Kibana/Discover y seleccinando el patrón de «logstash*«

Consideraciones finales

  • Para que al iniciar el equipo inicien todos los servicios del stack ejecutaremos los siguientes comandos:
        # systemctl enable elasticsearch
        # systemctl enable logstash
        # systemctl enable kibana
        # systemctl enable filebeat
 

Teniendo en cuenta que todo depende del servicio “Elasticsearch” y es el primero que debería iniciarse.

  • El nombre de los índices y su rotación puede definirse en el fichero de configuración de los Beats en Logstash.
  • En Debian, por defecto, Elasticsearch guarda los datos en “/var/lib/elasticsearch”, esta ubicación se puede cambiar a través del fichero de configuración “/etc/elasticsearch/elasticsearch.yml”
  • En el proceso de configuración y puesta en marcha de los servicios nos puede ser de gran ayuda ver el log con «Journalctl».