Analisi e gestione dei log httpd

Guida Apache
di Openskills

I Log di Apache
L'attività di logging è fondamentale per ogni servizio in esecuzione su una macchina.
Su Apache oltre a fornire informazioni su eventi che riguardano il funzionamento del servizio, nei log si tiene traccia di tutte le richieste http eseguite al server web.

Il modulo mod_log_config gestisce tutte le attività di logging da Apache 1.3.5 in poi.
Generalmente su un server web si prvedono 2 diversi tipi di log:

I LOG DI ERRORE: Error_log
Contiene traccia di tutti gli errori incontrati da Apache. Di default viene scritto in /server_root/logs/error.log ma la sua posizione può essere configurata:
ErrorLog /var/log/httpd/error_log.
Ci può essere solo un ErrorLog nella configurazione generale, ma ne può essere definito uno per ogni VirtualHost. Non si può impedire ad Apache di loggare gli errori ma si possono evitare i tempi di scrittura su disco: ErrorLog /dev/null.
E' possibile definire il livello di logging (in ordine di importanza: emerg - alert - crit - error - warn - notice - info - debug) con la direttiva LogLevel:
LogLevel warn
E' inoltre possibile utilizzare syslog per il logging, di default Apache usa la facility local7:
ErrorLog syslog
Ma si può definire una propria facility per gestire più facilmente /etc/syslog.conf. Con l'esempio che segue si passano al syslog i messaggi di errore utilizzando la facility apache:
ErrorLog syslog:apache

I LOG DI ACCESSO: Transfer_log
Qui vengono registrate tutte le richieste HTTP fatte al server dai client in rete. Sono fondamentali per poter analizzare il traffico su un sito Web e vengono allo scopo processati da appositi software di log analysys.
Il formato dei log di accesso può essere customizzato dall'utente ed includere i dati che interessano.
Al contrario dei log di errore, i transfer log vanno esplicitamente configurati e possono essere evitati.
L'impostazione di base del log viene fatto con la direttiva TransferLog ed è nel Common Log Format (host ident authuser date request status bytes):
TransferLog /var/log/httpd/access_log.
Con la direttiva LogFormat si può scegliere cosa scrivere nel file di log e si definisce il nome del tipo di log, che può poi venir utilizzata con la direttiva CustomLog (nel caso che segue il nome del formato è common).
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common


SOURCE APACHE DOCS: Log files - Url: http://httpd.apache.org/docs/logs.html

Analisi del traffico Web: strumenti e funzioni
Chiunque pubblica su Internet un suo sito web è interessato a sapere quanti lo visitano, cosa guardano, da dove vengono e magari perchè lo fanno.
Ogni server web logga, tiene traccia, di ogni file servito agli irrrequieti browser suoi client.
Il tipo di informazioni loggate da un server web sono, per ogni file (immagine o HTML) servito: data e ora della richiesta, IP del client remoto, client (browser) utilizzato, referrer (URL della pagina che ha il link al file richiesto), nome del file.
L'analisi dei log prodotti può essere automatizzata e analizzata per ottenere statistiche interessanti e comprensibili.
Esistono in circolazione una moltitudine di log analyzers, programmi, gratuiti o a pagamento, che analizzano i log di server Web vari e producono un output, tipicamente in HTML, che con tabelle, schemi, grafici e statistiche riassumono ed elencano innumerevoli dati sul traffico web generato da un sito.

Su Linux / Unix i più diffusi e validi programmi opensource o comunque freeware per l'analisi del traffico web sono:
WEBALIZER: http://www.webalizer.org - Veloce, diffuso, con interesanti grafici e statistiche
ANALOG: http://www.analog.cx/ - Statistiche dettagliate
AWSTATS: http://awstats.sourceforge.net/ - Ottima presentazione e grafici interessanti

Esistono moltissime alternative commerciali e anche diversi approccia all'analisi del traffico web.
I tool qui presentati analizzano i log dei server web, altri tool utilizzando delle proprie "sonde" all'interno di pagine Web, che registrano i dati sui visitatori su un server centrale, alcuni inseriscono pezzi di codice, per esempio in PHP, che logga su un database gli accessi.
Alcuni strumenti, infine, si adattano bene a grosse quantità di log anche su sistemi distribuiti, altri sono più limitati, alcuni processano senza problemi pagine dinamiche e i relativi accessi, altri lavorano bene solo su pagine statiche.

Customizzare il formato dei log
Apache permette di scrivere nei propri log di accesso una serie di informazioni relative ad ogni richiesta fatta via HTTP.

Con la direttiva LogFormat si assegna un nickname al log e si decide il formato dei dati che deve contenere.
La sintassi di base si riferisce al log di default, utilizzato dalla direttiva TransferLog:
LogFormat formato
E' comunque possibile definire un nickname associato al formato impostato, che può essere utilizzato con la direttiva CustomLog:
LogFormat formato nickname

I dati che possono essere scritti nel log sono vari e vengono identificati con lettere o stringhe precedute dal simbolo %:
%b - Le dimensioni in byte del file trasferito (coincide con l'header Content-Lenght)
%f - Il nome del file e il path completo del documento richiesto
%h - L'hostname o, se non viene risolto, l'indirizzo IP del client
%a - L'indirizzo IP del client. E' uguale a %h se l'hostname non viene risolto
%A - L'indirizzo IP del server.
%l - Il nome dell'utente remoto, se fornito da un identd lookup (Poco utile e inaffidabile)
%p - La porta TCP del server, a cui è arrivata la richiesta del client (di solito 80)
%P - Il PID del child di Apache che ha gestito la richiesta
%r - La prima righa della richiesta HTTP,che contiene il metodo usato (GET, POST...)
%s - Lo status code HTTP della risposta
%t - Date e ora della richiesta. Customizzabile con %{formato}t
%T - Il numero di secondi impiegati da Apache per processare la richiesta
%u - Il nome dell'utente eventualmente autenticato sul server
%U - L'URL richiesta dal client. Contenuta anche in %r
%v - Il canonical server name, come definito nella direttiva ServerName
%V - Il server name secondo quanto definito in UseCanonicalName
%{Variabile}e - Una variabile d'ambiente, così come definita dal server
%{Header}i - Un header http nella richiesta del client (esempi comuni: %{User-Agent}i %{Referer}i )
%{Header}o - Un header http nella risposta del server (es: %{Last-Modified}o )
%{Nota}n - Una stringa che può essere scambiata fra il core di Apache e un modulo (esempio tipico, per il mod_usertrack: %{Cookie}n )

Un esempio tipico di log custom è incluso nella configurazione standard di Apache:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
che genera un log simile:
217.148.96.21 - - [07/Nov/2002:14:27:05 +0100] "GET /gfx/morecoresisproject.jpg HTTP/1.1" 304 - "http://www.openskills.info/" "Opera/6.02 (Linux 2.4.17-GANDALF i686; U) [en]"

Una variazione sul tema, che cerca di raccogliere il maggior numero di informazioni sui visitatori (ma di fatto difficilmente fornisce più informazioni di un combined log) può essere:
LogFormat "%h %t \"%r\" %l %u \"%{Referer}i\" \"%{User-Agent}i\" \"%{From}i\"" user

APACHE DOCS: Module mod_log_config - Url: http://httpd.apache.org/docs/mod/mod_log_config.html

Log rotation e archiviazione dei log
La gestione e l'analisi dei log è un'attività sistemistica che richiede le sue attenzioni.
Su macchine ad alto traffico, o sotto attacco DOS o con particolari problemi ricorrenti, le dimensioni dei log possono crescere a dismisura in pochissimo tempo, fino a saturare il file system.

Per questo motivo è sempre consigliabile montare la directory /var, dove generalmente risiedono i log, in una partizione indipendente, che, anche se riempita, non blocca il funzionamento del sistema.
E' inoltre importante poterli gestire, ruotandoli ad intervalli fissi e compattando i log vecchi, preparandoli per un'archiviazione.

Su molte distribuzioni Linux è incluso Logrotate, un'applicazione che semplifica l'amministrazione dei log, permette di comprimere, rimuovere ed inviare il log via mail oltre a eseguire una rotazione di file con vari criteri.
Il file di configurazione è /etc/logrotate.conf
In sistemi che usano RPM , solitamente, le regole di gestione dei singoli log sono inserite nella directory /etc/logrotate.d/.
Generalmente gli script che eseguono logrotate sono inseriti nel crontab e di default sono configurati per gestire i log standard di sistema.

Altra applicazione che viene spesso usata per gestire, in particolare, i log di Apache è Cronolog, che rende particolarmente semplice la segmentazione di log in file diversi generati secondo unità di tempo configurabili (es: un file diverso ogni giorno). E' particolarmente utile per gestire siti ad alto traffico, in cui le dimensioni dei log tendono a crescere in modo spropositato.
Viene tipicamente usato come un filtro che riceve un log dallo standard input e lo scrive in stdout su più diversi file, secondo le specifiche indicate in un template. La sintassi di base è /path/cronolog [opzioni] template. Per esempio:
/usr/sbin/cronolog /web/logs/%Y/%m/%d/access.log divide il log che riceve in stdout in tanto diversi log in diverse directory secondo il criterio /web/logs/anno/mese/giorno/access.log, con risultati tipo: /web/logs/2003/01/17/access.log.
Viene tipicamente usato in httpd.conf sfruttando la funzionalità di Apache di inviare i log ad un comando esterno:
TransferLog "|/usr/sbin/cronolog /web/logs/%Y/%m-%d-access.log"
ErrorLog "|/usr/sbin/cronolog /web/logs/%Y/%m-%d-errors.log"

Crea un file di log diverso ogni giorno e li mette in directory divise per anno.

Il vantaggio di simili programmi è quello di sollevare l'amministratore dalla noiosa e insidiosa pratica di gestione e archiviazione dei log, che se non automatizzata può portare a spiacevoli conseguenze quali file system riempiti al 100%, file di log enormi, perdita di dati e simili contrattempi.

LINK Cronolog Home Page - Url: http://www.cronolog.org/ Home page di cronolog - Url: http://www.cronolog.org/

Utilizzo dei piped logs
Una interessante e flessibile funzionalità del sistema di logging di Apache è la possibilità di inviare i dati di un log (sia un error log che un transfer log) ad un programma, tramite una normale pipe, invece che scriverli direttamente su un file.

Il programma che riceve il log in standard input potrà processarli e scriverli in standard output secondo criteri assolutamente gestibili.
Va notato che il programma a cui si passano i log viene eseguito con i permessi di Apache, quindi di root, per cui bisogna prestare attenzione ai possibili rischi in termini di sicurezza.
Per questa funzione basta sostituire al nome del file la pipe e il nome del programma (o la command line) a cui inviare i log.
Alcuni esempi possono essere illuminanti sulle enormi possibilità che si aprono con questa funzione:
Compressione dei log on-the-fly:
CustomLog "|/usr/bin/gzip -c >> /var/log/access_log.gz" common
Reverse lookup sui client IP in quasi real-time, senza ritardare le risposte del server come accade con la direttiva HostNameLookup:
CustomLog "|/usr/local/apache/bin/logresolve >> /var/log/access_log" common
Esegue la rotazione automtica dei log ogni 24 ore (86400 secondi):
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" combined
Usando il tool cronolog si creano log mensili con nomi che contengono mese e anno:
CustomLog "|cronolog /var/log/apache/DOMAIN/%Y/%Y-%m-access.log" combined

Si invia il log ad un proprio programma filtro.sh:
CustomLog "|/usr/local/bin/filtro.sh" combined
In un caso simile filtro.sh deve poter ricevere in STDIN dei dati, gestirli e scriverli da qualche parte. Un esempio, che logga in un file a parte tutte le richieste generate da worm come Nimda è questo:
#!/bin/sh
NIMDA_LOG=/var/www/httpd/nimda_log
NORMAL_LOG=/var/www/httpd/access_log
STRING=cmd.exe
while /bin/true;
do
read loginput
if [ `echo "$loginput" | grep -c $STRING ` == 1 ]
then
echo "$loginput" >> $NIMDA_LOG &
else
echo "$loginput" >> $NORMAL_LOG &
fi
done


SOURCE APACHE DOCS: Piped logs - Url: http://httpd.apache.org/docs/logs.html#piped

Come non loggare le immagini su Apache
Una volta attivato, il trasfer loggin di Apache scrive una riga di log per ogni oggetto richiesto dai client. In siti con molto traffico o molte immagini può essere utile evitare di scrivere innumerevoli righe di log per tutte le immagini richieste e limitare il logging alle pagine html o simili.

Per farlo si possono usare alcune caratteristiche evolute della direttiva che può eseguire controlli e decisioni sulla base delle variabili d'ambiente.
Queste variabili possono anche essere definite con la direttiva SetEnvIf disponibile con il modulo mod_setenvif.
Di fatto per non loggare le immagini nel proprio log si può usare una configurazione simile:
# Identifica negli URI i file .gif, .jpg e .png e li assegna alla variabile images
SetEnvIf Request_URI \.gif$ image=gif
SetEnvIf Request_URI \.jpg$ image=jpg
SetEnvIf Request_URI \.png$ image=png
# Specifica di non loggare nel CustomLog le entry che matchano le imamgini
CustomLog logs/access_log common env=!image


Gestire la rotazione dei log su Apache
Il processo di ruotare i log su Apache, se fatto manualmente, richiede una certa attenzione, ma può essere automatizzato con script e tool specifici.

La procedura manuale, richiede un riavvio del server web.
Quando infatti si rinomina un file di log, Apache continua a loggare sullo stesso, almeno fino ad un riavvio del servizio.
I comandi sono di questo tenore:
mv access_log access_log.old
mv error_log error_log.old
apachectl graceful
sleep 600
gzip access_log.old error_log.old

Si può anche fare un restart più rapido e brutale (apachectl restart) che non aspetta la chiusura delle connessioni esistenti.

Questa operazione può essere automatizzata direttamente in configurazione con filtri come Cronolog o il comando rotatelogs, distribuito con Apache (guardare la parte sui Piped Log).
Alternativamente si possono usare programmi come LogRotate che gestiscono la rotazione di ogni tipo di log.

Si ringrazia Openskills per
la realizzazione della guida


© Risorse.net (www.risorse.net)
pagina in versione stampabile:
http://www.risorse.net /apache/analisi_log.asp?print=ok