Nginx Logfiles anonymisieren und mit AWstats auswerten

Bei AWStats handelt es sich um ein recht bekanntes Werkzeug zum Auswerten von Serverlogfiles. Es eignet sich wunderbar um einen Eindruck davon zu bekommen wie häufig eine Webseite aufgerufen wird und auch welche Beiträge am beliebtesten sind. Eine Demo des Tools findet sich auf der offiziellen Webseite des Projekts. Der Vorteil gegenüber richtigen Tracking Lösungen wie Google Analytics oder Piwik ist, dass nur Daten ausgewertet werden welche sowieso schon in den Serverlogfiles vorhanden sind. Da keine zusätzlichen Daten über Cookies oder Javascript Code erfasst wird ist das Tracking allerdings auch weniger genau.

Ein Problem bei der Auswertung von Serverlogs ist dass in der Standardkonfiguration alle Webserver die vollständige IP Adresse der Besucher speichern. Auch wenn dies rechtlich noch nicht abschließend geklärt sein mag, handelt es sich nach Ansicht vieler Fachleute bei der IP Adresse um ein personenbezogenes Datum, welches ohne ausdrückliche Einwilligung des Besuchers nicht ausgewertet werden darf. Aus rechtlichen Erwägungen und aus Respekt vor der Privatsphäre der Webseitenbesucher müssen die Logfiles also zuerst einmal anonymisiert, also mit verkürzeter IP Adresse gespeichert werden.

Der nächste Stolperstein ist Nginx selber. AWStats liegt als Perl Skript vor, welche von Nginx selbst jedoch nicht ausgeführt werden können.

Nginx Logfiles mit anonymisierter IP Adresse speichern

Die Lösung zum speichern von Logfiles mit verkürzten IP Adressen habe ich nach längerem suchen auf Stackoverflow.com gefunden. Hier wird dem Webserver zuerst ein neues Logformat beigebracht, welches anonymized genannt wird.

Hierzu wird in die /etc/nginx/nginx.conf nach http {

folgende Konfiguration eingefügt:

map $remote_addr $ip_anonym1 {
default 0.0.0;
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" $ip;
"~(?P<ip>[^:]+:[^:]+):" $ip;
}

map $remote_addr $ip_anonym2 {
default .0;
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" .0;
"~(?P<ip>[^:]+:[^:]+):" ::;
}

map $ip_anonym1$ip_anonym2 $ip_anonymized {
default 0.0.0.0;
"~(?P<ip>.*)" $ip;
}

log_format anonymized '$ip_anonymized - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';

Damit das neue Logformat genutzt wird muss die virtual Host Konfiguration noch angepasst werden. Unter z.B. /etc/nginx/sites-enabled/example.com.conf ersetzt man am Ende der Zeile access_log das combined; durch anonymized;

access_log /var/log/nginx/access.log combined;
access_log /var/log/nginx/access.log anonymized;

Wer der Ansicht ist die kompletten IP Adressen in seinen Logfiles zu benötigen kann auch zwei Logfiles schreiben lassen. Hierzu muss nur die anonymized Zeile zusätzlich zur combined Zeile hinzugefügt werden und natürlich der Dateiname abgeändert werden.

Nach einem Reload von Nginx werden IP Addressen nun verkürzt gespeichert. Mit oben beschriebener Konfiguration wird aus einer IPv4 Adresse wie 130.94.245.189 nun 130.94.245.0. Eine IPv6 Adresse wie 2a01:fd9f:6d39:c64:fd2a:df01:b69a:1701 wird die verkürzte Form 2a01:fd9f::

Wer bei IPv6 Adressen lieber einen /64 Präfix speichern möchte muss nur in der Definition des anonymized Logformats die vierte Zeile von

"~(?P<ip>[^:]+:[^:]+):" $ip;

abändern in

"~(?P<ip>[^:]+:[^:]+:[^:]+:[^:]+):" $ip;

Eine IPv6 Adresse wird dann als 2a01:fd9f:6d39:c64:: erfasst.

Installation und Konfiguration von AWStats

Die aktuelle Version von AWStats kann von der Projektseite heruntergeladen werden. Das Paket wird dann entpackt und in diesem Beispiel unter /usr/share/awstats gespeichert. Im Verzeichnis /usr/share/awstats/wwwroot/cgi-bin befindet sich eine Beispieldatei für die Konfiguration, die awstats.model.conf. Diese sollte in eine neue Datei, damit die Beispieldatei nicht überschrieben wird, also z.B awstats.mysite.conf.

Anschließend muss zumindest die Zeile LogFile und SiteDomain angepasst. Hier muss der komplette Pfad zum Logfile und die Domain welche analysiert werden soll angegeben werden. Wenn die Seite unter mehreren Domains erreichbar ist (z.B. example.com und www.example.com oder mobil.example.com) kann dies unter HostAliases angegeben werden.

LogFile="/var/log/nginx/access.log"
SiteDomain="example.com"
HostAliases="example.com mobil.example.com www.example.com"

Andere Parameter können nach Wunsch konfiguriert werden und sind im config file durch ausführliche Kommentare erklärt.

Die analysierten Daten werden in Textfiles gespeichert. Damit der Server diese schreiben kann darf nicht vergessen werden diesem Schreibrechte auf das Unterverzeichnis stats zu geben.

sudo chown -R www-data: /usr/share/awstats/wwwroot/cgi-bin/stats

Im Verzeichnis tools des heruntergeladenen Pakets befinden sich einige Beispieldateien für die Konfiguration von Nginx zur ausführung von AWStats bzw. Perl Dateien. Diese müssen evtl. zuerst ausführbar gemacht werden mit

cd /usr/share/awstats/wwwroot/cgi-bin
sudo chmod +x *.pl

Damit die Dateien ausgeführt werden, müssen diese von Nginx an php-fastcgi weitergeleitet werden. Hierfür wird die Datei fcgi.php im Verzeichnis /usr/share/awstats/wwwroot/cgi-bin erstellt:

sudo nano /usr/share/awstats/wwwroot/cgi-bin/fcgi.php

und mit der Konfiguration aus der Beispieldatei im tools Verzeichnis gefüllt

<?php
$descriptorspec = array(
0 => array('pipe', 'r'),  // stdin is a pipe that the child will read from
1 => array('pipe', 'w'),  // stdout is a pipe that the child will write to
2 => array('pipe', 'w')   // stderr is a file to write to
);

$newenv = $_SERVER;
$newenv['SCRIPT_FILENAME'] = $_SERVER['X_SCRIPT_FILENAME'];
$newenv['SCRIPT_NAME'] = $_SERVER['X_SCRIPT_NAME'];

if (is_executable($_SERVER['X_SCRIPT_FILENAME'])) {
$process = proc_open($_SERVER['X_SCRIPT_FILENAME'], $descriptorspec, $pipes, NULL, $newenv);

if (is_resource($process)) {
fclose($pipes[0]);
$head = fgets($pipes[1]);

while (strcmp($head, "\n")) {
header($head);
$head = fgets($pipes[1]);
}

fpassthru($pipes[1]);
fclose($pipes[1]);
fclose($pipes[2]);

$return_value = proc_close($process);
} else {
header('Status: 500 Internal Server Error');
echo('Internal Server Error');
}
} else {
header('Status: 404 Page Not Found');
echo('Page Not Found');
}
?>

Nun muss nur noch der entsprechende Virtual Host konfiguriert werden, damit AWStats auch ausgeführt wird und über den Browser erreichbar wird. Dazu wird folgende Konfiguration in z.B. /etc/nginx/sites-enabled/example.com vor das abschließende } eingefügt:

