Cómo configurar ELK Stack para centralizar registros en Ubuntu 16.04
La pila ELK consta de Elasticsearch, Logstash y Kibana que se utilizan para centralizar los datos. ELK se utiliza principalmente para el análisis de registros en entornos de TI. La pila ELK hace que sea más fácil y rápido buscar y analizar un gran volumen de datos para tomar decisiones en tiempo real, todo el tiempo.
En este tutorial usaremos las siguientes versiones de ELK stack.
Elasticsearch 2.3.4
Logstash 2.3.4
Kibana 4.5.3
Oracle Java versión 1.8.0_91
Filebeat versión 1.2.3 (amd64)
Antes de comenzar a instalar ELK stack, verifique la versión LSB del servidor Ubuntu.
# lsb_release -a
1. Instale Java
El requisito para elasticsearch y logstash es instalar primero Java. Instalaremos Oracle java ya que elasticsearch lo recomienda. Sin embargo, también funciona con OpenJDK.
Agregue el PPA de Oracle Java a apt:
# sudo add-apt-repository -y ppa:webupd8team/java
Actualizar la base de datos de apt
# sudo apt-get update
Ahora instale la última versión estable de Oracle Java 8 usando el siguiente comando.
# sudo apt-get -y install oracle-java8-installer
Java 8 está instalado, verifique la versión de Java usando el comando java -version
2. Instale Elasticsearch
Para instalar Elasticsearch, primero importe su clave GPG pública a la base de datos apt. Ejecute el siguiente comando para importar la clave GPG pública de Elasticsearch en apt
# wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
Ahora cree la lista de fuentes de Elasticsearch
# echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
Actualizar la base de datos de apt
# sudo apt-get update
Ahora instale Elasticsearch usando el siguiente comando
# sudo apt-get -y install elasticsearch
A continuación, edite el archivo de configuración de elasticsearch
# sudo vi /etc/elasticsearch/elasticsearch.yml
Para restringir el acceso externo a la instancia de Elasticsearch (puerto 9200), elimine el comentario de la línea que dice network.host y reemplace su valor con «localhost».
network.host: localhost
Ahora inicie Elasticsearch
# sudo service elasticsearch restart
Para iniciar Elasticsearch al arrancar, ejecute el siguiente comando.
# sudo update-rc.d elasticsearch defaults 95 10
Pruebe elasticsearch usando el siguiente comando.
# curl localhost:9200
3. Instale logstash
Cree la lista de fuentes de Logstash. Ya hemos importado la clave pública ya que logstash y elasticsearch son del mismo repositorio.
# wget https://download.elastic.co/logstash/logstash/packages/debian/logstash_2.3.4-1_all.deb
# dpkg -i logstash_2.3.4-1_all.deb
# sudo update-rc.d logstash defaults 97 8 # sudo service logstash start
Para verificar el estado de logstash, ejecute el siguiente comando en la terminal.
# sudo service logstash status
Puede encontrar que logstash está activo pero no puede detener / reiniciar logstash correctamente usando el comando service o systemctl. En ese caso, debe configurar usted mismo el script del demonio logstash de systemd. Primero, haga una copia de seguridad del script de inicio logstash dentro de /etc/init.d/ y / etc / systemd / system y elimínelo de allí. Ahora instale este script «pleaserun» de https://github.com/elastic/logstash/issues/3606 El requisito previo para instalar este script es ruby.
Instalar Ruby
# sudo apt install ruby
Ahora instale, ejecute gem
# gem install pleaserun
Ahora está listo para crear el archivo de demonio systmd para logstash. Utilice el siguiente comando para hacer esto.
# pleaserun -p systemd -v default --install /opt/logstash/bin/logstash agent -f /etc/logstash/logstash.conf
Ahora que se ha creado el demonio systemd para logstash, inícielo y verifique el estado de logstash.
# sudo systemctl start logstash # sudo systemctl status logstash
4. Configurar logstash
Configuremos ahora Logstash. Los archivos de configuración de logstash residen dentro de /etc/logstash/conf.d y están en formato JSON. La configuración consta de tres partes y son entradas, filtros y salidas. Primero, cree un directorio para almacenar el certificado y la clave para logstash.
# mkdir -p /var/lib/logstash/private # sudo chown logstash:logstash /var/lib/logstash/private # sudo chmod go-rwx /var/lib/logstash/private
Ahora cree certificados y claves para logstash
# openssl req -config /etc/ssl/openssl.cnf -x509 -batch -nodes -newkey rsa:2048 -keyout /var/lib/logstash/private/logstash-forwarder.key -out /var/lib/logstash/private/logstash-forwarder.crt -subj /CN=172.31.13.29
Cambie /CN=172.31.13.29 a la dirección IP privada de su servidor. Para evitar el «error de protocolo de enlace TLS», agregue la siguiente línea en /etc/ssl/openssl.cnf.
[v3_ca] subjectAltName = IP:172.31.13.29
Tenga en cuenta que tenemos que copiar este certificado a todos los clientes cuyos registros desee enviar al servidor ELK a través de filebeat.
A continuación, primero crearemos la entrada «filebeat» con el nombre 02-beats-input.conf
# sudo vi /etc/logstash/conf.d/02-beats-input.conf input { beats { port => 5044 ssl => true ssl_certificate => "/var/lib/logstash/private/logstash-forwarder.crt" ssl_key => "/var/lib/logstash/private/logstash-forwarder.key" } }
Ahora crearemos un filtro «filebeat» con el nombre 10-syslog-filter.conf para agregar un filtro para los mensajes de syslog.
# sudo vi /etc/logstash/conf.d/10-syslog-filter.conf 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}" ] } syslog_pri { } date { match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } } }
Por último, crearemos la salida «filebeat» con el nombre 30-elasticsearch-output.conf
# sudo vi /etc/logstash/conf.d/30-elasticsearch-output.conf output { elasticsearch { hosts => ["localhost:9200"] sniffing => true manage_template => false index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" document_type => "%{[@metadata][type]}" } }
Pruebe su configuración de Logstash con el siguiente comando.
# sudo service logstash configtest
Mostrará Configuración correcta si no hay errores de sintaxis; de lo contrario, verifique los archivos de registro logstash en / var / log / logstash
Para probar el logstash, ejecute el siguiente comando desde la terminal.
# cd /opt/logstash/bin && ./logstash -f /etc/logstash/conf.d/02-beats-input.conf
Verá que el logstash ha iniciado una canalización y procesando los registros del sistema. Una vez que esté seguro de que logstash está procesando los syslogs, combine 02-beats-input.conf, 10-syslog-filter.conf y 30-elasticsearch-output.conf como un solo archivo logstash conf en el directorio / etc / logstash / conf .D
Reinicie logstash para volver a cargar la nueva configuración.
# sudo systemctl restart logstash
5. Instale el panel de control de muestra
Descargue paneles de Kibana de muestra y patrones de índice de Beats. No vamos a usar este tablero, pero los cargaremos para que podamos usar el patrón de índice filebeat en él. Descargue los paneles de control de muestra y descomprímalos.
# curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip # unzip beats-dashboards-1.1.0.zip
Cargue los cuadros de mando de muestra, las visualizaciones y los patrones de índice de Beats en Elasticsearch con los siguientes comandos.
# cd beats-dashboards-1.1.0 # ./load.sh
Encontrará los siguientes patrones de índice en la barra lateral izquierda del panel de kibana. Usaremos solo el patrón de índice de latido de archivo.
packetbeat- *
topbeat- *
filebeat- *
winlogbeat- *
Dado que usaremos filebeat para reenviar registros a Elasticsearch, cargaremos una plantilla de índice de filebeat en elasticsearch.
Primero, descargue la plantilla de índice de filebeat
# curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/ raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json
Ahora cargue la siguiente plantilla con el siguiente comando CURL.
# curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json
Si la plantilla se cargó correctamente, debería ver un mensaje como este:
Producción:
{
«reconocido»: verdadero
}
El servidor ELK ahora está listo para recibir datos de filebeat, configuremos filebeat en el servidor cliente. Para obtener más información sobre cómo cargar el panel de ritmos, consulte este enlace https://www.elastic.co/guide/en/beats/libbeat/current/load-kibana-dashboards.html
6. Instale filebeat en los clientes
Cree la lista de fuentes de Beats en los clientes cuyos registros desee enviar al servidor ELK. Actualice la base de datos de apt e instale filebeat usando apt-get
# echo "deb https://packages.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources.list.d/beats.list # sudo apt-get update && sudo apt-get install filebeat
Iniciar filebeat
# /etc/init.d/filebeat start
Ahora edite el archivo /etc/filebeat/filebeat.yml. Modifique el prospector existente para enviar syslog a logstash. En la sección de rutas, comente el archivo – /var/log/*.log y agregue nuevas entradas para syslog – / var / log / syslog.
A continuación, especifica que los registros del prospector son de tipo syslog.
Descomente Logstash: sección de salida y hosts: [«SERVER_PRIVATE_IP:5044»] sección. Edite localhost a la dirección IP privada o al nombre de host de su servidor ELK. Ahora descomente la línea que dice certificate_authorities, y modifique su valor a /var/lib/logstash/private/logstash-forwarder.crt que hemos creado en el servidor ELK en el paso debe copiar este certificado a todas las máquinas cliente.
Reinicie filebeat y verifique su estado.
# sudo /etc/init.d/filebeat restart # sudo service filebeat status
Para probar el filebeat, ejecute el siguiente comando desde la terminal.
# filebeat -c /etc/filebeat/filebeat.yml -e -v
El filebeat enviará los registros a logstash para indexarlos. Habilite el filebeat para que se inicie durante cada arranque.
# sudo update-rc.d filebeat defaults 95 10
Ahora abra su navegador favorito y apunte la URL a http: // ELK-SERVER-IP: 5601 o http: // ELK-SERVER-DOMAIN-NAME: 5601, encontrará los syslogs cuando haga clic en file-beats- * a la izquierda barra lateral.
Esta es nuestra configuración final de filebeat para filebeat –
filebeat: prospectors: - paths: - /var/log/auth.log - /var/log/syslog input_type: log document_type: syslog registry_file: /var/lib/filebeat/registry output: logstash: hosts: ["172.31.13.29:5044"] bulk_max_size: 1024 tls: certificate_authorities: ["/var/lib/logstash/private/logstash-forwarder.crt"] shipper: logging: files: rotateeverybytes: 10485760
7. Configurar el cortafuegos
Agregue reglas de firewall para permitir el tráfico a los siguientes puertos.
El comando cuatro IPTABLE será
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5601 -j ACCEPT # iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 9200 -j ACCEPT # iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT # iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5044 -j ACCEPT
Guarde las reglas.
# service iptables save
Reiniciar IPTABLE
# service iptables restart
Para usuarios de UFW:
# sudo ufw allow 5601/tcp # sudo ufw allow 9200/tcp # sudo ufw allow 80/tcp # sudo ufw allow 5044/tcp # sudo ufw reload
8. Instalar / configurar Kibana
Descargue la última kibana desde https://download.elastic.co/
# cd /opt # wget https://download.elastic.co/kibana/kibana/kibana-4.5.3-linux-x64.tar.gz # tar -xzf kibana-4.5.3-linux-x64.tar.gz # cd kibana-4.5.3-linux-x64/ # mv kibana-4.5.3-linux-x64 kibana # cd /opt/kibana/config # vi kibana.yml
Ahora cambie estos parámetros en /opt/kibana/config/kibana.yml
server.port: 5601 server.host: "0.0.0.0" elasticsearch.url: "http://localhost:9200"
Para fines de prueba, puede ejecutar kibana usando los siguientes comandos.
# cd /opt/kibana/bin # ./kibana & # netstat -pltn
Ahora crearemos el demonio systemd para kibana usando «pleaserun» de la misma manera que lo hemos creado para logstash.
# pleaserun -p systemd -v default –install /opt/kibana/bin/kibana -p 5601 -H 0.0.0.0 -e http://localhost:9200
dónde
-p especifica el número de puerto que enlazará kibana
-H especifica la dirección IP del host donde se ejecutará Kibana.
La opción -e especifica la dirección IP de elasticsearch.
Iniciar la kibana
# systemctl start kibana
Verificar el estado de kibana
# systemctl status kibana
Compruebe si el puerto no 5601 ha sido ocupado por kibana
# netstat -pltn| grep '5601'
9. Instalar / Configurar NGINX
Dado que Kibana está configurado para escuchar en localhost, necesitamos configurar un proxy inverso para permitir el acceso externo a él. Usaremos NGINX como proxy inverso. Instale las utilidades de NGINX y apache usando el siguiente comando.
# sudo apt-get install nginx apache2-utils php-fpm
Edite el archivo de configuración php-fpm www.conf dentro /etc/php/7.0/fpm/pool.d
listen.allowed_clients = 127.0.0.1,172.31.13.29
Reinicie php-fpm
# sudo service php-fpm restart
Con htpasswd, cree un usuario administrador con el nombre «kibana» para acceder a la interfaz web de Kibana.
# sudo htpasswd -c /etc/nginx/htpasswd.users kibana
Ingrese una contraseña cuando se le solicite. Recuerde esta contraseña, la usaremos para acceder a la interfaz web de Kibana.
Crea un certificado para NGINX
# sudo openssl req -x509 -batch -nodes -days 365 -newkey rsa:2048 -out /etc/ssl/certs/nginx.crt -keyout /etc/ssl/private/nginx.key -subj /CN=demohost.com
Edite el bloque de servidor predeterminado de NGINX.
# sudo vi /etc/nginx/sites-available/default
Elimine el contenido del archivo y pegue la siguiente configuración en el archivo.
server_tokens off; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; server { listen 443 ssl; auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/htpasswd.users; ssl_certificate /etc/ssl/certs/nginx.crt; ssl_certificate_key /etc/ssl/private/nginx.key; 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; } add_header Strict-Transport-Security "max-age=31536000;"; } server { listen 80; listen [::]:80 default_server ipv6only=on; return 301 https://$host$request_uri; }
No estamos usando la directiva server_name ya que hemos configurado nuestro nombre de dominio en / etc / hosts y / etc / hostname como demohost.com. También desde entonces, hemos editado el host predeterminado de NGINX (/ etc / nginx / sites-available / default). Por lo tanto, una vez que NGINX haya iniciado, demohost.com estará disponible en el navegador.
Guardar y Salir. A partir de ahora, NGINX dirigirá el tráfico HTTP del servidor a la aplicación Kibana en el puerto no 5601.
Ahora reinicie NGINX para que nuestros cambios surtan efecto:
# sudo service nginx restart
Ahora puede acceder a Kibana visitando el FQDN o la dirección IP pública de su servidor ELK, es decir, http: // elk_server_public_ip /. Ingrese las credenciales «kibana» que ha creado anteriormente, será redirigido a la página de bienvenida de Kibana, que le pedirá que configure un patrón de índice.
Haga clic en filebeat * en la barra lateral superior izquierda, verá los registros de los clientes fluyendo hacia el tablero.
Haga clic en el estado del servidor ELK
Conclusión:
Eso es todo para el servidor ELK, instale filebeat en cualquier número de sistemas cliente y envíe los registros al servidor ELK para su análisis. Para hacer que los datos de registro no estructurados sean más funcionales, analícelos correctamente y hágalo estructurado con grok. También hay algunos complementos increíbles disponibles para usar junto con kibana, para visualizar los registros de una manera sistemática.