ELK - parsing des logs Apache
Rédigé par gorki Aucun commentaireLe problème :
Analyser les logs Apache (entre autre) avec un système de requêtage.
Alors il y a bien l'outil fait à la main, ça marche toujours :) mais je voulais tenter une stack ELK (Elasticsearch Logstash Kibana)
Solution :
Tout d'abord l'installation :
- je suis parti du docker qnib/elk (https://hub.docker.com/r/qnib/elk/).
- auquel j'ajoute le plugin elasticsearch-head pour la visulation des données
- création du docker initial (commité depuis avec le plugin elasticsearch) :
. envir.sh sudo docker run -t -i --rm -h elk --name sgl-elk --privileged \ ${DNS_STUFF} ${DEV_MOUNTS} ${LINK} \ ${HTTP_PORT} ${LS_CONF} ${AP_LOG} \ -e HTUSER=${HTUSER} -e HTPASSWD=${HTPASSWD} \ ${ES_PERSIST} qnib/elk:latest bash
- fichier d'environnement (envir.sh) :
# To get all the /dev/* devices needed for sshd and alike: export DEV_MOUNTS="-v /dev/null:/dev/null -v /dev/urandom:/dev/urandom -v /dev/random:/dev/random" export DEV_MOUNTS="${DEV_MOUNTS} -v /dev/full:/dev/full -v /dev/zero:/dev/zero" ### OPTIONAL -> if you want to store Elasticsearchs data outside export ES_PERSIST="-v ${HOME}/elk/elasticsearch:/data/" ### OPTIONAL -> To use a mapped in configuration directory # if not used, the default will be used within the container export LS_CONF="-v ${HOME}/elk/logstash.d/:/etc/logstash/conf.d/" ### OPTIONAL -> map apache2 config into container export AP_LOG="-v ${HOME}/elk/var/log/apache2/:/var/log/apache2" ### OPTIONAL -> set the external port to something else then 80 export HTTP_PORT="-e HTTPPORT=8080 -p 8080:80 -p 9200:9200 -p 5601:5601" ### OPTIONAL -> To secure kibana and elasticsearch user/passwd could be set # if a user is set and no passwd, the user will be set as password export HTUSER=kibana export HTPASSWD=kibana
Utilisation en oneshot :
- je fais du parsing à la demande plutôt que d'utiliser la stack en monitoring de log continu :
bin/logstash -f /etc/logstash/conf.d/10_apache.conf
- un exemple de fichier configuration logstash pour Apache :
input { file { path => "/var/log/apache2/test.log" start_position => "beginning" type => "apache" } } filter { if [type] == "apache" { grok { match => [ "message", "%{COMBINEDAPACHELOG}" ] add_tag => ["apachelog"] } if "apachelog" in [tags] { date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] } geoip { source => "clientip" target => "geoip" add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ] add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ] } mutate { convert => [ "[geoip][coordinates]", "float" ] } } } } output { if [type] == "apache" { stdout { codec => rubydebug } elasticsearch { protocol => "http" cluster => "logstash" } } }
- ensuite je me connecte sur elasticsearch pour vérifier que les données ont bien été insérées :
http://localhost:9200/_plugin/head/
- puis sur Kibana pour exploiter les logs :
http://localhost:8080 (kibana3)
http://localhost:5601 (kibana4)
Edit :
- Utilsation de grok : https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html
- les patterns grok d'ELK : https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns