2.4. SNMP Messages Using this Security Model (Messaggi SNMP che utilizzano questo modello di sicurezza)
2.4. SNMP Messages Using this Security Model (Messaggi SNMP che utilizzano questo modello di sicurezza)
Questa sezione descrive il formato e la struttura dei messaggi SNMP quando si utilizza il modello di sicurezza basato sull'utente.
SNMPv3 Message Format (Formato del messaggio SNMPv3)
Un messaggio SNMPv3 che utilizza USM ha la seguente struttura:
SNMPv3Message ::= SEQUENCE {
msgVersion INTEGER (3),
msgGlobalData HeaderData,
msgSecurityParameters OCTET STRING,
msgData ScopedPduData
}
Message Components (Componenti del messaggio)
1. msgVersion (Versione del messaggio)
- Tipo (Type): INTEGER
- Valore (Value): 3 (per SNMPv3)
- Scopo (Purpose): Identifica la versione SNMP
2. msgGlobalData (HeaderData) (Dati del messaggio globale)
Contiene informazioni di intestazione del messaggio globale:
HeaderData ::= SEQUENCE {
msgID INTEGER (0..2147483647),
msgMaxSize INTEGER (484..2147483647),
msgFlags OCTET STRING (SIZE(1)),
msgSecurityModel INTEGER (1..2147483647)
}
Campi (Fields):
-
msgID (ID del messaggio): Identificatore univoco per coordinare messaggi di richiesta e risposta
- Intervallo: da 0 a 2147483647
- Utilizzato dal modello richiesta/risposta per abbinare le risposte alle richieste
-
msgMaxSize (Dimensione massima del messaggio): Dimensione massima del messaggio che il mittente può accettare
- Minimo: 484 ottetti
- Utilizzato per la negoziazione della dimensione del messaggio
-
msgFlags (Flag del messaggio): OCTET STRING di 1 ottetto contenente flag di bit
- Bit 0 (LSB):
authFlag- 1 se viene utilizzata l'autenticazione, altrimenti 0 - Bit 1:
privFlag- 1 se viene utilizzata la privacy (crittografia), altrimenti 0 - Bit 2:
reportableFlag- 1 se deve essere inviato un Report-PDU in caso di errore - Bit 3-7: Riservati, devono essere zero
- Bit 0 (LSB):
-
msgSecurityModel (Modello di sicurezza del messaggio): Identifica il modello di sicurezza in uso
- Valore: 3 per il modello di sicurezza basato sull'utente (USM)
3. msgSecurityParameters (Parametri di sicurezza del messaggio)
Per l'USM, questo è un OCTET STRING contenente i UsmSecurityParameters codificati in BER:
UsmSecurityParameters ::= SEQUENCE {
msgAuthoritativeEngineID OCTET STRING,
msgAuthoritativeEngineBoots INTEGER (0..2147483647),
msgAuthoritativeEngineTime INTEGER (0..2147483647),
msgUserName OCTET STRING (SIZE(0..32)),
msgAuthenticationParameters OCTET STRING,
msgPrivacyParameters OCTET STRING
}
Campi (Fields):
-
msgAuthoritativeEngineID (ID del motore autorevole): Lo snmpEngineID del motore SNMP autorevole
- Per le richieste: L'engineID del risponditore di comandi
- Per le notifiche: L'engineID dell'iniziatore della notifica
- Per le risposte: L'engineID del risponditore di comandi
- Per i rapporti: L'engineID del mittente del rapporto
-
msgAuthoritativeEngineBoots (Avvii del motore autorevole): Contatore di avvio del motore autorevole
- Intervallo: da 0 a 2147483647
- Incrementato quando il motore si reinizializza
- Utilizzato per la protezione dal replay
-
msgAuthoritativeEngineTime (Tempo del motore autorevole): Numero di secondi dall'ultimo avvio
- Intervallo: da 0 a 2147483647
- Incrementato ogni secondo
- Utilizzato per la protezione dal replay e la verifica della finestra temporale
-
msgUserName (Nome utente): L'utente (principale) per conto del quale viene inviato il messaggio
- Lunghezza: da 0 a 32 ottetti
- Deve esistere nella usmUserTable del motore autorevole
- Distinzione tra maiuscole e minuscole
-
msgAuthenticationParameters (Parametri di autenticazione): Digest di autenticazione
- La lunghezza dipende dal protocollo di autenticazione:
- HMAC-MD5-96: 12 ottetti
- HMAC-SHA-96: 12 ottetti
- Vuoto (lunghezza zero) se nessuna autenticazione
- Calcolato sull'intero messaggio (con questo campo inizialmente impostato a zeri)
- La lunghezza dipende dal protocollo di autenticazione:
-
msgPrivacyParameters (Parametri di privacy): Parametri del protocollo di privacy
- Per CBC-DES: 8 ottetti (valore salt)
- Vuoto (lunghezza zero) se nessuna privacy
- Utilizzato per garantire vettori di inizializzazione di cifratura diversi
4. msgData (ScopedPduData) (Dati del messaggio)
Il payload del messaggio, che può essere in chiaro o crittografato:
ScopedPduData ::= CHOICE {
plaintext ScopedPDU,
encryptedPDU OCTET STRING
}
Quando la privacy NON viene utilizzata (privFlag = 0):
- msgData contiene
plaintext ScopedPDU(testo in chiaro)
Quando la privacy viene utilizzata (privFlag = 1):
- msgData contiene
encryptedPDU(OCTET STRING) - I dati crittografati sono lo ScopedPDU codificato in BER
ScopedPDU Format (Formato ScopedPDU)
ScopedPDU ::= SEQUENCE {
contextEngineID OCTET STRING,
contextName OCTET STRING,
data ANY -- PDU from RFC 3416
}
Campi (Fields):
-
contextEngineID (ID del motore di contesto): Lo snmpEngineID per il contesto
- Tipicamente uguale a msgAuthoritativeEngineID per scenari non-proxy
- Può differire negli scenari proxy
-
contextName (Nome del contesto): Il nome del contesto
- Utilizzato con contextEngineID per identificare le informazioni di gestione
- Abilita più contesti SNMP virtuali su un singolo motore
-
data (dati): Il PDU SNMP effettivo
- GetRequest, GetNextRequest, GetBulkRequest, SetRequest, InformRequest, SNMPv2-Trap, Response o Report
Security Level Combinations (Combinazioni di livelli di sicurezza)
I msgFlags determinano tre livelli di sicurezza:
-
noAuthNoPriv (nessuna autenticazione né privacy):
authFlag=0, privFlag=0- Nessuna autenticazione, nessuna privacy
- msgAuthenticationParameters è vuoto
- msgPrivacyParameters è vuoto
- msgData è in chiaro
-
authNoPriv (autenticazione senza privacy):
authFlag=1, privFlag=0- Autenticazione senza privacy
- msgAuthenticationParameters contiene il digest
- msgPrivacyParameters è vuoto
- msgData è in chiaro
-
authPriv (autenticazione con privacy):
authFlag=1, privFlag=1- Autenticazione e privacy
- msgAuthenticationParameters contiene il digest
- msgPrivacyParameters contiene i parametri di privacy
- msgData è crittografato
Nota: La privacy senza autenticazione (authFlag=0, privFlag=1) non è consentita. Tali messaggi devono essere rifiutati.
Message Flow Examples (Esempi di flusso dei messaggi)
Esempio 1: Richiesta di scoperta noAuthNoPriv
SNMPv3Message {
msgVersion: 3,
msgGlobalData: {
msgID: 12345,
msgMaxSize: 65507,
msgFlags: 0x04 (reportableFlag impostato),
msgSecurityModel: 3
},
msgSecurityParameters: {
msgAuthoritativeEngineID: "",
msgAuthoritativeEngineBoots: 0,
msgAuthoritativeEngineTime: 0,
msgUserName: "",
msgAuthenticationParameters: "",
msgPrivacyParameters: ""
},
msgData: plaintext ScopedPDU {
contextEngineID: "",
contextName: "",
data: GetRequest-PDU
}
}
Esempio 2: Richiesta autenticata e crittografata authPriv
SNMPv3Message {
msgVersion: 3,
msgGlobalData: {
msgID: 12346,
msgMaxSize: 65507,
msgFlags: 0x07 (authFlag, privFlag, reportableFlag),
msgSecurityModel: 3
},
msgSecurityParameters: {
msgAuthoritativeEngineID: 0x80001F8880...,
msgAuthoritativeEngineBoots: 15,
msgAuthoritativeEngineTime: 3045678,
msgUserName: "admin",
msgAuthenticationParameters: 0x9F3B7A2E... (12 ottetti),
msgPrivacyParameters: 0x0000000012345678 (8 ottetti)
},
msgData: encryptedPDU (ScopedPDU crittografato)
}
Message Size Considerations (Considerazioni sulla dimensione del messaggio)
La dimensione minima del messaggio che le implementazioni devono supportare è 484 ottetti. Questo garantisce:
- Spazio per le intestazioni del messaggio
- Almeno contenuto PDU minimo
- Parametri di sicurezza incluso il digest di autenticazione
Le implementazioni dovrebbero supportare messaggi più grandi (ad esempio, 65507 ottetti per UDP su IPv4) per ospitare:
- Binding di variabili di grandi dimensioni
- Risposte GetBulk con molti elementi
- Messaggi crittografati con overhead di padding
Special Message Cases (Casi di messaggi speciali)
Report Messages (Messaggi di rapporto)
I Report-PDU sono risposte speciali utilizzate per la notifica di errori e lo scambio di informazioni (scoperta, sincronizzazione temporale). Essi:
- Possono essere inviati senza autenticazione (per la scoperta)
- Possono essere inviati con autenticazione (per altri errori)
- Contengono un singolo binding di variabile con un OID di contatore di errori
- Utilizzano il msgID dal messaggio che ha causato il rapporto
Notification Messages (Messaggi di notifica)
Per i PDU InformRequest e SNMPv2-Trap:
- L'iniziatore della notifica (notification originator) è il motore autorevole
- msgAuthoritativeEngineID è l'engineID dell'iniziatore
- Il ricevitore della notifica deve memorizzare nella cache i valori temporali dell'iniziatore
Questo è l'opposto del modello del risponditore di comandi, dove il risponditore di comandi è autorevole.