Tutorial: Como instalar Kibana 5 para leer logs de Apache/Nginx

¿Por qué Kibana?

Porque Kibana te permite analizar que archivos se han solicitado y/o servido de tu web, lo que te aporta una visión diferentes respecto al análisis por medio de recolección de datos por scripts de javascript como Analytics.

analizar logs apache nginx con kibana


¿Cuál es la ventaja de analizar logs?

Los logs son simplemente el registro de todas las solicitudes y errores que se realizan a tu servicio web (Apache/Nginx por ejemplo), por lo tanto, los logs te aportan una visión muy veraz respecto a que es lo que pasa a nivel de archivos solicitados y/o servidos, independientemente de si se ha llegado a cargar del todo la petición en el navegador del cliente, o si se está ejecutando javascript en el cliente. Es también una forma muy veraz de ver que errores se están generando al intentar servir datos a los navegadores. Y no olvidar que cuando pasa algo con un portal respecto al comportamiento, un posible hackeo, caídas, es un buen sitio por donde empezar a indagar por donde van los tiros.

¿Por dónde empezamos?

Hay 3 programas necesarios:

Logstash: Permite recolectar de un servidor o varios, los logs que queremos almacenar y posteriormente analizar.

ElasticSearch: Es un motor de búsqueda que permite hacer búsquedas de forma rápida en grandes volúmenes de datos y que a su vez, es fácilmente escalable.

Kibana: Es la herramienta para visualizar los datos a través de un entorno web, permitiendo generar dashboards y exportar CSVs con datos.

Instalar Logstash

En mi caso la instalación la estoy realizando en un Debian Little Endian. Algunos comandos pueden variar para tu entorno pero por lo general no deberías tener demasiados problemillas.

Para empezar toca abrir un terminal con ssh y actualizar los repositorios con el comando sudo apt-get update

Nuestra versión Logstash 2.4 requiere Java 7 así que tocará instalarlo antes. Podemos comprobar nuestra versión de Java con el comando java -version Si te aparece «java version «1.7.xxx» entonces perfecto. Si no toca instalarlo.

Instalar Java si no lo tenemos

Añadir los repositorios oficiales de Java:

echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | \
sudo tee /etc/apt/sources.list.d/webupd8team-java.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | \
sudo tee -a /etc/apt/sources.list.d/webupd8team-java.list

Añadir la firma pública del repositorio:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886

Actualizar los repositorios: sudo apt-get update
Instalamos Java: sudo apt-get install oracle-java8-installer
Cuando nos aparezca

Do you want to continue? [Y/n] root@vps234889:/var/www/public#

pulsamos «Y»
Después en la ventana <Ok>:

instalar-java-debian-jessie

Ahora en <Yes>:

instalar-java-debian-jessie-2

Y finalmente comprobamos si tenemos Java instalado ejecutando java -version
Si nos aparece algo parecido a

java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

Entonces querrá decir que lo tenemos instalado correctamente.
Nota: Logstash requiere mínimo Java 7 (java version «1.>=7.X_XXX» ).

Seguimos con Logstash

Descargar e instalar la firma pública de los repositorios de elastic

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Añadimos el repositorio a nuestro listado de repositorios (usualmente está en /etc/apt/source.list):

echo "deb https://packages.elastic.co/logstash/2.4/debian stable main" | sudo tee -a /etc/apt/sources.list

Actualizamos los repositorios: sudo apt-get update
Instalamos Logstash: sudo apt-get install logstash
Si te aperece:

Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
logstash
0 upgraded, 1 newly installed, 0 to remove and 75 not upgraded.
Need to get 84.8 MB of archives.
After this operation, 143 MB of additional disk space will be used.
Get:1 https://packages.elastic.co/logstash/2.4/debian/ stable/main logstash all 1:2.4.0-1 [84.8 MB]
Fetched 84.8 MB in 9s (9,222 kB/s)
Selecting previously unselected package logstash.
(Reading database ... 43721 files and directories currently installed.)
Preparing to unpack .../logstash_1%3a2.4.0-1_all.deb ...
Unpacking logstash (1:2.4.0-1) ...
Processing triggers for systemd (215-17+deb8u4) ...
Setting up logstash (1:2.4.0-1) ...
Processing triggers for systemd (215-17+deb8u4) ...

