Monitoreando logs de Squid con ELK stack y grafiado en grafana. 3ra parte

Este artículo es la 3ra parte de Instalar ELK Stack (Elasticsearch, Logstash y Kibana) para el monitoreo de Logs. En lo descrito en la 2da parte tenemos una idea más o menos de como proceder para que elasticsearch procese los logs de Squid.

En el servidor Squid

# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.1-amd64.deb

Ya descargado lo instalamos.

#dpkg -i filebeat-5.4.1-amd64.deb

Ya lo tenemos instalado, luego regresaremos para configurarlo.

En el servidor ELK

Creamos el filtro de logstash que se encargará de filtrar y etiquetear los logs de squid.

#nano /etc/logstash/conf.d/20-squid.conf

y copiamos dentro del mismo el siguiente contenido:

filter {
if [type] == "squid3" {
     grok {
       break_on_match => false
       # add/change pattern
       patterns_dir => [ "/etc/logstash/patterns/" ]
       match => [ "message" , "%{INT:timestamp:int}.%{INT:timestamp_ms}\s+%{INT:response_time} %{IPORHOST:src_ip} %{WORD:squid_request_status}/%{INT:http_status} %{INT:reply_size_include_header} %{WORD:http_method} (%{URIHOST:request_url}|%{URI:request_url}) %{USERNAME:user} %{WORD:squid}/(%{IPORHOST:server_ip}|%{GREEDYDATA:server_ip}) %{GREEDYDATA:content_type}" ]
       # domain-name from url
       match => [ "message" , "%{INT}.%{INT}\s+%{INT} %{IPORHOST} %{WORD}/%{INT} %{INT} %{WORD} (%{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{IPORHOST:domain}(?::%{POSINT:port})?)?(?:%{URIPATHPARAM})?|%{IPORHOST:domain}(?::%{POSINT:port})?) %{USERNAME} %{WORD}/(%{IPORHOST}|%{GREEDYDATA}) %{GREEDYDATA}" ]
    }
     date {
        # convert unixtime  to timestamp
        match => [ "timestamp", "UNIX" ]
        }

  if [server_ip] {
    geoip {
      source => "server_ip"
      target => "geoip"
      database => "/etc/logstash/geoip/GeoLite2-City.mmdb"
      fields => [ "country_code2", "country_name" ]
      fields => [ "latitude", "longitude" ]
      add_field => [ "[geoip][location]", "%{[geoip][longitude]}" ]
      add_field => [ "[geoip][location]", "%{[geoip][latitude]}" ]
      add_tag => "geoip"
    }
     mutate {
        convert => [ "[geoip][location]", "float"]
     }
  }
}
}

Vamos a crear el patrón que va a usar squid.

#nano /etc/logstash/patterns/squid

Con el siguiente contenido:

# overwride URIPARAM
URIPARAM \?[ÄÖÜöäüßA-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]]*
# add new pattern
MYTEST [A-Za-z0-9]*
#########

Como habíamos mencionado en el artículo anterior es conveniente separar los indices por tipo de logs por lo que la salida de logstash a elasticsearch condicionaremos la misma por nombre de host.

output {
if [host] == "mail" {
   elasticsearch {
    hosts => ["localhost:9200"]
#    template => "/etc/logstash/filebeat-index-template.json"
#    template_overwrite => true
    hosts => "localhost:9200"
    manage_template => false
    index => "correo-%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}
else if [host] == "squidserver" {
   elasticsearch {
    hosts => ["localhost:9200"]
#    template => "/etc/logstash/filebeat-index-template.json"
#    template_overwrite => true
    hosts => "localhost:9200"
    manage_template => false
    index => "squid-%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}
}

Como comentabamos en la 2da parte la salida la logstash la filtramos por equipo para que cree los índices por separado y por cada tipo de log.

Reiniciamos logstash para que se cargue la configuración que añadimos para squid.

#service logstash restart

Verificamos inició bien.

#tail -100f /var/log/logstash/logstash-plain.log

[2017-06-07T21:00:02,920][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}

Preparemos entonces la plantilla de squid para elasticsearch. Podemos usar cualquiera de las 2 variantes que hablamos en el artículo anterior pero esta vez solo lo haremos por el Dev Tools de Kibana. Copiamos lo siguente y damos ejecutar.

PUT _template/squid-filebeat
{
  "mappings": {
    "_default_": {
      "_all": {
        "enabled": true,
        "norms": false
      },
      "dynamic_templates": [
        {
          "template1": {
            "mapping": {
              "doc_values": true,
              "ignore_above": 1024,
              "index": "not_analyzed",
              "type": "{dynamic_type}"
            },
            "match": "*"
          }
        }
      ],
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "message": {
          "type": "text",
          "index": "true"
        },
        "offset": {
          "type": "long",
          "doc_values": "true"
        },
      "reply_size_include_header": {
          "type": "long",
          "index": "false"
      },
      "port": {
          "type": "integer",
          "index": "false"
      },
      "geoip" : {
        "dynamic" : true,
        "type" : "object",
        "properties" : {
          "ip" : {
            "type" : "ip",
            "doc_values" : true
          },
          "latitude" : {
            "type" : "float",
            "doc_values" : true
          },
          "location" : {
            "type" : "geo_point",
            "doc_values" : true
          },
          "longitude" : {
            "type" : "float",
            "doc_values" : true
          },
          "country_code2" : {
            "type" : "text",
            "index": "false"
          },
          "country_name" : {
            "type" : "text",
            "index": "false"
          }
        }
      }
      }
    }
  },
  "settings": {
    "index.refresh_interval": "5s"
  },
  "template": "squid-filebeat-*"
}

Y el resultado es el siguiente:

{
  "acknowledged" : true
}

Ya tenemos preparado elasticsearch y ya tenemos también configurado el fitro y la salida de logstash para los logs del squid.

En el servidor Squid

Ahora estamos listos para configurar el filebeat en el equipo remoto o sea el servidor squid.  Como generamos para logstash un certificado debemos copiárselo también al servidor squid lo pondremos en la misma carpeta de filebeat en /etc/filebeat/ el fichero logstash.crt como vimos en la 2da parte, lo cual garantiza que la comunicación sea segura entre filebeat de zimbra y logstash como hemos mencionado anteriormente. Editamos el fichero filebeat.yml.

#nano /etc/filebeat/filebeat.yml

#=========================== Filebeat prospectors =============================

filebeat.prospectors:

# Each - is a prospector. Most options can be set at the prospector level, so
# you can use different prospectors for various configurations.
# Below are the prospector specific configurations.

- input_type: log
  document_type: squid3
  paths:
    - /var/log/squid3/access.log

Y en Logstash output se define a que servidor logstash le va a entregar el filebeat los logs de squid

#----------------------------- Logstash output --------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["equipo.dominio.cu:5443"]

  # Optional SSL. By default is off.
  # List of root certificates for HTTPS server verifications
  bulk_max_size: 2048
  ssl.certificate_authorities: ["/etc/filebeat/logstash.crt"]
  template.name: "filebeat"
  template.path: "filebeat.template.json"
  template.overwrite: false
  # Certificate for SSL client authentication
  #ssl.certificate: "/etc/pki/client/cert.pem"

  # Client Certificate Key
  #ssl.key: "/etc/pki/client/cert.key"

Reiniciamos el servicio de filebeat.

#service filebeat restart

Verificamos el estado del servicio

#service filebeat status

● filebeat.service - filebeat
Loaded: loaded (/lib/systemd/system/filebeat.service; disabled; vendor preset: enabled)
Active: active (running) since vie 2017-06-16 21:25:19 CDT; 2 days ago
Docs: https://www.elastic.co/guide/en/beats/filebeat/current/index.html
Main PID: 30975 (filebeat)
CGroup: /system.slice/filebeat.service
└─30975 /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat

En el servidor ELK

Ya estamos listos para obtener nuestros primeros logs de squid. En Kibana vamos a Management/Index Patterns y presionamos el signo más(+). Como el patron en el output es squid-filebeat-fecha visto anteriormente en la salida ponemos squid-filebeat-* ya que los indices se generan diariamente y el uso del wildcard “*” nos permitirá estar leyendo los indices que se generan de manera diaria.

Presionamos el boton Create y ya veremos que empiezan a aparecer etiquetas definidas en los filter con el plugin grok. Si todo marcha bien podremos ver los campos ya generados por el filter de logstash.

Vamos a Discover y veremos ya como fluyen nuestros logs. A nuestra izquierda veremos las etiquetas que generaron los filtros y a la derecha veremos la captura del mensaje de log con las etiquetas marcadas.

Como ya vimos en el artículo anterior no usamos Kibana para generar los Dashboards y si Grafana que a mi modo de ver tiene muchas más posibilidades a la hora de confeccionarlos; también explicamos algunos ejemplos y espero les sirva en este artículo. Solo dejaré una captura de un Dashboard que ya tengo en producción y por el cual pueden tener una idea de como les podría quedar uno para Squid.

2 Comments

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*