Analisi del file di log di Postfix

scs analisi log mail

 

Per i miei clienti ho installato da tempo un sistema completo di posta. Ho scritto già un paio di articoli in questo blog su questo argomento, per i dettagli vi rimando a quelle letture.

In breve il sistema è composto da Postfix e Dovecot, con database Mysql. Sono state aggiunte una serie di features per il completamento del servizio, come la webmail, postgrey per l’antispam, una connessione SSL sia per smtp che per imap, la firma opendkim per l’invio delle mail, un paio di configurazione spf nel DNS, una serie di liste RBl per l’antispam, PostfixAdmin per la gestione degli account e dei domini, e qualche altro plugin per gestire i dettagli (tipo quota, risoluzione di un bug di OutLook ecc…)

Da anni ho sempre avuto problemi nella lettura corretta del file di log delle mail. Ho spesso cercato senza successo un programma in rete, e come sostituto, mi ero fatto un piccolo script di semplice ricerca di stringhe dentro al file di log, ma mi sono sempre ripromesso di realizzare qualcosa di più sofisticato per la ricerca e l’analisi della singola mail partendo da un file di log.

Se qualcuno non ha mai visto un file di log di una mail unix sicuramente non ha idea di quale sia il problema, e probabilmente non ha interesse per questo articolo. Chi invece ha provato a leggere un log di Postfix sa di cosa sto parlando.

Il problema, in poche parole, consiste nel fatto che Postfix, per ogni mail, scrive parecchie linee di log; il numero raddoppia se interviene anche postgrey e opendikim, per cui non è difficile trovare anche 15 linee di log per un’unica mail, magari non sequenziali ma mescolate ad altre linee se le mail che arrivano sono contemporanee.

Fino ad adesso sono sopravvissuto con il mio script, ma un paio di settimane fa un mio cliente ha preso un virus su un PC, il quale ha letto utente e password di mail sul suo client, e ha comunicato i dettagli di connessione a chissà chi sulla rete. Dopo poco tempo il mio server, con il suo account e la sua password, sono diventati un HUB di spam, per cui in un giorno con quell’utente sono state inviate circa 20.000 mail.

Inutile dire che ci sono rimasto malissimo, il mio server è finito sulle liste di spam di mezzo mondo, e per un paio di giorni ho avuto parecchi problemi. Sono riuscito a limitare i danni, e nessuno, a parte il cliente in questione, sembra essersi accorto di nulla, ma io ho dovuto prendere contromisure per limitare i danni ad un ripetersi della cosa.

Per mi sono agganciato ad una serie di liste di RBL, e ho messo in piedi un sistema di monitoraggio con soglia sul numero di mail inviate, e sul numero di host che si autentificano per inviare mail. Forse un domani automatizzerò anche il limite delle mail inviate per client, e un controllo sull’aggiunta di un nuovo client abilitato ad inviare posta, vedremo.

Contestualmente ho deciso di creare un sistema migliore di controllo e analisi dei file di log della mail. Ho cercato molto in rete, ma ho solo trovato sistemi che realizzano statistiche, niente che permettesse l’analisi di dettaglio della singola mail.

Per cui mi sono messo di buona lena, e ho realizzato un software, che ho deciso di rendere pubblico e l’ho messo di GitHub.

Il software è scritto in PHP, e nella versione 0.1 è mooooolto rudimentale, dato che utilizza non solo PHP, ma invoca anche script sh, che a loro volta chiamano una funziona in php…. Sono cosciente che non è presentabile, ma per adesso funziona e assolve alle mie necessità, non ho il tempo materiale di migliorarlo e renderlo più pulito ed elegante.

scs analisi log mail spam

Il meccanismo di base è il seguente:

  • Prima pagina HTML, chiedo se leggere il file di log attuale /var/log/mail.log o tutti i file di log presenti nella /var/log, cioè /var/log/mail.log.*.gz
  • Pagina successiva, legge quello che richiesto, e per ogni linea cerca di fare le seguenti operazioni
    • Interpreta la linea, per mezzo di espressioni regolali, in modo da capire con quale linea ha a che fare; i tipi di linea sono riferiti a messaggi di connessione al sistema da parte di un client o di un server, relativi ad una particolare mail, relativi a messaggi di sistema.
    • Una volta capito il tipo della linea, se e’:
      • Una connessione; se viene aperta crea il programma crea una connessione nuova, se il messaggio si riferisce ad una connessione esistente lo associa a quella connessione.
      • Una mail; con ID univoco. Se non esiste si crea la mail, altrimenti la linea si associa ad una mail precedentemente creata. Se esiste di associa ad una connessione creata in precedenza.
      • Messaggio di sistema, si memorizza in sequenza.
    • Alla fine di questo passaggio abbiamo un array di connessioni con i dati significativi evidenziati, un array di mail, con le relative linee e i valori significativi e un riferimento alla connessione, un insieme di messaggi di sistema.
    • Queste informazioni sono memorizzate (in RAM del server…) e nella pagina HTML successiva viene mostrata una schermata di ricerca, che permette la ricerca di una serie di parametri all’interno dei dati prima individuati. E’ possibile ricercare per
      • Un testo specifico dentro ai campi : ID mail, From, To, Subject o ovunque
      • Avere un filtro che permette di evidenziare le singole mail catalogate sul singolo stato per :
        • Mail con sola connessione di apertura (SPAM!)
        • Mail con un ID ma non chiuse
        • Solo Mail chiuse correttamente
        • Mail NON chiuse correttamente
        • Mail con disconnessione
        • Mail aperte senza disconnessione
        • Solo Mail inviate
        • Solo Mail ricevute
      • E’ inoltre possibile vedere, per ogni mail, oltre che un riassunto, anche tutte le relative linee, e l’interno di come interpreta il php il dato
      • E’ possibile anche vedere il file originale di log, con evidenziate le informazioni significative, e le mail a cui appartengono le linee

Il programma è pubblico, ed e’ disponibile in GitHub al seguente indirizzo.

https://github.com/SCSsas/MAIL

Qua trovate un readme più tecnico e aggiornato, e le spiegazioni per l’installazione

Sono graditi solo suggerimenti intelligenti.

 

Aggiornamento ( 09/05/2017 )

Ho dovuto accettare il fatto che il programma fosse estremamente lento. Ho installato presso un cliente il software, e aveva una gestione dei file di log che ruotavano una volta a settimana. Per cui il file di log conteneva 700.000 linee e circa 70.000 mail.

Ore di elaborazione, e timeout a piu’ non posso. Per cui ho rivisto tutta la piattaforma.

Mi sono dovuto appoggiare ad un supporto esterno per la memorizzazione dei dati, che prima venivano mantenuti in una variabile session del PHP, e finchè erano pochi tutto filava liscio, poi mi scoppiava la RAM in continuazione, per cui ho optato per il salvataggio dei dati temporaneo.

Inizialmente ho provato SQLITE3, soluzione interessante ma molto lenta. Poi ho optato per un salvataggio su file, in formato JSON, e i risultati sono estremamamente interessanti.

Da una sessione all’altra passo pochissimi dati, e alla fine ho velocizzato la procedura in modo molto considerevole.

Attualmente riesco a leggere circa 10.000 linee al secondo, e a gestire in 3 minuti circa 70.000 mail.

Trovate tutto sul link sopra, su GitHub.

© 2018 SCS di Alberto Montanari & C. s.a.s. | Pricacy Policy - Cookie Policy