Categorie
PHP

Inviare i log di WordPress a un server syslog remoto

Da qualche giorno sto utilizzando su questo blog WPsyslog2, un plugin per WordPress realizzato dal team di OSSEC, uno tra i più noti intrusion detection open source. WPsyslog2 permette di loggare tutta una serie di eventi (impostabili nelle configurazioni) come ad esempio un login fallito, la cancellazione di un post, la creazione di una nuova regola di URL rewrite.

I report del plugin vengono salvati in una tabella MySQL, consultabile dalla dashboard di WP, ma anche localmente sulla macchina dove il plugin è installato. Nel caso di una macchina Linux, i log vengono inviati al “log server” di default, cioè syslogd (o rsyslogd nel caso di distro aggiornate come Ubuntu 9.10), e salvati in /var/log/syslog o /var/log/messages, in caso ci si trovi su Windows il plugin va a scrivere nell’Event log.

Purtroppo non è stata inclusa la possibilità di inviare i log a un server syslog remoto, cosa che sarebbe stata molto comoda per chi ha il proprio blog su un hosting (e quindi non ha completo accesso ai log della macchina su cui è ospitato il blog né ha controllo sul file /etc/syslogd.conf). L’invio a un demone syslogd remoto è molto utile per chi abbia una macchina Linux (reale o virtualizzata) che si occupi soltanto della raccolta dei log di altri sistemi.

Avendo ricevuto risposta negativa da parte degli autori di WPsyslog2 sull’eventuale modifica del plugin per il logging su server remoto, ho deciso di fare da me. Dico subito che il plugin utilizza delle funzioni PHP standard per inviare i log al demone syslogd della macchina locale, in particolare le funzioni utilizzate si trovano nel file wpsyslog.php del plugin e sono le seguenti:

openlog("WPsyslog", LOG_PID, LOG_DAEMON);
syslog(LOG_WARNING, "$block_header $severityname: $message");
closelog();

Fondamentale è la funzione PHP syslog() che genera un log di sistema. Purtroppo la funzione è in grado di comunicare solo con l’istanza locale di syslogd, quindi mi sono messo alla ricerca di una soluzione che ho trovato, dopo molte ricerche, nella libreria syslog client 1.1.3. Quest’ultima, una volta inclusa in uno script, permette di inviare log a una macchina remota. Per poterla utilizzare in wpsyslog.php è necessario collocare la libreria, chiamata syslog.php, nella stessa cartella del plugin WPsyslog2. Fatto questo basta andare a modificare wpsyslog.php eliminando la funzione syslog() e andandola a rimpiazzare con la nuova funzione di invio su una macchina remota ottenuta grazie alla syslog.php. Personalmente mi è bastato effettuare una modifica banale servendomi di uno degli esempi presentati in syslog.php, ecco la mia modifica:

require_once('syslog.php'); /*richiamo la libreria*/
$syslog = new Syslog(); /*la nuova funzione*/
$syslog->Send("192.168.1.x", "$block_header $severityname: $message"); /*invio i log impostando l'indirizzo IP del server syslogd remoto e il messaggio che apparirà nei log*/

Probabilmente chi conosce PHP potrà raffinare ulteriormente i log dato che la libreria syslog.php consente di impostare moltissimi parametri, per le mie esigenze questa soluzione “grossolana” ha funzionato da subito egregiamente.

Ho effettuato dei test per verificare l’efficacia di questa soluzione solo nella mia LAN casalinga, utilizzando una Slackware 13.0 (virtualizzata su VirtualBox) su cui ho abilitato il remote logging modificando lo script /etc/rc.d/rc.syslog. Per poter capire se avevo abilitato correttamente il remote logging su Slackware mi è stato utile Kiwi SyslogGen, un freeware per Windows di pochi KB che genera messaggi e li invia a un host remoto. Per comodità di chi legge ho deciso di zippare la versione modificata da me del plugin WPsyslog2, includendovi anche la libreria syslog.php.

DOWNLOAD: wpsyslog2 modificato

3 risposte su “Inviare i log di WordPress a un server syslog remoto”

Ciao Guido, di default il plugin non prevede il log delle ricerche ma nulla ti vieta di modificarne il funzionamento, io non ne ho avuto bisogno quindi non so indirizzarti sulle modifiche necessarie.

I commenti sono chiusi