## AWstats start
location /classes/ {
alias /usr/share/awstats/wwwroot/classes/;
}

location /css/ {
alias /usr/share/awstats/wwwroot/css/;
}

location /icon/ {
alias /usr/share/awstats/wwwroot/icon/;
}

location /awstats-icon/ {
alias /usr/share/awstats/wwwroot/icon/;
}

location /awstats/js/ {
alias /usr/share/awstats/wwwroot/js/;
}

# Dynamic stats.
location ~ ^/cgi-bin/(awredir|awstats)\.pl {
auth_basic "Administrator Login";
auth_basic_user_file /etc/nginx/auth-basic/awstats.htpasswd;
gzip off;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME /usr/share/awstats/wwwroot/cgi-bin/fcgi.php;
fastcgi_param X_SCRIPT_FILENAME /usr/share/awstats/wwwroot$fastcgi_script_name;
fastcgi_param X_SCRIPT_NAME $fastcgi_script_name;
include fastcgi_params;
}
## AWstats end

 

Die Zeile fastcgi_pass muss evtl. angepasst werden, je nachdem ob PHP 5 oder 7 verwendet wird, bzw. ob PHP-FPM über einen Port oder einen Unix Socket angesprochen wird.

Damit der Aufruf der Statistiken Password geschützt ist (die Verwendung von SSL sollte ebenfalls konfiguriert werden, wird aber hier nicht beschrieben) wird die Datei /etc/nginx/auth-basic/awstats.htpasswd noch mit Zugangsdaten befüllt. Evtl. muss hierfür zuerst noch das Paket apache2-utils installiert werden.

sudo touch /etc/nginx/auth-basic/awstats.htpasswd
sudo htpasswd -c /etc/nginx/auth-basic/awstats.htpasswd awstats

awstats steht hierfür für den Benutzernamen, das zu verwendende Password wird abgefragt und als Hash und nicht im Klartext in der angegebenen Datei gespeichert.

Damit die Statistiken erstellt, bzw anschließend regelmäßig aktualisiert werden wird ein cronjob angelegt, welcher im globalen Crontab /etc/crontab folgendermaßen aussehen kann:

35 *    * * *   www-data        perl /usr/share/awstats/wwwroot/cgi-bin/awstats.pl -config=mysite -update > /dev/null

Zum initialen erstellen der Statisiken kann der Befehl von einem User, welcher Schreibrechte auf das Statistikverzeichnis hat, auch direkt aufgerufen werden. Wer das „> /dev/null“ weglässt erhält eine Übersicht welche Datensätze importiert wurden.

Nach dem erstmaligen Erstellen der Statistiken, bzw. nachdem der Cronjob das erste Mal gelaufen ist muss Nginx noch neu geladen werden. Anschließend sollten die Statistiken über den Webbrowser unter folgender Adresse aufrufbar sein

https://example.com/cgi-bin/awstats.pl?config=mysite

mysite steht hierfür für den verwendeten Namen der AWStats Config Datei, wenn diese awstats.mysite.conf genannt wurde.



88x31_CC_by
Dieser Text ist lizensiert unter einer Creative Commons Namensnennung 4.0 International Lizenz.

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.