Entonces es que todo ha ido bien.

Configurar Logstash

La configuración de Logstash se podría clasificar en 3 bloques principales:

  • Input: Todo lo relacionado con de donde se cogen los datos. Por ejemplo para definir que queremos leer los logs de Apache de la propia máquina y de otras máquinas (para lo cuál se usa Logstash-Forwarder).
  • Filter: Configuración relacionada con el filtrado, modificación de los datos. Por ejemplo para convertir logs de Nginx al formato estandar de Apache.
  • Output: A donde quiero enviar los datos. Que por lo general será la misma máquina (localhost) en donde se encontrará ElasticSearch (motor de base de datos).

Instalar Elasticsearch

Descargar e instalar la firma pública de los repositorios de elastic si no la tenemos ya.

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Añadimos el repositorio a nuestro listado de repositorios si no lo tenemos ya añadido (usualmente está en /etc/apt/source.list):

echo "deb https://packages.elastic.co/logstash/2.4/debian stable main" | sudo tee -a /etc/apt/sources.list

Actualizamos los repositorios: sudo apt-get update
Instalamos Logstash: sudo apt-get -y install elasticsearch

Configurar Elasticsearch

Todos los parámetros de Elasticsearch se definen en un sólo archivo que está usualmente en /etc/elasticsearch/elasticsearch.yml. Como nuestra configuración de Elasticsearch es muy simple ya que sólo usaremos una máquina para almacenar la información, y sólo queremos que se acceda a Elasticsearh desde la propia máquina, simplemente tenemos que modificar una línea.

Abrimos el archivo con el editor Nano sudo nano /etc/elasticsearch/elasticsearch.yml  y con Ctrl + W buscamos «network.host» y sustituimos:

# network.host: 192.168.0.1

por

network.host: localhost

Guardamos el archivo con Ctrl + O e Intro.

De este modo limitamos el acceso a Elasticsearch haciendo que sólo acepte conexiones desde propia máquina, ya que Logstash, quien va a enviar los datos a ElasticSearch se encuentra en la misma máquina en nuestro caso.

Sólo queda comprobar que todo está bien, para lo cual paramos con service elasticsearch stop y arrancamos de nuevo Elastichsearch con service elasticsearch start . Si no aparece ningún mensaje de error estupendo. Ahora para estar seguros de que funciona si ejecutas

curl http://localhost:9200

debería de aparecerte un mensaje de Elasticsearch.

Si ElasticSearch te devuelve el error de:

curl: (7) Failed to connect to localhost port 9200: Connection refused

Es que posiblemente intentas instalar ElasticSearch en una máquina de menos de 2gb de RAM libres. Con sudo journalctl –unit elasticsearch  podrás ver que Java te dice no tiene memoria suficiente:

Oct 30 14:18:21 vps.ovh.net elasticsearch[16875]: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit
Oct 30 14:18:21 vps.ovh.net elasticsearch[16875]: #
Oct 30 14:18:21 vps.ovh.net elasticsearch[16875]: # There is insufficient memory for the Java Runtime Environ
Oct 30 14:18:21 vps.ovh.net elasticsearch[16875]: # Native memory allocation (mmap) failed to map 2060255232
Oct 30 14:18:21 vps.ovh.net elasticsearch[16875]: # An error report file with more information is saved as:
Oct 30 14:18:21 vps.ovh.net elasticsearch[16875]: # /tmp/hs_err_pid16875.log
Oct 30 14:18:21 vps.ovh.net systemd[1]: elasticsearch.service: main process exited, code=exited, status=1/FAI
Oct 30 14:18:21 vps.ovh.net systemd[1]: Unit elasticsearch.service entered failed state.

Como un servidor se puede reiniciar por cualquier motivo es importante asegurarnos que cuando el servidor vuelva a arrancar, Elasticsearch también lo haga, lo cual podemos configurar simplemente ejecutando:

sudo update-rc.d elasticsearch defaults 95 10

Instalar Kibana 5

Antes de nada debemos instalar la firma pública del repositorio oficial de Kibana 5:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Si no tienes el paquete apt-transport-https debes instalarlo con

sudo apt-get install apt-transport-https

Actualizamos con sudo apt-get update y añadimos el repositorio de Kibana 5:

echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list

Volvemos a actualizar sudo apt-get update  e instalamos Kibana 5 con

sudo apt-get install kibana

Vamos a comprobar que arranca correctamente asegurandonos que está detenido sudo service kibana stop y arrancándolo nuevamente con sudo service kibana start.

Vamos a configurar que Kibana arranque con el encendido/reinicio del servidor con:

sudo update-rc.d kibana defaults 95 10

Kibana 5 limita por defecto el acceso a sólo localhost, es decir, que sólo la propia máquina puede acceder a Kibana, que es nuestra caso ya que el servidor web que usaremos está en el mismo servidor.

Instalar servidor web para visualizar Kibana 5

Es necesario instalar un servidor web para poder autentificar a los usuarios que acceden al panel. En nuestra caso vamos a instalar Nginx.

Lo instalamos ejecutando:

sudo apt-get install nginx apache2-utils

Creamos un archivo simple con los usuarios y contraseñas que queremos usar autenticar:

sudo htpasswd -c /etc/nginx/htpasswd.users usuariokibana

En este momento es en el que te pedirá una contraseña para tu usuario, que en nuestro caso es «usuariokibana».

Nota: El programa de htpasswd está incluido en el paquete «apache2-utils». Si no has instalado Nginx porque ya lo tenías en la máquina deberás instalar el paquete para poder generar un archivo de claves sudo apt-get install apache2-utils .

Ahora vamos a configurar el sitio web en nuestro servidor web, en este caso Nginx. En Nginx se configura en la ruta «/etc/nginx/sites-available/» cada una de las webs que quieres servir. Por lo tanto vamos  a empezar a crear nuestro archivo de configuración. Con sudo nano /etc/nginx/sites-available/kibana creas el archivo. Copia el código de abajo (Shift + Insert para pegar) :

server {
    listen 80;

    server_name nombredetudominio.com;

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

    location / {
        proxy_pass http://localhost: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_upgrade;        
    }
}

En la línea «server_name nombredetudominio.com» debes indicar el dominio que quieres usar para acceder a tu Kibana 5. Recuerda que las DNSs de tu dominio deberán apuntar a la ip pública del servidor donde estés montando tu Kibana.

Nota: Con Cloudflare puedes gestionar las DNSs de tu dominio gratis. Hay algunos proveedores de dominios en los cuales no es gratuito.

Para habilitar tales webs se debe crear un enlace simbólico en «/etc/nginx/sites-enabled/» hacia el archivo que define el sitio web en «/etc/nginx/sites-available/» lo cual se hace con el comando

sudo ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/kibana

Ya sólo queda reiniciar el servicio de Nginx con sudo service nginx restart

Ahora si accedes a nombredetudominio.com te debería pedir un usuarios y una contraseña y posteriormente te deberia de aparecer la siguiente imagen:

Efectivamente, aún no aparece ningún dato ni nada. Eso es porque aún lo le está llegando nada, pero está todo listo para empezar a recibir datos. Para ello, vamos a configurar las fuentes de datos que ElasticSearch va a almacenar y posteriormente Kibana 5 nos permitirá analizar.

Configurar Input, Filter y Output de Logstash

Te dejo seguir la aventura con ayuda de las siguientes rutas:

https://www.elastic.co/guide/en/logstash/current/config-examples.html

https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html

El comando ./logstash -f /etc/logstash/conf.d/01-input-nginxLocal.conf  te permite comprobar si la sintaxis de tu archivo de configuración es correcto.

Si tuvieras alguna duda escríbeme un comentario y ampliaré este punto o el que sea necesario. ¡Un saludo!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *