# Elastic Stack

## Introducción

Este manual describe el procedimiento de instalación del **Elastic Stack (ELK)**.

## Preparativos para la Instalación

Esta sección abarca los pasos esenciales necesarios para la instalación.

{% hint style="warning" %}
Todos los pasos deben ejecutarse con privilegios de root en todos los nodos, salvo indicación en contrario.
{% endhint %}

Para instalar el ELK, necesitará:

* Permiso de root en el servidor
* GBDS instalado en el servidor

{% hint style="info" %}
Si no tiene el archivo, póngase en contacto con el equipo de soporte de Griaule.
{% endhint %}

Luego, siga los pasos presentados a continuación.

1. Inicie sesión en el servidor como *root*.
2. [Prepare el Repositorio](#prepare-o-repositorio).
3. [Instale y Configure Elasticsearch](#instalando-e-configurando-o-elasticsearch).
4. [Instale y Configure Kibana](#instalando-e-configurando-o-kibana).
5. [Instale y Configure Logstash](#instalando-e-configurando-o-logstash).
6. [Configure ELK con SmartSense](#configurando-o-elk-com-o-smartsense).

## Prepare el Repositorio

Para instalar ELK, primero el repositorio debe ser agregado al servidor.

Para ello, importe la clave GPG:

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

Cree el archivo del repositorio:

```bash
vim /etc/yum.repos.d/elasticsearch.repo
```

Agregue el siguiente contenido al archivo y guárdelo:

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

Luego, actualice la caché del gestor de paquetes. Comience limpiando la caché:

```bash
yum clean all
```

Finalmente, haga un rebuild de la caché de paquetes:

```bash
yum makecache
```

## Instalando ELK

### Instalando y Configurando Elasticsearch

Instale el paquete Elasticsearch:

```bash
yum install elasticsearch -y
```

Luego, abra el archivo de configuración de Elasticsearch:

```bash
vim /etc/elasticsearch/elasticsearch.yml
```

En la sección *Network*, busque la línea que comienza con `#network.host:`. Descomente la línea y cambie su valor a:

{% hint style="info" %}
Asegúrese de sustituir `<host-ip>` por la dirección IP del servidor.
{% endhint %}

```yml
network.host: <host-ip>
              ^^^^^^^^^
```

A continuación, desactive el SSL cambiando las siguientes configuraciones a `false`:

```yml
xpack.security.enabled: false

xpack.security.enrollment.enabled: false

# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
  enabled: false
  keystore.path: certs/http.p12

# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
  enabled: false
```

Entonces, inicie el servicio de Elasticsearch:

```bash
sudo systemctl start elasticsearch
```

Y habilite el servicio de Elasticsearch para que inicie automáticamente al arranque de la máquina:

```bash
sudo systemctl enable elasticsearch
```

Finalmente, verifique que el servicio de Elasticsearch esté en ejecución:

{% hint style="info" %}
Asegúrese de sustituir `<host-ip>` por la dirección IP del servidor.
{% endhint %}

```bash
curl -X GET "<host-ip>:9200"
             ^^^^^^^^^
```

El resultado debe ser similar a:

```json
{
	"name": "QDexH8a",
	"cluster_name": "elasticsearch",
	"cluster_uuid": "gAAIqERvS_msO7Y1_759Ja",
	"version": {
		"number": "6.8.23",
		"build_flavor": "default",
		"build_type": "rpm",
		"build_hash": "4f67856",
		"build_date": "2022-01-06T21:30:50.087716Z",
		"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"
}
```

### Instalando y Configurando Kibana

Instale el paquete Kibana:

```bash
yum install kibana -y
```

Luego, abra el archivo de configuración de Kibana:

```bash
vim /etc/kibana/kibana.yml
```

Busque la línea que comienza con `#server.host:`. Descomente la línea y cambie su valor a:

{% hint style="info" %}
Asegúrese de sustituir `<hostname>` por el nombre de host del servidor. Mantenga las comillas dobles.
{% endhint %}

```yml
server.host: "<hostname>"
              ^^^^^^^^^^
```

A continuación, busque la línea que comienza con `#elasticsearch.hosts:`. Descomente la línea y cambie su valor a:

{% hint style="info" %}
Asegúrese de sustituir `<elasticsearch-host-ip>` por la dirección IP configurada en Elasticsearch. Mantenga las comillas dobles.
{% endhint %}

```yml
elasticsearch.hosts: ["http://<elasticsearch-host-ip>:9200"]
                              ^^^^^^^^^^^^^^^^^^^^^^^
```

Entonces, inicie el servicio de Kibana:

```bash
sudo systemctl start kibana
```

Y habilite el servicio de Kibana para que inicie automáticamente al arranque de la máquina:

```bash
sudo systemctl enable kibana
```

A continuación, instale y configure Nginx.

#### Instalando y Configurando Nginx

Instale el paquete Nginx:

```bash
yum install nginx -y
```

A continuación, cree un archivo que contendrá las credenciales de autenticación para Kibana. Para ello, ejecute el siguiente comando e ingrese la contraseña deseada cuando se le solicite:

```bash
echo "kibanaadmin:`openssl passwd -apr1`" | tee -a /etc/nginx/htpasswd.users
```

Luego, cree un nuevo archivo de configuración para Nginx:

{% hint style="info" %}
Asegúrese de sustituir `<hostname>` por el nombre de host del servidor.
{% endhint %}

```bash
vim /etc/nginx/conf.d/<hostname>_kibana.conf
                      ^^^^^^^^^^
```

Agregue el siguiente contenido al archivo, realizando los cambios apropiados en `server_name` y `proxy_pass`:

{% hint style="info" %}
Asegúrese de sustituir `<host-ip>` por la dirección IP del servidor y `<kibana-host-ip>` por la dirección IP del servidor en el que está instalado Kibana.
{% endhint %}

{% hint style="warning" %}
A continuación, las líneas que contienen **"^^^^^^^^^"** están presentes solo para resaltar los cambios que deben realizarse. Elimínelas antes de guardar el archivo.
{% endhint %}

```properties
server {
	listen 80;

	server_name <host-ip>;
	            ^^^^^^^^^

	auth_basic "Restricted Access";
	auth_basic_user_file /etc/nginx/htpasswd.users;

	location / {
		proxy_pass http://<kibana-host-ip>:5601;
		                  ^^^^^^^^^^^^^^^^
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection 'upgrade';
		proxy_set_header Host $host;
		proxy_cache_bypass $http_upgrad;
	}
}
```

Pruebe el archivo de configuración de Nginx:

```bash
nginx -t
```

Luego, reinicie el servicio de Nginx:

```bash
systemctl restart nginx
```

Si es necesario, configure la conexión en SE:

```bash
setsebool httpd_can_network_connect 1 -P
```

Finalmente, verifique que el servicio de Kibana esté en ejecución, accediendo a la siguiente URL en un navegador:

{% hint style="info" %}
Asegúrese de sustituir `<host-ip>` por la dirección IP del servidor.
{% endhint %}

```bash
http://<host-ip>/status
       ^^^^^^^^^
```

{% hint style="success" %}
El nombre de usuario es **kibanaadmin** y la contraseña es la creada anteriormente.
{% endhint %}

### Instalando y Configurando Logstash

Instale el paquete Logstash:

```bash
yum install logstash -y
```

A continuación, instale el paquete MySQL Connector/J:

```bash
yum install mysql-connector-java -y
```

{% hint style="info" %}
Si no se encuentra, descárguelo en: <https://dev.mysql.com/downloads/connector/j/>
{% endhint %}

Luego, cree el archivo de configuración de Logstash:

```bash
vim /etc/logstash/conf.d/smartsense.conf
```

Agregue el siguiente contenido al archivo, realizando los cambios apropiados en `jdbc_connection_string`, `jdbc_user`, `jdbc_password` y `hosts`:

{% hint style="info" %}
Asegúrese de sustituir `<database-ip>`, `<database-username>`, `<database-password>` y `<elasticsearch-host-ip>` por los valores apropiados. Mantenga las comillas dobles.
{% endhint %}

{% hint style="warning" %}
A continuación, las líneas que contienen **"^^^^^^^^^"** están presentes solo para resaltar los cambios que deben realizarse. Elimínelas antes de guardar el archivo.
{% endhint %}

```properties
input {
	jdbc {
		jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar"
		jdbc_driver_class => "com.mysql.jdbc.Driver"
		jdbc_connection_string => "jdbc:mysql://<database-ip>:3306/"
		                                        ^^^^^^^^^^^^^
		jdbc_user => "<database-username>"
		              ^^^^^^^^^^^^^^^^^^^
		jdbc_password => "<database-password>"
		                  ^^^^^^^^^^^^^^^^^^^
		jdbc_validate_connection => true
		tracking_column => "id"
		use_column_value => true
		statement => "SELECT * FROM smartsense.load_balancing_count where id > :sql_last_value;"
		schedule => "*/2 * * * *"
		clean_run => false
	}
}
output {
	elasticsearch {
		hosts => ["<elasticsearch-host-ip>:9200"]
		           ^^^^^^^^^^^^^^^^^^^^^^^
		index => "smart_sense_index_pattern"
		document_id => "%{[id]}"
	}
	stdout {
		codec => rubydebug
	}
}
```

A continuación, el archivo systemd de Logstash necesita ser modificado para garantizar que se inicie usando el archivo de configuración creado anteriormente. Para ello, abra el archivo:

```bash
vim /etc/systemd/system/logstash.service
```

{% hint style="info" %}
Es posible que el archivo esté ubicado en `/usr/lib/systemd/system/logstash.service`.
{% endhint %}

Busque la línea que comienza con `ExecStart=`. Cambie su valor de:

```properties
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash"
```

A:

```properties
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash" "-f" "/etc/logstash/conf.d/smartsense.conf"
```

Luego, aplique los cambios recargando la configuración de systemd:

```bash
systemctl daemon-reload
```

{% hint style="warning" %}
Si está instalando en un servidor nuevo que posee una base de datos vacía, inserte un valor ficticio en la tabla `smartsense.load_balancing_count` para evitar errores. Para ello, ejecute el siguiente comando e ingrese la contraseña de la base de datos:

Asegúrese de sustituir `<database-username>` y `<mysql-database-ip>` por los valores apropiados.

```bash
#        vvvvvvvvvvvvvvvvvvv       vvvvvvvvvvvvvvvvvvv
mysql -u <database-username> -p -h <mysql-database-ip> \
      -e "USE smartsense; INSERT INTO load_balancing_count
         (id, hostname, load_time, api_id, transaction_type,
         latent, ul, load_count, extraction_time_avg, extraction_quality_avg,
         match_avg, total_avg, extraction_time_min, extraction_quality_min, match_min,
         total_min, extraction_time_max, extraction_quality_max, match_max, total_max)
         VALUES
         (1, 'hostname', '2023-08-31 21:25:40', '8829E30D-4994-4D09-99AF-B6F818473928',
         'IDENTIFY', 'false', 'false', 1, '541.0', '0.0', '48.0', '599.0',
         '541', '0', '48', '599', '541', '0', '48', '599');"
```

{% endhint %}

A continuación, habilite el servicio de Logstash para que inicie automáticamente al arranque de la máquina:

```bash
sudo systemctl enable logstash
```

Luego, inicie el servicio de Logstash:

```bash
sudo systemctl start logstash
```

Y supervise el registro:

```bash
tail -f /var/log/logstash/logstash-plain.log
```

{% hint style="danger" %}
Si ocurre un error indicando que Logstash no puede escribir en el directorio `/var/lib/logstash/{folder}`, ejecute el siguiente comando para cambiar su *owner*:

```bash
chown -R logstash:logstash /var/lib/logstash
```

{% endhint %}

Finalmente, para verificar si Logstash creó el índice en Elasticsearch, ejecute el siguiente comando:

{% hint style="info" %}
Asegúrese de sustituir `<elasticsearch-host-ip>` por la dirección IP del servidor en el que está instalado Elasticsearch.
{% endhint %}

```bash
curl -X GET "<elasticsearch-host-ip>:9200/_cat/indices?v"
             ^^^^^^^^^^^^^^^^^^^^^^^
```

La salida debe ser similar a:

```
health status index                     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   smart_sense_index_pattern 6Ux_yM25SvG2zWGdGR0HQw   5   1          1            0      6.7kb          6.7kb
green  open   .kibana_1                 BBO89yLnTUC3F7nhqKwf9w   1   0          4            0       18kb           18kb
green  open   .kibana_task_manager      sIMoATiBRsS8bXiVBCscrA   1   0          2            0     12.5kb         12.5kb
```

## Configurando ELK con SmartSense

### Configurando Kibana

#### Creando la *Data View*

{% hint style="info" %}
Asegúrese de sustituir `<kibana-host-ip>` por la dirección IP del servidor en el que está instalado Kibana.
{% endhint %}

En un navegador, acceda a: `http://<kibana-host-ip>:5601`. Luego, abra la barra lateral de opciones haciendo clic en este ícono, ubicado en la esquina superior izquierda de la pantalla:

![](https://974439850-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7Bx0xNdsdGHpCZ20yxbn%2Fuploads%2Fgit-blob-be9298bcfe483cd976bad2fa92cc46d0752c962d%2Fkibana_sandwich_menu.png?alt=media)

Haga clic en Management (última sección). Luego, en las opciones del lado izquierdo, en la sección *Fecha*, haga clic en Index Management.

O acceda a la siguiente URL directamente:

```html
http://<kibana-host-ip>:5601/app/management/data/index_management/indices
       ^^^^^^^^^^^^^^^^
```

Asegúrese de que el índice `smart_sense_index_pattern` aparezca en la lista.

Luego, en la sección *Kibana* de las opciones del lado izquierdo, haga clic en Data Views.

Haga clic en el botón azul Create data view y rellene los campos con la siguiente información:

* Name: `SS Pattern`
* Index pattern: `smart_sense_index_pattern`
* Timestamp field: `load_time`

Confirme la creación de la *Data View* haciendo clic en Save data view to Kibana.

#### Creando los *Dashboards*

Abra nuevamente la barra lateral de opciones haciendo clic en el ícono en la esquina superior izquierda de la pantalla. En la sección Analytics, haga clic en Dashboards.

O acceda a la siguiente URL directamente:

```html
http://<kibana-host-ip>:5601/app/dashboards
       ^^^^^^^^^^^^^^^^
```

Haga clic en el botón azul Create dashboard. Luego, haga clic en Create visualization. En el lado derecho, configure la *visualization* con la siguiente información:

* Visualization type: `Bar vertical stacked`
* Data view: `SS Pattern`
* Horizontal Axis:
  * Functions: `Date histogram`
  * Field: `load_time`
* Vertical Axis:
  * Functions: `Sum`
  * Field: `load_count`

Luego, haga clic en el símbolo +, ubicado en la esquina superior izquierda de la pantalla, para crear un nuevo filtro. Configure el filtro con la siguiente información: `transaction_type` `is` `ENROLL`. Confirme haciendo clic en Add filter.

Finalmente, guarde el *dashboard* haciendo clic en Save to library, ubicado en la esquina superior derecha de la pantalla, e introduciendo la siguiente información:

* Title: `SS Enroll Dashboard`
* Tags: `smartsense-enroll`

Haga clic en Save and return.

Repita las operaciones anteriores para crear los siguientes *dashboards*:

{% hint style="info" %}
Ajuste los nombres y tags según sea necesario.
{% endhint %}

* Para **VERIFY** añada el filtro: `transaction_type` `is` `VERIFY`
* Para **UPDATE** añada el filtro: `transaction_type` `is` `UPDATE`
* Para **IDENTIFY** añada el filtro: `transaction_type` `is` `IDENTIFY` `and` `latent` `is` `false`
* Para **LATENT** añada el filtro: `transaction_type` `is` `IDENTIFY` `and` `latent` `is` `true`

Con los cinco dashboards creados, entre en cada uno de ellos y configure el intervalo de tiempo a mostrar, haciendo clic en el ícono de calendario, ubicado en la esquina superior derecha de la pantalla.

Luego, haga clic en Share y en Copy link. Guarde el enlace, ya que se usará posteriormente.

Repita la operación para los cinco dashboards.

Al final de cada enlace, añada la siguiente información:

```default
&hide-filter-bar=true&show-time-filter=true&embed=true
```

Por ejemplo, el enlace:

```default
http://172.16.0.185:5601/app/lens#/edit/a0a936d5-4e92-4015-b3e7-37810c2a114a?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))
```

Quedará:

```default
http://172.16.0.185:5601/app/lens#/edit/a0a936d5-4e92-4015-b3e7-37810c2a114a?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true
```

Repita la operación para los cinco enlaces obtenidos.

Guarde los enlaces, ya que se usarán en el paso siguiente.

### Configurando los Dashboards en SmartSense

Abra el archivo de configuración de SmartSense, `config.properties`, ubicado en la carpeta `/var/lib/tomcats/smart-sense/conf`:

```bash
vim /var/lib/tomcats/smart-sense/conf/config.properties
```

Encuentre la sección **# SMARTSENSE - ELK CONFIGURATION**.

Para cada propiedad (`linkEnroll`, `linkIdentify`, `linkIdentifyLatent`, `linkUpdate`, `linkVerify`), inserte el enlace del dashboard correspondiente obtenido anteriormente. Por ejemplo:

```properties
linkEnroll=http://172.16.0.185:5601/app/lens#/edit/a0a936d5-4e92-4015-b3e7-37810c2a114a?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true

linkUpdate=http://172.16.0.185:5601/app/lens#/edit/25d53ee8-7adc-4b06-b05d-f38bfda39c66?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true

linkVerify=http://172.16.0.185:5601/app/lens#/edit/8bfa1546-7990-4ed3-baae-86e421a60aef?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true

linkIdentify=http://172.16.0.185:5601/app/lens#/edit/0d5edf08-ca78-40fc-ac5f-59ca91d07412?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true

linkIdentifyLatent=http://172.16.0.185:5601/app/lens#/edit/e3f84cc5-68dd-4c76-a84e-d209da2e777a?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true
```

Guarde y cierre el archivo.

Después de completar todos los pasos del procedimiento de instalación del Elastic Stack, vuelva al [manual de Configuración del SmartSense Server](https://docs.griaule.com/gbs/es/componentes-web/smartsenseconfig) para completar la configuración.
