CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
AGENDA
● WIE ZIJN WIJ?
● BELANG VAN LOGGING?
● WAAROM CENTRALE LOGGING?○ VOOR DRUPAL-DEVS○ VOOR SYSOPS
● DE ELK-STACK○ COMPONENTEN
● WAT LEVERT HET OP?
● ERVARINGEN TOT NU TOE
● VRAGEN?
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
WIE ZIJN WIJ?● Webscale
○ Hosting sinds 2001○ Hosting voor professionals○ Gespecialiseerd in PHP frameworks
■ zoals Drupal■ maar ook Symfony, Wordpress, Typo3 & Magento
○ ISO 9001 en 27001 NL datacenters○ CISSP management○ 100% open source○ 300+ managed servers○ 200+ Drupal sites
○ Webscale werkt voor:■ Rijksoverheid, Gemeenten, Graydon, Jaguar Land Rover, ThiemeMeulenhoff
○ Webscale werkt met:■ Cipix, d-Media, Merge, ezCompany
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
BELANG VAN LOGGING?
● Vastleggen van events
● Health-status van je applicatie / platform
● Troubleshooting
● Debugging
● Security
● Correlatie van events
● Statistieken gebruik
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
WAAROM CENTRALE LOGGING?
Voor de Devs:
● Alle logging inzichtelijk vanuit een lokatie
● Doorzoekbaar middels queries
● Monitoren van nieuwe sites na deployment (ACC en PROD)
● Monitoren van bestaande sites na nieuwe updates
● Monitoren van koppelingen met externe systemen
● Periodieke controle (bijv. elke maand een rapportage t.b.v. audits)
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
WAAROM CENTRALE LOGGING?
Voor de SysOps:
● Monitoren van errors
● Monitoren van ongewenst verkeer, proxy-requests, badbots, niet-legitieme requests
● Monitoren van performance
● Monitoren van verbruik resources, voor beslisvorming upgrades
● Correlaties leggen tussen events diverse logfiles van meerdere systemen
● Periodieke controle (bijv. elke maand een rapportage t.b.v. audits)
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
WAAROM CENTRALE LOGGING?
Het probleem:
● Logdata is “ongestructureerd” en lastig doorzoekbaar● Vaak op meerdere servers● Zoeken op basis van grep, awk en regex-magic
drupalsite.nl:80 80.60.70.109 - - [30/Mar/2015:12:26:22 +0200] "GET /sites/drupalsite.nl/files/styles/actionblock-image/public/uploads/actionblockimage/szwbannertoeslag300x250_0.gif?itok=0jUPhVnE HTTP/1.1" 200 39342 "http://www.kinderstadtilburg.nl/" "Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4"drupalsite.nl:80 80.60.70.109 - - [30/Mar/2015:12:26:22 +0200] "GET /sites/drupalsite.nl/modules/contrib/colorbox/styles/plain/images/loading_animation.gif HTTP/1.1" 200 2767 "http://www.drupalsite.nl/" "Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4"drupalsite.nl:80 80.60.70.109 - - [30/Mar/2015:12:26:22 +0200] "GET /sites/drupalsite.nl/themes/kinsbase/images/arrows.png HTTP/1.1" 200 408 "http://www.drupalsite.nl/" "Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4"
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
WAAROM CENTRALE LOGGING?
De oplossing:
● Transporteer de logging naar een centrale lokatie● Identificeren van velden op basis van “grok-filters”● Filteren en verrijken van de data● Maak van iedere logregel een json-document● Sla het json-document op in ElasticSearch
drupalsite.nl:80 80.60.70.109 - - [30/Mar/2015:12:26:22 +0200] "GET /sites/drupalsite.nl/files/styles/actionblock-image/public/uploads/actionblockimage/szwbannertoeslag300x250_0.gif?itok=0jUPhVnE HTTP/1.1" 200 39342 "http://www.drupalsite.nl/" "Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4"
{ "fqdn": "www01.drupal01.webscale.nl",
"http_vhost": "drupalsite.nl",
"http_port": "80",
"http_clientip": "80.60.70.109",
"http_ident": "-",
"http_auth": "-",
"http_timestamp": "30/Mar/2015:12:26:22 +0200",
"http_method": "GET",
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
WAAROM CENTRALE LOGGING?
Uiteindelijke situatie:
● Logging beschikbaar, doorzoekbaar en gevisualiseerd in Kibana
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
DE ELK-STACK
● Logstash-Forwarder
● Logstash-Receiver
● Redis
● Logstash-Indexer
● ElasticSearch
● Nginx / Kibana
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
DE ELK-STACK
DRUPALWEBSERVER
LOGSTASH(INDEXER)
LOGSTASH(RECEIVER)
REDIS(MESSAGEQUEUE)
ELASTICSEARCH KIBANA(WEBINTERFACE)
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
WAT LEVERT HET OP?
● Logging centraal beschikbaar
● Logging eenvoudig doorzoekbaar
● Devs hoeven niet meer via ssh in te loggen op server bij onderzoek
● Dashboards via een webinterface geven duidelijk overzicht van de status
● Debugging eenvoudiger
● Root-cause-analysis vele malen sneller bij problemen
● Statistieken over gebruik Drupal-Sites
● Periodieke audits kosten minder tijd
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
ERVARINGEN TOT NU TOE
Positief:
● ELK is snel!
● Met de juiste opzet zeer stabiel
● Logstash-Forwarder lightweight en veilig (TLS)
● Logstash zeer flexibel en uitbreidbaar
● Makkelijk zoeken in Kibana
● Visualisaties veel eenvoudiger in Kibana4
● Biedt al snel toegevoegde waarde
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
ERVARINGEN TOT NU TOE
Negatief of wat kan beter:
● Maken grokfilters soms nog lastig
● Ontwikkeling van ELK gaat zeer snel, dus breekt soms bij nieuwe releases
● Documentatie en tutorials vaak out-of-date
● Schaalbare architectuur biedt wel wat uitdagingen
● Kibana nog beperkt in functionaliteit (t.o.v. bijv. Splunk)
● Kibana out-of-the-box geen authenticatie en autorisatie (wel met Shield-plugin)
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
ERVARINGEN TOT NU TOE
Lessons Learned en plannen voor de toekomst:
● Centrale logging biedt zeker een flinke toegevoegde waarde
● Zowel voor de Devs als voor SysOps
● Let goed op “_grokparsefailures”
● grokdebug.herokuapp.com is een lifesaver!
● Nog meer logfiles opnemen
● Eventueel uitfaseren logstash-forwarder voor rsyslog (Jessie)
● Verder experimenteren met clustered-elasticsearch
● Implementeren authenticatie en authorisatie
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
SCREENSHOTS - DRUPAL LOG
/var/log/drupal/drupal.log
Apr 29 13:55:03 www01 drupal: 5|1430308503|cron|127.0.0.1|0||http://site|http://site.nl/index.php|||Cron run completed.
Apr 29 14:00:02 www01 drupal: 5|1430308802|job_scheduler|127.0.0.1|0||http://site|http://site/index.php|||Finished
processing scheduled jobs (0 sec s, 0 total, 0 failed).
Apr 29 14:23:47 www01 drupal: 5|1430310227|user|109.232.42.91|0||https://www.site.nl|https://www.site.nl/|https://
www.site.nl/||Login attempt failed for a.user.
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
SCREENSHOTS - LOGSTASH-FORWARDER
/etc/logstash/logstash-forwarder.conf
"network": {
"servers": [ "java01.log01.webscale.nl:5000" ],
"timeout": 15,
"ssl ca": "/etc/logstash/java01.log01.webscale.nl.crt"
},
"files": [{
"paths": [ "/var/log/drupal/drupal.log" ],
"fields": { "type": "drupal", "fqdn": "www01.drupal01.webscale.nl" }
}, {
"paths": [ "/var/log/apache2/*access.log" ],
"fields": { "type": "apache-vhost", "fqdn": "www01.drupal01.webscale.nl" }
}, {
"paths": [ "/var/log/apache2/*error.log" ],
"fields": { "type": "apache-error", "fqdn": "www01.drupal01.webscale.nl" }
}
]
}
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
SCREENSHOTS - DRUPAL GROKFILTER
DRUPAL_SYSLOGID [a-zA-Z0-9._-]+
DRUPAL_TYPE [a-zA-Z0-9._ -]+
DRUPAL_TIME %{MONTH} %{DAY} %{TIME} %{YEAR}
DRUPAL_WATCHDOG %{SYSLOGTIMESTAMP:timestamp} %{IPORHOST:host} %{DRUPAL_SYSLOGID:drupal_sylogid}: %
{NUMBER:drupal_severity}\|%{NUMBER:drupal_timestamp}\|%{DRUPAL_TYPE:drupal_type}\|%{IP:drupal_ip}\|(?
<drupal_uid>[^\|]*)\|(?<drupal_username>[^\|]*)\|http(s)?://%{HOSTNAME:drupal_vhost}\|(?<drupal_request>[^\|]*)\|(?
<drupal_referer>[^\|]*)\|(?<drupal_link>[^\|]*)\|(?<drupal_message>.*)
DRUPAL_WATCHDOG_VARNISH %{SYSLOGTIMESTAMP:timestamp} %{IPORHOST:host} %{DRUPAL_SYSLOGID:drupal_sylogid}\[%
{NUMBER:drupal_syslogpid}\]: %{NOTSPACE:varnish_interface} %{NOTSPACE:varnish_command} %{IP:varnish_source_ip} %
{NUMBER:varnish_source_port} %{IP:varnish_destination_ip} %{NUMBER:varnish_destination_port} %{NOTSPACE:varnish_method} %
{GREEDYDATA:varnish_message}
DRUPAL_WATCHDOG_CRON %{SYSLOGTIMESTAMP:timestamp} %{IPORHOST:host} %{DRUPAL_SYSLOGID:drupal_sylogid}: http(s)?://%
{HOSTNAME:drupal_vhost}\|%{NUMBER:drupal_timestamp}\|%{DRUPAL_TYPE:drupal_type}\|%{IP:drupal_ip}\|(?
<drupal_request>[^\|]*)\|\|%{NUMBER:drupal_severity}\|\|(?<drupal_message>.*)
CENTRALE LOGGING DRUPALCENTRALE LOGGING DRUPAL
SCREENSHOTS - KIBANA DISCOVER
drupal_severity:[1 TO 4] OR drupal_type:php