{"id":6693,"date":"2020-04-13T19:09:30","date_gmt":"2020-04-13T17:09:30","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=6693"},"modified":"2020-04-13T19:09:31","modified_gmt":"2020-04-13T17:09:31","slug":"apache2-logs-mit-logstash-parsen","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/apache2-logs-mit-logstash-parsen\/","title":{"rendered":"Apache2 Logs mit Logstash parsen"},"content":{"rendered":"<p>Der Grok-Parser von Logstash besitzt bereits eine Integration f\u00fcr die Combined Accesslogs des Apache2 Webservers. Es ist daher recht einfach m\u00f6glich, diese Logs mittels Logstash zu parsen und an eine Elasticsearch-Datenbank zu \u00fcbermitteln.<\/p>\n<h2 class=\"wp-block-heading\">Combined Accesslog aktivieren<\/h2>\n<p>Apache bietet umfangreiche Anpassungsm\u00f6glichkeiten f\u00fcr das Logging. Unter anderem ist das sogenannte <strong>Combined Logformat<\/strong> g\u00e4ngig. Es protokolliert die Client-IP, den Benutzername bei Basic-Authentifizierung, Datum und Uhrzeit, Anfragemethode, den Referer (Quellseite), HTTP Antwortcode, Gr\u00f6\u00dfe des HTTP-Bodys und den User-Agent des Clients. Diese Informationen sind f\u00fcr viele Anwendungsf\u00e4lle ausreichend und daher ein guter Anfang, wenn man in einer zentralen ELK-Instanz protokollieren m\u00f6chte. Dar\u00fcber hinaus unterst\u00fctzt Grok dieses Format von Haus aus.<\/p>\n<p>Alternativ kann auch das <strong>Common<\/strong> Format genutzt werden. Es entspricht weitgehendst Combined, aber ohne den Referer und User-Agent. Im folgenden Beispiel kommt Combined zum Einsatz. Die vordefinierten Muster findet man <a href=\"https:\/\/github.com\/logstash-plugins\/logstash-patterns-core\/blob\/master\/patterns\/httpd\" class=\"aioseop-link\" target=\"_blank\" rel=\"nofollow\">im Pattern Github-Repo von Logstash<\/a>.<\/p>\n<p>Zun\u00e4chst m\u00fcssen wir das Format in der Apache-Konfiguration (meist httpd.conf) aktivieren. Im einfachsten Falle gen\u00fcgt daf\u00fcr folgende Zeile:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-apache\" data-line=\"\">CustomLog logs\/access_log common<\/code><\/pre>\n<p>M\u00f6chte man Logrotate gleich mit einbinden und f\u00fcr jeden Tag eine neue Logdatei erstellen, ist dies wie folgt m\u00f6glich:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-apache\" data-line=\"\">CustomLog &quot;|\/opt\/IBM\/HTTPServer\/bin\/rotatelogs \/opt\/IBM\/HTTPServer\/logs\/access_%Y_%m_%d.log 86400&quot; common<\/code><\/pre>\n<p>Hier wird als Beispiel der<strong> IBM HTTP Server<\/strong> f\u00fcr eine Connections-Installation genutzt. Da es sich um einen Fork von Apache handelt, kann dies auch in Apache verwendet werden. Gegebenenfalls weichen die Pfade ab, je nach verwendeter Distribution\/Installationsart.<\/p>\n<h2 class=\"wp-block-heading\">Parsen der Apache-Logs mit Logstash<\/h2>\n<p>Nun k\u00f6nnen wir die Logs mit Logstash zur \u00dcbermittlung an Elasticsearch parsen. Zun\u00e4chst m\u00fcssen wir die Logdateien als Quelle definieren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">input {\n\tfile {\n\t\tpath =&gt; &quot;\/opt\/IBM\/HTTPServer\/logs\/access_*.log&quot;\n\t\ttype =&gt; &quot;apache_access&quot;\n\t}\n}<\/code><\/pre>\n<p>Hier ist der Pfad entsprechend anzupassen. Ein Stern * kann als Wildcard genutzt werden. Dies ist beispielsweise bei der Verwendung von Logrotate n\u00fctzlich.<\/p>\n<p>Das Parsing der Logeintr\u00e4ge wird vom Filter \u00fcbernommen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">filter {\n   if [path] =~ &quot;access&quot;  {\n\t\tmutate { replace =&gt; { type =&gt; &quot;apache_access&quot; } }\n\t\tgrok {\n\t\t\tmatch =&gt; { &quot;message&quot; =&gt; &quot;%{HTTPD_COMBINEDLOG}&quot; }\n\t\t}\n\t\tdate {\n\t\t\tmatch =&gt; [ &quot;timestamp&quot; , &quot;dd\/MMM\/yyyy:HH:mm:ss Z&quot; ]\n\t\t\tremove_field =&gt; [ &quot;timestamp&quot; ]\n\t\t}\n   }\n}<\/code><\/pre>\n<p>Grok parst die Lognachricht mit dem vordefinierten Muster <strong>HTTPD_COMBINEDLOG<\/strong>. Wer sich f\u00fcr die Muster definiert, findet die Definition im oben verlinkten Logstash-Repo:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">HTTPD_COMMONLOG %{IPORHOST:clientip} %{HTTPDUSER:ident} %{HTTPDUSER:auth} \\[%{HTTPDATE:timestamp}\\] &quot;(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP\/%{NUMBER:httpversion})?|%{DATA:rawrequest})&quot; %{NUMBER:response} (?:%{NUMBER:bytes}|-)\nHTTPD_COMBINEDLOG %{HTTPD_COMMONLOG} %{QS:referrer} %{QS:agent}<\/code><\/pre>\n<p>HTTPD_COMMONLOG ist das ebenfalls angesprochene, etwas kompaktere Logformat. Die Variablen werden nach dem Schema <strong>${Datentyp:Variablenname}<\/strong> deklariert. <strong>%{NUMBER:response} <\/strong>steht beispielsweise f\u00fcr eine Zahl, die in der Variable <strong>response<\/strong> geparst und an Elasticsearch \u00fcbermittelt wird. Der untere <strong>HTTPD_COMBINEDLOG<\/strong> Filter erweitert dies um den Referer und User-Agent des Clients. F\u00fcr das reine Parsen der Apache-Logs ben\u00f6tigt man dies zwar nicht. Interessant wird es jedoch, wenn man ein exotischeres System an Logstash anbinden m\u00f6chte, f\u00fcr das noch keine Muster existieren. Hier bietet aber auch die Doku weitere Informationen.<\/p>\n<p>Schlussendlich m\u00fcssen wir noch definieren, dass die geparsten Logs an einen Logstash-Server zu \u00fcbermitteln sind:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">output {\n\telasticsearch { \n\t\thosts =&gt; [&quot;https:\/\/elasticsearch:443&quot;]\n\t\t# ssl_certificate_verification =&gt; false\n\t\tindex =&gt; &quot;ihs&quot;\n\t}\n\tstdout { codec =&gt; rubydebug }\n}<\/code><\/pre>\n<p>Wichtig ist, hier mindestens einen Elasticsearch-Host anzugeben und einen Index zu definieren. Der Index erm\u00f6glicht die sp\u00e4tere Zuordnung der Logs in Kibana (oder einer anderen Oberfl\u00e4che). Die Variable <strong>ssl_certificate_verification <\/strong>kann f\u00fcr Tests in Unternehmensumgebung n\u00fctzlich sein. Wird ein MITM-Proxy genutzt und das Zertifikat befindet sich noch nicht im vertrauensw\u00fcrdigen Store, verweigert Logstash die Verbindung. Aus Sicherheitsgr\u00fcnden ist dies jedoch nur zu Testzwecken empfohlen. Wer dies hinter einem MITM-Proxy einsetzt, sollte zumindest dessen Stammzertifikat im Store hinterlegen. Dies ist zwar auch nicht optimal. Aber immer noch ein geringeres Risiko, als die Zertifikatsvalidierung komplett zu ignorieren.<\/p>\n<p>Wird Logstash nun gestartet, sollten die ersten Anfragen in Elasticsearch aufgezeichnet werden. Durch den stdout-Block erhalten wir alle gesendeten Logeintr\u00e4ge auf der Konsole. Dies kann zum sp\u00e4teren Betrieb nat\u00fcrlich deaktiviert werden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der Grok-Parser von Logstash besitzt bereits eine Integration f\u00fcr die Combined Accesslogs des Apache2 Webservers. Es ist daher recht einfach m\u00f6glich, diese Logs mittels Logstash zu parsen und an eine Elasticsearch-Datenbank zu \u00fcbermitteln. Combined Accesslog aktivieren Apache bietet umfangreiche Anpassungsm\u00f6glichkeiten f\u00fcr das Logging. Unter anderem ist das sogenannte Combined Logformat g\u00e4ngig. Es protokolliert die Client-IP, &#8230;<\/p>\n","protected":false},"author":5,"featured_media":6695,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[78],"tags":[799,800,795,751,801],"class_list":["post-6693","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software","tag-apache2","tag-elk","tag-ihs","tag-logs","tag-logstash"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6693","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=6693"}],"version-history":[{"count":8,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6693\/revisions"}],"predecessor-version":[{"id":6702,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6693\/revisions\/6702"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/6695"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=6693"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=6693"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=6693"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}