Upload
jose-ignacio-alvarez-ruiz
View
61
Download
7
Embed Size (px)
Citation preview
Monitorización de logs con el stack ELK
IES Gran Capitán - 31 Enero 2017Nacho Álvarez
@neonigmacdb✉ [email protected]
http://www.nacho-alvarez.es
Índice1) Preliminares: Vagrant y Ansible
2) Introducción a ELK
3) ElasticSearch
4) Logstash
5) Kibana
6) Arquitectura del sistema de pruebas
7) Demo time!1/36
Vagrant● Gestor de máquinas virtuales● Necesita dos elementos:
○ Proveedor (VirtualBox, VMWare, Docker…)○ Aprovisionador (Ansible, Puppet, Chef…)
● Funciona con boxes predefinidashttps://atlas.hashicorp.com/boxes/search
● La definición de la máquina virtual se lee de un fichero de configuración, el Vagrant file
2/36
Vagrant# -*- mode: ruby -*-
# vi: set ft=ruby :
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.synced_folder "htdocs", "/var/www/html"
config.vm.provision "shell", path: "config.sh"
end3/36
Vagrant#!/bin/bash
# Update server
apt-get update
apt-get upgrade -y
# Install essentials
apt-get -y install build-essential binutils-doc git -y
# Install Apache
apt-get install apache2 -y
#Install PHP
apt-get install php5 libapache2-mod-php5 php5-cli php5-mysql -y
# Install MySQL
echo "mysql-server mysql-server/root_password password root" | sudo debconf-set-selections
echo "mysql-server mysql-server/root_password_again password root" | sudo debconf-set-selections
apt-get install mysql-client mysql-server -y
# Restart Apache service
service apache2 restart 4/36
Vagrant$ vagrant up # Ejecutar la máquina virtual
$ vagrant ssh # Entrar por ssh a la máquina
$ vagrant suspend # Suspender la máquina
$ vagrant resume # Despertar la máquina
$ vagrant halt # Apagar la máquina
$ vagrant status # Saber el estado de la máquina (apagada, ejecutándose o en modo suspensión):
$ vagrant destroy # Destruir la máquina
A todos los comandos se les puede añadir como argumento el nombre de la máquina,
si tenemos varias5/36
Ansible● Herramienta de gestión de configuración y
aprovisionamiento● Se conecta a los equipos a configurar usando SSH● Trabaja con un inventario de máquinas a configurar● Existen playbooks o recetas ya configuradas por
terceroshttps://galaxy.ansible.com/
6/36
Ansible● Máquina de Administración: donde tenemos instalado Ansible y desde donde se ejecutarán las tareas
● Inventory: archivo donde registramos los servidores sobre los cuales ejecutaremos las tareas
● Playbook: archivo donde listamos las tareas a ejecutar, es como una receta de cocina. En formato YAML
● Grupo de hosts: si se usa el mismo Playbook para varias máquinas, diferencia entre servidores
● Task: bloque dentro del Playbook que define una acción específica a realizar, pj: instalar un paquete.
● Module: Plugins que permiten realizar tareas de forma más fácil, como yum para instalar software, y también
nosotros podemos crear los nuestros.
● Role: una forma de ordenar los diferentes Playbooks.
● Play: se refiere a la ejecución de un Playbook.
● Facts: variables dentro de Ansible que contienen información sobre los servidores. Ej: SO, RAM, Dirs IP, etc.
● Handlers: pequeño código que se usa cuando algo cambia. Por ej: si actualizas el archivo de configuración de
Apache, un Handler reiniciará el servicio httpd.7/36
Ansible ---
- hosts: stats sudo: yes gather_facts: yes roles: - java8 - elasticsearch - kibana
- hosts: apps sudo: yes gather_facts: yes roles: - java8 - logstash - appdeploy
8/36
---
# file: /roles/java8/tasks/main.yml
- name: add Java repository to sources apt_repository: repo='ppa:webupd8team/java' tags: java
- name: autoaccept license for Java debconf: name='oracle-java8-installer' question='shared/accepted-oracle-license-v1-1' value='true' vtype='select' tags: java
- name: update APT package cache apt: update_cache=yes tags: java
- name: install Java 8 apt: name=oracle-java8-installer state=latest install_recommends=yes tags: java
Introducción a ELK● ELK viene de ElasticSearch, Logstash y Kibana● Surge como respuesta a la necesidad de analítica● Problema de búsquedas con buenas visualizaciones● Lucene + sist. distribuido ElasticSearch para búsquedas● Normalización de datos con Logstash● Herramienta de visualización de datos Kibana● Tenemos un rival muy duro para soluciones de pago
9/36
ElasticSearch
10/36
● Servidor de búsqueda basado en Apache Lucene
● Proporciona un motor de búsqueda de texto completo, distribuido y con
capacidad de multi-tenencia con API REST + JSON
● En nuestro ejemplo la usaremos como BBDD donde almacenar, indexar y
buscar los eventos de log de las apps
● Usuarios ilustres: Wikimedia, Mozilla, Quora, Foursquare, SoundCloud,
GitHub, CERN y Stack Exchange
ElasticSearch - Nodos
11/36
● Cada nodo es una VM Java ejecutando una instancia del servicio
● Límite 40% heap de la RAM
● Tipos de nodos
○ master => responsable de gestión del cluster y asegurar su integridad
○ master-eligible => nodos candidatos a maestro según se necesite
○ data => nodos normales conteniendo los datos y haciendo búsquedas
○ client => enrutan peticiones dentro del clúster
○ tribe => permiten agregar clústeres de forma transparente
ElasticSearch - Shards
12/36
● Unidad de distribución de trabajo en cluster donde se hacen las búsquedas
● Internamente es una instancia de Lucene con sus datos, metadatos e índices
● Cada índice tiene un número fijo y predeterminado de shards primarias, que
son las fuentes que tienen la info almacenada e indexada en Elasticsearch
● Para añadir o quitar shards primarias hay que recrear el índice (reindexar)
● Shards de respaldo: copias que se distribuyen por los nodos del cluster para
conseguir mayor rendimiento, alta disponibilidad y backup
ElasticSearch - Mapping
13/36
● La configuración por defecto consiste en tokenizar los textos e intentar detectar
otros valores primitivos
● Mapping consiste en definir cómo un documento y los campos que contiene son
almacenados e indexados. Por ejemplo, usamos mappings para definir:
○ Qué campos string deberían tratarse como campos de texto
○ Qué campos contienen números, fechas, localizaciones...
○ Formato de los campos de fecha
○ Reglas personalizadas para controlar el mapeado para campos añadidos
dinámicamente
ElasticSearch - Mapping
14/36
PUT my_index
{
"mappings": {
"user": {
"_all": { "enabled": false },
"properties": {
"title": { "type": "text" },
"name": { "type": "text" },
"age": { "type": "integer" }
}
},
"blogpost": {
"_all": { "enabled": false },
"properties": {
"title": { "type": "text" },
"body": { "type": "text" },
"user_id": {
"type": "keyword"
},
"created": {
"type": "date",
"format":
"strict_date_optional_time||epoch_millis"
}
}
}
}
}
ElasticSearch
15/36
LogStash
16/36
● Herramienta para recolectar, parsear y guardar los logs
● En el caso que nos ocupa los guardaremos en ElasticSearch
● La configuración consta de una sección input, una filter y otra output
● Todo funciona en base a plugins, las estrellas de esta herramienta
LogStash - Ejemplo
17/36
LogStash - Ejemplo
18/36
input {
stdin {}
}
filter {
grok {
match => {"message" => "%{IP:ip}"}
}
geoip {
source => "ip"
}
}
output {
stdout {
codec => rubydebug
}
}
LogStash - Ejemplo
19/36
LogStash - Syslog
20/36
input {
tcp {
port => 5000
type => syslog
}
udp {
port => 5000
type => syslog
}
}
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp}
%{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?:
%{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
output {
elasticsearch { hosts =>
["localhost:9200"] }
stdout { codec => rubydebug }
}
LogStash - Syslog
21/36
{
"message" => "Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null
2>/var/log/cacti/poller-error.log)",
"@timestamp" => "2013-12-23T22:30:01.000Z",
"@version" => "1",
"type" => "syslog",
"host" => "0:0:0:0:0:0:0:1:52617",
"syslog_timestamp" => "Dec 23 14:30:01",
"syslog_hostname" => "louis",
"syslog_program" => "CRON",
"syslog_pid" => "619",
"syslog_message" => "(www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)",
"received_at" => "2013-12-23 22:49:22 UTC",
"received_from" => "0:0:0:0:0:0:0:1:52617",
"syslog_severity_code" => 5,
"syslog_facility_code" => 1,
"syslog_facility" => "user-level",
"syslog_severity" => "notice"
}
LogStash - IBM Websphere
22/36
grok {
# was_shortname need to be regex, because numbers and $ can be in the word
match => ["message", "\[%{DATA:wastimestamp} %{WORD:tz}\] %{BASE16NUM:was_threadID}
(?<was_shortname>\b[A-Za-z0-9\$]{2,}\b) %{SPACE}%{WORD:was_loglevel}%{SPACE}
%{GREEDYDATA:message}"]
overwrite => [ "message" ]
#tag_on_failure => [ ]
}
grok {
# Extract the WebSphere Response Code
match => ["message", "(?<was_responsecode>[A-Z0-9]{9,10})[:,\s\s]"]
tag_on_failure => [ ]
}
LogStash - IBM Websphere
23/36
LogStash - IBM Websphere
24/36
LogStash - Plugins
25/36
● Existen decenas de plugins para las tres etapas
● INPUT○ https://www.elastic.co/guide/en/logstash/current/input-plugins.html
● FILTER○ https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
● OUTPUT○ https://www.elastic.co/guide/en/logstash/current/output-plugins.html
Kibana● Aplicación web que facilita la explotación visual de
información almacenada en una base de datos
● Los usuarios pueden crear gráficos de barras, líneas,
tartas, mapas, etc., sobre grandes cantidades de datos
● Permite montar tableros de mandos o dashboards a
medida según las necesidades26/36
Kibana
27/36
Kibana
28/36
Kibana
29/36
Kibana
30/36
Kibana
31/36
Arquitectura sist. pruebas
32/36
Demo time!
33/36
Referencias● Tutorial Vagrant
https://geekytheory.com/tutorial-vagrant-1-que-es-y-como-usarlo/
● Tutorial Ansiblehttp://blog.itlinux.cl/blog/2016/04/09/automatizacion-y-el-desafio-de-la-nube/
● ElasticSearchhttps://www.adictosaltrabajo.com/tutoriales/administracion-de-elasticsearch/
● Mappings con ElasticSearchhttps://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html
● Introducción a ELKhttp://elmanytas.es/?q=node/318
34/36
Referencias● Better logstash filter to analyze SystemOut.log and some more
https://www.stoeps.de/better-logstash-filter-to-analyze-systemout-log-and-some-more/
● Análisis de logs con Kibanahttps://www.adictosaltrabajo.com/tutoriales/analisis-de-logs-con-kibana/
● Twitter Elasticsearch examplehttps://github.com/elastic/examples/tree/master/ElasticStack_twitter
35/36
¿Preguntas?
36/36