Appendice A. Linee guida per gli implementatori
Questa appendice fornisce indicazioni non normative agli implementatori del protocollo syslog.
A.1. Relazione con BSD Syslog
RFC 3164 descriveva il protocollo BSD syslog, distribuito ampiamente per molti anni. Questo documento rende obsoleta RFC 3164, mantenendo tuttavia una significativa compatibilità.
Differenze principali:
- Campo VERSION: questa specifica aggiunge un campo VERSION esplicito, che le implementazioni legacy non riconoscono.
- Formato TIMESTAMP: questa specifica usa timestamp RFC 3339 con data completa, fuso orario e secondi frazionari facoltativi. RFC 3164 usava un formato più semplice, privo di anno e fuso orario.
- STRUCTURED-DATA: questa specifica introduce elementi di dati strutturati; RFC 3164 non aveva un meccanismo equivalente.
- Formato MSG: il campo TAG di RFC 3164 è suddiviso nei campi APP-NAME, PROCID e MSGID dell'HEADER.
Considerazioni di interoperabilità:
Quando si comunica con sistemi RFC 3164:
- Invio a sistemi legacy: formattare i messaggi secondo RFC 3164 se il ricevitore non supporta questa specifica. Il transport sender dovrebbe rilevare le capacità del ricevitore o consentire la configurazione.
- Ricezione da sistemi legacy: i receiver conformi a questa specifica dovrebbero poter analizzare i messaggi RFC 3164 e possono trasformarli nel formato qui definito.
- Comportamento dei relay: i relay possono dover trasformare messaggi tra formati. Nel convertire da questa specifica a RFC 3164:
- rimuovere il campo VERSION;
- convertire TIMESTAMP nel formato MMM DD HH:MM:SS;
- eliminare il fuso orario e l'anno;
- rimuovere STRUCTURED-DATA o aggiungerlo a MSG;
- ricostruire TAG da APP-NAME e PROCID.
- Conversione di RFC 3164 in questa specifica:
- impostare VERSION a 1;
- aggiungere l'anno corrente al timestamp;
- usare il fuso orario del relay oppure UTC;
- analizzare TAG in APP-NAME e PROCID, secondo il miglior sforzo;
- impostare MSGID a NILVALUE se non determinabile.
A.2. Lunghezza del messaggio
La capacità minima richiesta di 480 ottetti per il receiver ha implicazioni pratiche.
Perché 480 ottetti?
- un singolo pacchetto UDP senza frammentazione in molte reti;
- maggiore probabilità di consegna nelle reti degradate;
- compatibilità con implementazioni limitate.
Implicazioni:
- Messaggi critici: gli avvisi di sicurezza e le emergenze operative dovrebbero rientrare in 480 ottetti;
- Dati per la risoluzione dei problemi: mantenere compatti i messaggi diagnostici;
- Dati importanti per primi: collocare le informazioni critiche all'inizio del messaggio.
Messaggi più grandi:
Molte distribuzioni moderne supportano messaggi molto più grandi:
- il trasporto TLS consente in genere decine o centinaia di kilobyte;
- il trasporto TCP non ha un limite pratico di dimensione;
- le implementazioni moderne supportano spesso messaggi di 2048, 8192 ottetti o più.
Buone pratiche:
- configurare le dimensioni massime in base ai requisiti della distribuzione;
- usare STRUCTURED-DATA per metadati importanti, conteggiati nella lunghezza del messaggio;
- testare le dimensioni massime nel proprio ambiente;
- gestire correttamente i messaggi sovradimensionati, tramite troncamento o rifiuto;
- monitorare i messaggi troncati presso i collector.
Considerazioni su UTF-8:
La lunghezza del messaggio è misurata in ottetti, non in caratteri. Una stringa UTF-8 di 1000 caratteri può occupare 3000 o più ottetti se contiene caratteri non ASCII. Gli implementatori devono tenerne conto nel dimensionamento dei messaggi.
A.3. Valori di Severity
L'uso corretto dei valori Severity migliora l'utilità dei messaggi.
Linee guida:
- Emergency (0): usare con parsimonia per emergenze reali.
- Il sistema è completamente inutilizzabile.
- È imminente il guasto di hardware critico.
- È in corso una perdita di dati.
- Alert (1): è richiesta un'azione immediata.
- Interruzione del servizio.
- Rilevata violazione della sicurezza.
- Imminente esaurimento di una risorsa critica.
- Critical (2): condizioni critiche.
- Guasto del disco rigido.
- Persa la connessione di rete primaria.
- Arresto anomalo dell'applicazione.
- Error (3): condizioni di errore.
- Guasti di servizi non critici.
- Errori recuperabili.
- Timeout di connessione.
- Warning (4): condizioni di avviso.
- Utilizzo delle risorse vicino ai limiti.
- Uso di funzionalità deprecate.
- Problemi di configurazione.
- Notice (5): condizione normale ma significativa.
- Avvio o arresto di servizio.
- Modifiche di configurazione.
- Eventi normali rilevanti per la sicurezza.
- Informational (6): messaggi informativi.
- Operazioni di routine.
- Messaggi di stato.
- Instaurazione di connessioni.
- Debug (7): messaggi di livello debug.
- Informazioni diagnostiche dettagliate.
- Messaggi destinati agli sviluppatori.
- Dovrebbero essere disabilitati in produzione.
Considerazioni di configurazione:
Consentire agli amministratori di:
- adattare le assegnazioni Severity alle esigenze della distribuzione;
- filtrare i messaggi per Severity;
- instradare le gravità verso collector diversi;
- sovrascrivere la Severity per tipi di messaggio specifici.
Evitare l'abuso di Severity:
- non contrassegnare tutti i messaggi come Emergency;
- non usare Severity Debug per eventi di produzione;
- considerare l'affaticamento da avvisi degli operatori.
A.4. Precisione di TIME-SECFRAC
Il campo TIMESTAMP supporta secondi frazionari fino a 6 cifre, cioè microsecondi.
Errori comuni:
Omissione degli zeri iniziali:
ERRATO: 2003-10-11T22:13:14.3 (sembra essere 300 ms)
CORRETTO: 2003-10-11T22:13:14.003 (in realtà 3 ms)
Raccomandazioni di precisione:
- usare millisecondi, 3 cifre, per la maggior parte delle applicazioni;
- usare microsecondi, 6 cifre, per temporizzazioni ad alta precisione;
- omettere i secondi frazionari se non serve precisione sotto il secondo;
- assicurarsi che la sincronizzazione temporale, NTP, supporti la precisione richiesta.
Note di implementazione:
Non tutti i sistemi possono fornire precisione al microsecondo. È accettabile:
- fornire meno di 6 cifre di precisione;
- arrotondare o troncare alla precisione disponibile;
- omettere completamente TIME-SECFRAC se la precisione non è disponibile.
A.5. Convenzione delle maiuscole per i nomi
Questo documento usa "lower camel case" per SD-ID e PARAM-NAME.
Convenzione:
- prima lettera minuscola;
- iniziale maiuscola per le parole successive;
- nessun trattino né carattere di sottolineatura.
Esempi:
timeQualitysyncAccuracyenterpriseIdmyCompanyName
Vantaggi:
- coerenza tra le implementazioni;
- leggibilità;
- compatibilità con diversi linguaggi di programmazione.
Raccomandazioni:
Usare questa convenzione per:
- nuovi SD-ID;
- PARAM-NAME;
- identificatori di estensione.
Le implementazioni private possono adottare altre convenzioni, ma la coerenza è raccomandata.
A.6. Applicazioni syslog senza conoscenza dell'ora
La sezione 6.2.3 consente NILVALUE per TIMESTAMP quando l'ora non è nota.
Quando usare NILVALUE per TIMESTAMP:
- sistemi incorporati senza orologio in tempo reale;
- messaggi in fase di avvio prima della sincronizzazione temporale;
- sistemi in cui il recupero dell'ora è fallito.
Quando NON usare NILVALUE:
- quando il sistema operativo fornisce funzioni temporali;
- quando un'implementazione pigra vuole evitare la gestione dell'ora;
- quando l'ora è disponibile ma scomoda da ottenere.
Buone pratiche:
- emettere TIMESTAMP validi ogni volta che sia possibile;
- usare NILVALUE solo se è davvero impossibile ottenere l'ora;
- valutare il compromesso tra fuso orario e precisione;
- documentare la gestione del tempo nell'implementazione.
Gestione dei relay:
I relay che ricevono messaggi con TIMESTAMP NILVALUE possono:
- inoltrarli senza modifiche;
- sostituirlo con l'ora corrente del relay;
- scartare i messaggi, se la policy richiede timestamp.
La configurazione dovrebbe controllare questo comportamento.
A.7. Note sull'SD-ID timeQuality
L'SD-ID timeQuality fornisce metadati utili sulla precisione del timestamp.
Parametro tzKnown:
Il valore predefinito dovrebbe essere 0 (sconosciuto), salvo che:
- l'amministratore abbia configurato esplicitamente il fuso orario;
- il sistema operativo fornisca informazioni affidabili sul fuso orario;
- il sistema abbia convalidato il fuso orario rispetto a una fonte esterna.
Parametro isSynced:
Impostarlo a 1 solo quando:
- NTP o altra sincronizzazione temporale è attiva;
- la sincronizzazione è stata verificata con successo;
- la fonte temporale è attendibile.
Parametro syncAccuracy:
Fornirlo solo quando:
- la precisione effettiva è nota, dalle statistiche NTP;
- l'amministratore ha configurato la precisione prevista;
- i dati di misurazione supportano l'affermazione.
Non sovrastimare la precisione:
Una precisione falsa danneggia la fiducia nei log. È preferibile:
- omettere completamente timeQuality se si è incerti;
- fornire stime prudenti della precisione;
- documentare le dichiarazioni di precisione.
A.8. Codifica UTF-8 e BOM
Il BOM (Byte Order Mark) segnala la codifica UTF-8 nel campo MSG.
Dettagli del BOM:
- sequenza di byte: 0xEF 0xBB 0xBF;
- appare all'inizio del campo MSG;
- indica che segue una codifica UTF-8.
Quando includere il BOM:
- quando MSG contiene testo codificato in UTF-8;
- quando esiste certezza della codifica UTF-8;
- per coerenza con la policy dell'organizzazione.
Quando omettere il BOM:
- quando la codifica di MSG è sconosciuta o incerta;
- quando MSG contiene dati binari;
- per compatibilità con sistemi che non gestiscono il BOM.
Gestione del receiver:
I receiver dovrebbero:
- rilevare la presenza del BOM;
- elaborare di conseguenza UTF-8;
- gestire i messaggi senza BOM assumendo una codifica sconosciuta;
- non visualizzare il BOM agli utenti finali.
Gestione dei relay:
I relay che inoltrano messaggi dovrebbero:
- conservare il BOM se presente;
- non aggiungere il BOM salvo transcodifica in UTF-8;
- non rimuovere il BOM salvo transcodifica in un'altra codifica.