Logging su Linux: journald, rsyslog e log remoto

Guida moderna al logging Linux: systemd-journald, journalctl, rsyslog, facility/severity, filtri, logger, forwarding TCP con queue, server remoto e troubleshooting.

Nel 2012 era abbastanza naturale spiegare il logging Linux partendo dal “file syslog”. Oggi il quadro è più interessante: sui sistemi con systemd gli eventi passano spesso da systemd-journald, mentre rsyslog continua a essere usato per routing, file tradizionali, filtri e centralizzazione remota.

I due strumenti non sono concorrenti in senso stretto. journald raccoglie e indicizza eventi con metadati strutturati; rsyslog può ricevere i classici messaggi syslog e distribuirli verso file, server remoti e altre destinazioni.

Dal file di testo al journal strutturato

Un file come /var/log/syslog è una sequenza di righe. Il journal di systemd conserva invece campi come unità systemd, PID, UID, executable, facility e priority. Questo permette interrogazioni che non dipendono soltanto da grep.

# ultimi eventi
journalctl -n 100

# segui il journal
journalctl -f

# una unità
journalctl -u ssh
journalctl -u apache2

# intervallo temporale
journalctl --since "today"
journalctl --since "-30 min"

# kernel
journalctl -k

# priorità error o più grave
journalctl -p err

Il journal è persistente?

La persistenza dipende dalla configurazione. Verifichiamo dove systemd-journald sta conservando i dati:

journalctl --disk-usage

grep -E '^[# ]*Storage=' /etc/systemd/journald.conf

Con storage persistente i file journal si trovano normalmente sotto /var/log/journal; con storage volatile sotto /run/log/journal. Se vogliamo mantenere gli eventi attraverso i reboot, la persistenza va verificata esplicitamente.

rsyslog: perché esiste ancora

Rsyslog rimane estremamente utile perché sa filtrare, trasformare e inoltrare eventi con grande flessibilità. La configurazione principale è /etc/rsyslog.conf e le regole locali vengono normalmente aggiunte in /etc/rsyslog.d/*.conf.

systemctl status rsyslog

rsyslogd -N1

rsyslogd -N1 valida la configurazione senza avviare un’altra istanza, ed è il controllo da eseguire prima di ogni restart.

imuxsock o imjournal?

Rsyslog può ricevere messaggi locali tramite il socket syslog con imuxsock oppure leggere direttamente il journal tramite imjournal. La documentazione rsyslog segnala che imjournal è più costoso e serve soprattutto quando abbiamo bisogno dei metadati strutturati del journal; per i normali messaggi syslog, imuxsock è spesso sufficiente.

# esempio minimale
module(load="imuxsock")
module(load="imklog")

action(type="omfile" file="/var/log/syslog")

Facility e severity

Il modello syslog associa un messaggio a una facility, che indica grossolanamente la sorgente logica, e a una severity da debug a emerg.

SeveritySignificato
debugdiagnostica molto dettagliata
infoinformazione normale
noticeevento significativo ma normale
warningsituazione anomala
errerrore
criterrore critico
alertintervento immediato richiesto
emergsistema inutilizzabile

Le facility storiche includono auth, authpriv, cron, daemon, kern, mail, user e local0..local7.

Generare un evento di test

logger -p local0.notice -t sicurezza-reti   "test logging $(hostname)"

journalctl -t sicurezza-reti -n 20

logger è uno degli strumenti più utili per testare una pipeline di logging senza dover aspettare un errore reale.

Separare un’applicazione in un file dedicato

# /etc/rsyslog.d/30-sicurezza-reti.conf

if $programname == 'sicurezza-reti' then {
    action(type="omfile" file="/var/log/sicurezza-reti.log")
    stop
}
rsyslogd -N1
systemctl restart rsyslog

logger -t sicurezza-reti "evento nel file dedicato"
tail -F /var/log/sicurezza-reti.log

Centralizzare i log: perché

Conservare i log soltanto sul server che li genera ha un limite evidente: se la macchina viene compromessa o perde il disco, perdiamo anche parte delle prove. Un log server separato migliora retention, correlazione e resistenza alla cancellazione locale.

Client: forwarding TCP con queue

Su una rete amministrativa privata possiamo iniziare con TCP. La queue disaccoppia l’applicazione locale dal server remoto: se il collector è temporaneamente irraggiungibile, rsyslog conserva gli eventi e ritenta invece di bloccare la pipeline principale.

# /etc/rsyslog.d/90-remote.conf

action(
    type="omfwd"
    protocol="tcp"
    target="10.0.20.50"
    port="514"
    queue.type="linkedList"
    action.resumeRetryCount="-1"
)
rsyslogd -N1
systemctl restart rsyslog

TCP garantisce consegna ordinata a livello di trasporto, ma non cifra il contenuto. Se i log attraversano una rete non fidata utilizziamo TLS o un tunnel/VPN invece del TCP in chiaro.

Server: ricevere i log remoti

# /etc/rsyslog.d/10-remote-server.conf

module(load="imtcp")

template(name="RemoteFile" type="string"
         string="/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log")

ruleset(name="remote") {
    action(type="omfile"
           dynaFile="RemoteFile"
           createDirs="on")
}

input(type="imtcp"
      port="514"
      ruleset="remote")
mkdir -p /var/log/remote

rsyslogd -N1
systemctl restart rsyslog

ss -lntp | grep ':514'

Il firewall del collector deve consentire TCP/514 soltanto dai client autorizzati.

Test end-to-end

# sul client
logger -p local0.notice -t remote-test   "messaggio da $(hostname)"

# sul collector
find /var/log/remote -type f -mmin -5 -print

grep -R "messaggio da" /var/log/remote

UDP 514: quando ha senso?

UDP è semplice e leggero ma non offre conferma di consegna. Può essere adatto a reti locali o apparati molto semplici, ma per eventi importanti preferiamo TCP con queue oppure protocolli affidabili e cifrati.

Log remoto non significa SIEM

Centralizzare i messaggi è soltanto il primo passo. Un SIEM aggiunge normalizzazione, correlazione, regole, ricerca e gestione degli alert. Anche senza un SIEM, però, un collector separato ci permette di confrontare timeline tra server differenti e protegge una copia degli eventi dalla macchina che stiamo investigando.

È il complemento naturale del nostro IR Stack: il watcher produce eventi locali, il logging remoto può conservarne una copia fuori dal sistema sorvegliato.

Troubleshooting

# Validazione
rsyslogd -N1

# Servizi
systemctl status systemd-journald
systemctl status rsyslog

# Porte
ss -lntup | grep 514

# Pacchetti
tcpdump -ni any port 514

# Journal rsyslog
journalctl -u rsyslog -f

Riferimenti

rsyslog basic configuration · rsyslog forwarding logs.