Como en el anterior articulo dejamos funcionando nuestro servidor con ElasticSearch, en este vamos a instalar y configurar Logstash. Para ello, lo primero que haremos es descargarnos Logstash desde la web oficial de Elastic:
1 |
> wget https://download.elastic.co/logstash/logstash/packages/debian/logstash-all-plugins_2.3.4-1_all.deb |
Instalamos el paquete con el siguiente comando:
1 |
> sudo dpkg -i logstash-all-plugins_2.3.4-1_all.deb |
Como resultado tendremos Logstash instalado en /opt/logstash/ , los archivos de configuración en /etc/logstash/conf.d/ y el script de arranque en /etc/init.d/logstash .
En esta implantación de prueba, vamos a decirle a Logstash que nos almacene en ElasticSearch los inicio de sesión registrados en auth.log . Con este fin crearemos un fichero de configuración auth-log.conf dentro de /etc/logstash/conf.d/ .
Más adelante profundizaremos en todos los aspectos de la configuración de Logstash, pero de momento solo comentar que el fichero de configuración consta de tres partes:
Input:
En este apartado del fichero de configuración indicamos a Logstash que datos obtiene y de donde obtenerlos:
1 2 3 4 5 6 7 |
input { file { type => "auth" path => "/var/log/auth.log" start_position => "end" } } |
Como se puede ver en el ejemplo, obtiene un fichero ( file ) de tipo auth ubicado en /var/log/auth.log .
Filter:
Este es uno de los apartados más importantes y complejos del fichero de configuración, ya que es donde se trata la información entrante y se le da formato al paquete JSON que será posteriormente enviado a ElasticSearch:
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
filter { if [type]=="auth" { grok { match => [ "message", "{269a43e619103fec20a2ff1fa4c6fa62e033dc304f85b3cc053bbec70bac83ad}{SYSLOGLINE}" ] } date { match => [ "timestamp", "MMM dd HH:mm:ss", "MMM d HH:mm:ss", "ISO8601" ] } mutate { add_field => [ "origen", "auth"] } } } |
De este apartado pordemos extraer que solo va a atender las entradas de tipo AUTH, dando formato al campo message de {269a43e619103fec20a2ff1fa4c6fa62e033dc304f85b3cc053bbec70bac83ad}SYSLOGLINE basado en las plantillas de Grok Constructor, también formateamos correctamente la fecha y por último añadimos un campo llamado origen con el valor «auth».
Output:
Llegamos al punto donde configuramos la salida de los datos ya formateados:
23 24 25 26 |
output { elasticsearch {} stdout{} } |
En este apartado hemos indicado a Logstash que envíe los datos obtenidos y filtrados a ElasticSearch, como el servidor es local y con la configuración por defecto no es necesario especificar nada. Asimismo también indicamos con stdout la funcionalidad de dar salida por shell (stdout no lo veremos si lo ejecutamos como servicio).
Todo Junto:
Si unimos todas las partes nos quedará un fichero de configuración como este:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
input { file { type => "auth" path => "/var/log/auth.log" start_position => "end" } } filter { if [type]=="auth" { grok { match => [ "message", "{269a43e619103fec20a2ff1fa4c6fa62e033dc304f85b3cc053bbec70bac83ad}{SYSLOGLINE}" ] } date { match => [ "timestamp", "MMM dd HH:mm:ss", "MMM d HH:mm:ss", "ISO8601" ] } mutate { add_field => [ "origen", "auth"] } } } output { elasticsearch {} stdout{} } |
Antes de realizar la primera prueba es necesario aumentar los privilegios del usuario logstash ya que sino no podrá acceder a los ficheros sitos en /var/log:
1 |
> sudo usermod -a -G adm logstash |
Para comprobar que funciona correctamente podemos iniciar logstash especificando el fichero de configuración y activando el modo Debug:
1 2 3 |
> sudo /opt/logstash/bin/logstash -f /etc/logstash/conf.d/auth-log.conf --debug-config Settings: Default pipeline workers: 4 Pipeline main started |
Si ahora que tenemos Logstash funcionando, iniciamos sesión desde otra ventana de terminal con sudo su nos mostrará algo similar a esto en el terminal donde tenemos Logstash:
1 2 3 4 5 6 |
016-08-26T11:03:36.000Z LekDemo Aug 26 13:03:36 LekDemo sudo: lekuser: TTY=pts/2 ; PWD=/home/lekuser; USER=root ; COMMAND=/bin/su,lekuser: TTY=pts/2 ; PWD=/home/lekuser; USER=root ; COMMAND=/bin/su 2016-08-26T11:03:36.000Z LekDemo Aug 26 13:03:36 LekDemo sudo: pam_unix(sudo:session): session opened for user root by lekuser(uid=0),pam_unix(sudo:session): session opened for user root by lekuser(uid=0) 2016-08-26T11:03:36.000Z LekDemo Aug 26 13:03:36 LekDemo su[8543]: Successful su for root by root,Successful su for root by root 2016-08-26T11:03:36.000Z LekDemo Aug 26 13:03:36 LekDemo su[8543]: + /dev/pts/2 root:root,+ /dev/pts/2 root:root 2016-08-26T11:03:36.000Z LekDemo Aug 26 13:03:36 LekDemo su[8543]: pam_unix(su:session): session opened for user root by lekuser(uid=0),pam_unix(su:session): session opened for user root by lekuser(uid=0) 2016-08-26T11:03:36.000Z LekDemo Aug 26 13:03:36 LekDemo su[8543]: pam_systemd(su:session): Cannot create session: Already running in a session,pam_systemd(su:session): Cannot create session: Already running in a session |
Como podemos observar Logstash registra correctamente el inicio de sesión, por lo que podemos registrarlo como servicio en el arranque e iniciarlo:
1 2 3 |
> update-rc.d logstash defaults > sudo /etc/init.d/logstash start logstash started. |
Comprobamos que se ha iniciado correctamente en /var/logs/logstash/logstash.log :
1 2 |
> sudo tail /var/log/logstash/logstash.log {:timestamp=>"2016-08-26T13:35:59.017000+0200", :message=>"Pipeline main started"} |
Ahora podremos comprobar si Logstash ha enviado correctamente los datos a ElasticSearch. Para ello primero tenemos que consultar a ElasticSearch por los índices creados:
1 2 3 |
> curl 'localhost:9200/_cat/indices?v' health status index pri rep docs.count docs.deleted store.size pri.store.size yellow open logstash-2016.08.26 5 1 59 0 224.9kb 224.9kb |
Como podemos ver, se ha creado el índice logstash-2016.08.26 , así que consultamos todos los registros de ese índice en ElasticSearch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
> curl -XGET 'http://localhost:9200/logstash-2016.08.26/_search?pretty=true&q=*:*' { "took" : 4, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 59, "max_score" : 1.0, "hits" : [ { "_index" : "logstash-2016.08.26", "_type" : "auth", "_id" : "AVbGijwcVenyXhe95u5A", "_score" : 1.0, "_source" : { "message" : [ "Aug 26 13:03:36 LekDemo su[8543]: Successful su for root by root", "Successful su for root by root" ], "@version" : "1", "@timestamp" : "2016-08-26T11:03:36.000Z", "path" : "/var/log/auth.log", "host" : "LekDemo", "type" : "auth", "timestamp" : "Aug 26 13:03:36", "logsource" : "LekDemo", "program" : "su", "pid" : "8543", "origen" : "auth" } }, { "_index" : "logstash-2016.08.26", "_type" : "auth", "_id" : "AVbGijwcVenyXhe95u5B", "_score" : 1.0, "_source" : { "message" : [ "Aug 26 13:03:36 LekDemo su[8543]: + /dev/pts/2 root:root", "+ /dev/pts/2 root:root" ], "@version" : "1", "@timestamp" : "2016-08-26T11:03:36.000Z", "path" : "/var/log/auth.log", "host" : "LekDemo", "type" : "auth", "timestamp" : "Aug 26 13:03:36", "logsource" : "LekDemo", "program" : "su", "pid" : "8543", "origen" : "auth" }, { "_index" : "logstash-2016.08.26", "_type" : "auth", "_id" : "AVbGtBr7COSKvRjldme9", "_score" : 1.0, "_source" : { "message" : [ "Aug 26 13:55:06 LekDemo sudo: pam_unix(sudo:session): session opened for user root by sistemas(uid=0)", "pam_unix(sudo:session): session opened for user root by sistemas(uid=0)" ], "@version" : "1", "@timestamp" : "2016-08-26T11:55:06.000Z", "path" : "/var/log/auth.log", "host" : "LekDemo", "type" : "auth", "timestamp" : "Aug 26 13:55:06", "logsource" : "LekDemo", "program" : "sudo", "origen" : "auth" } } ] } } |
Con esto queda demostrado que Logstash y Elasticsearch están funcionando perfectamente, por lo que solo nos quedará instalar Kibana para poder gestionar mejor los registros creados desde Logstash.
Todo esto y más en el próximo articulo.
Referencias de interés:
- https://www.elastic.co/guide/en/logstash/current/input-plugins.html
- https://www.elastic.co/guide/en/logstash/current/output-plugins.html
- https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
- https://www.garysieling.com/blog/2769-2