3.2. Processing an Incoming SNMP Message (Elaborazione di un messaggio SNMP in arrivo)
3.2. Processing an Incoming SNMP Message (Elaborazione di un messaggio SNMP in arrivo)
Questa sezione descrive la procedura seguita da un motore SNMP ogni volta che riceve un messaggio contenente un'operazione di gestione per conto di un utente, con un particolare securityLevel.
General Notes (Note generali)
Per semplificare gli elementi di procedura, il rilascio delle informazioni di stato non è sempre specificato esplicitamente. Come regola generale, se le informazioni di stato sono disponibili quando un messaggio viene scartato, le informazioni di stato dovrebbero anche essere rilasciate.
Inoltre, un'indicazione di errore può restituire:
- Un OID e un valore per un contatore incrementato
- Facoltativamente un valore per securityLevel
- Valori per contextEngineID o contextName per il contatore
- I dati securityStateReference se tali informazioni sono disponibili nel punto in cui viene rilevato l'errore
Passaggio 1: Analizzare securityParameters (Parse securityParameters)
Se i securityParameters ricevuti non sono la serializzazione (secondo le convenzioni di RFC 3417) di un OCTET STRING formattato secondo gli UsmSecurityParameters definiti nella sezione 2.4, allora:
- Il contatore snmpInASNParseErrs (RFC 3418) viene incrementato
- Viene restituita un'indicazione di errore (parseError) al modulo chiamante
Nota: Ritorniamo senza l'OID e il valore del contatore incrementato, perché in questo caso non ci sono sufficienti informazioni per generare un Report PDU.
Passaggio 2: Estrarre i parametri di sicurezza (Extract Security Parameters)
I valori dei campi dei parametri di sicurezza vengono estratti dai securityParameters.
- Il securityEngineID da restituire al chiamante è il valore del campo msgAuthoritativeEngineID
- I cachedSecurityData vengono preparati e viene preparato un securityStateReference per fare riferimento a questi dati
Valori da memorizzare nella cache (Values to be cached):
- msgUserName
- msgAuthoritativeEngineID
- msgAuthoritativeEngineBoots
- msgAuthoritativeEngineTime
- msgAuthenticationParameters
- msgPrivacyParameters
Passaggio 3: Verificare msgAuthoritativeEngineID (Check msgAuthoritativeEngineID)
Se il valore del campo msgAuthoritativeEngineID nei securityParameters è sconosciuto, allora:
Opzione a) Modalità scoperta (motore non autorevole) (Discovery Mode)
Un motore SNMP non autorevole che esegue la scoperta può opzionalmente creare una nuova voce nel suo datastore di configurazione locale (LCD) e continuare l'elaborazione.
Opzione b) Restituire errore (Return Error)
Il contatore usmStatsUnknownEngineIDs viene incrementato, e viene restituita un'indicazione di errore (unknownEngineID) insieme all'OID e al valore del contatore incrementato al modulo chiamante.
Nota: Nel caso in cui venga ricevuto un msgAuthoritativeEngineID di lunghezza zero o di altra dimensione illegale, l'opzione b) dovrebbe essere scelta per facilitare la scoperta dell'engineID. Altrimenti la scelta tra a) e b) è una questione di implementazione.
Passaggio 4: Cercare le informazioni utente (Lookup User Information)
Le informazioni sui valori dei campi msgUserName e msgAuthoritativeEngineID vengono estratte dal datastore di configurazione locale (LCD, usmUserTable).
Se non sono disponibili informazioni per l'utente, allora:
- Il contatore usmStatsUnknownUserNames viene incrementato
- Viene restituita un'indicazione di errore (unknownSecurityName) insieme all'OID e al valore del contatore incrementato al modulo chiamante
Passaggio 5: Verificare il supporto del livello di sicurezza (Check Security Level Support)
Se le informazioni sull'utente indicano che non supporta il securityLevel richiesto dal chiamante, allora:
- Il contatore usmStatsUnsupportedSecLevels viene incrementato
- Viene restituita un'indicazione di errore (unsupportedSecurityLevel) insieme all'OID e al valore del contatore incrementato al modulo chiamante
Passaggio 6: Autenticare il messaggio (se necessario) (Authenticate Message)
Se il securityLevel specifica che il messaggio deve essere autenticato, allora il messaggio viene autenticato secondo il protocollo di autenticazione dell'utente.
Per farlo, viene effettuata una chiamata al modulo di autenticazione che implementa il protocollo di autenticazione dell'utente secondo la primitiva di servizio astratta:
statusInformation = -- successo o fallimento
authenticateIncomingMsg(
IN authKey -- authKey localizzata dell'utente
IN authParameters -- come ricevuto sulla rete
IN wholeMsg -- come ricevuto sulla rete
OUT authenticatedWholeMsg -- controllato per l'autenticazione
)
Parametri (Parameters):
-
statusInformation: Indica se l'autenticazione ha avuto successo o meno
-
authKey: L'authKey privata localizzata dell'utente è la chiave segreta che può essere utilizzata dall'algoritmo di autenticazione
-
authParameters: I msgAuthenticationParameters come ricevuti nel messaggio
-
wholeMsg: Il messaggio serializzato completo da autenticare
-
authenticatedWholeMsg: Uguale all'input fornito al servizio authenticateIncomingMsg, ma dopo che l'autenticazione è stata verificata
Gestione degli errori (Error Handling):
Se il modulo di autenticazione restituisce un fallimento, allora il messaggio non può essere fidato, quindi:
- Il contatore usmStatsWrongDigests viene incrementato
- Viene restituita un'indicazione di errore (authenticationFailure) insieme all'OID e al valore del contatore incrementato al modulo chiamante
Se il modulo di autenticazione restituisce successo, allora il messaggio è autentico e può essere fidato, quindi l'elaborazione continua.
Passaggio 7: Verificare la finestra temporale (per messaggi autenticati) (Check Time Window)
Se il securityLevel indica un messaggio autenticato, allora i valori locali di snmpEngineBoots, snmpEngineTime e latestReceivedEngineTime corrispondenti al valore del campo msgAuthoritativeEngineID vengono estratti dal datastore di configurazione locale.
7a) Motore autorevole (msgAuthoritativeEngineID == snmpEngineID locale)
Se il valore estratto di msgAuthoritativeEngineID è uguale al valore di snmpEngineID del motore SNMP di elaborazione (il che significa che questo è il motore SNMP autorevole), allora se una delle seguenti condizioni è vera, il messaggio è considerato al di fuori della finestra temporale:
-
Il valore locale di snmpEngineBoots è 2147483647 (valore massimo raggiunto)
-
Il valore del campo msgAuthoritativeEngineBoots differisce dal valore locale di snmpEngineBoots
-
Il valore del campo msgAuthoritativeEngineTime differisce dalla nozione locale di snmpEngineTime di più di +/- 150 secondi
Se al di fuori della finestra temporale:
- Il contatore usmStatsNotInTimeWindows viene incrementato
- Viene restituita un'indicazione di errore (notInTimeWindow) insieme all'OID, al valore del contatore incrementato, e un'indicazione che l'errore deve essere segnalato con un securityLevel di authNoPriv, al modulo chiamante
7b) Motore non autorevole (msgAuthoritativeEngineID != snmpEngineID locale)
Se il valore estratto di msgAuthoritativeEngineID non è uguale al valore snmpEngineID del motore SNMP di elaborazione (il che significa che questo non è il motore SNMP autorevole), allora:
7b.1) Aggiornare le informazioni temporali (se più recenti) (Update Time Information)
Se almeno una delle seguenti condizioni è vera:
-
Il valore estratto del campo msgAuthoritativeEngineBoots è maggiore di la nozione locale del valore di snmpEngineBoots; OPPURE
-
Il valore estratto del campo msgAuthoritativeEngineBoots è uguale a la nozione locale del valore di snmpEngineBoots, E il valore estratto del campo msgAuthoritativeEngineTime è maggiore di il valore di latestReceivedEngineTime
Allora la voce LCD corrispondente al valore estratto del campo msgAuthoritativeEngineID viene aggiornata, impostando:
- La nozione locale del valore di snmpEngineBoots al valore del campo msgAuthoritativeEngineBoots
- La nozione locale del valore di snmpEngineTime al valore del campo msgAuthoritativeEngineTime
- Il latestReceivedEngineTime al valore del campo msgAuthoritativeEngineTime
7b.2) Verificare la finestra temporale (Check Time Window)
Se una delle seguenti condizioni è vera, allora il messaggio è considerato al di fuori della finestra temporale:
-
La nozione locale del valore di snmpEngineBoots è 2147483647
-
Il valore del campo msgAuthoritativeEngineBoots è inferiore a la nozione locale del valore di snmpEngineBoots
-
Il valore del campo msgAuthoritativeEngineBoots è uguale a la nozione locale del valore di snmpEngineBoots E il valore del campo msgAuthoritativeEngineTime è di più di 150 secondi inferiore alla nozione locale del valore di snmpEngineTime
Se al di fuori della finestra temporale:
- Il contatore usmStatsNotInTimeWindows viene incrementato
- Viene restituita un'indicazione di errore (notInTimeWindow) insieme all'OID e al valore del contatore incrementato al modulo chiamante
Passaggio 8: Decrittografare il messaggio (se necessario) (Decrypt Message)
Se il securityLevel indica che il messaggio è protetto dalla divulgazione (privacy), allora l'OCTET STRING che rappresenta l'encryptedPDU viene decrittografato secondo il protocollo di privacy dell'utente.
Per farlo, viene effettuata una chiamata al modulo di privacy che implementa il protocollo di privacy dell'utente secondo la primitiva di servizio astratta:
statusInformation = -- successo o fallimento
decryptData(
IN decryptKey -- privKey localizzata dell'utente
IN privParameters -- come ricevuto sulla rete
IN encryptedData -- encryptedPDU come ricevuto
OUT decryptedData -- scopedPDU decrittografato
)
Parametri (Parameters):
-
statusInformation: Indica se il processo di decrittografia ha avuto successo o meno
-
decryptKey: La privKey privata localizzata dell'utente è la chiave segreta utilizzata dall'algoritmo di decrittografia
-
privParameters: I msgPrivacyParameters come ricevuti nel messaggio
-
encryptedData: L'encryptedPDU dal messaggio
-
decryptedData: Lo scopedPDU decrittografato
Gestione degli errori (Error Handling):
Se il modulo di privacy restituisce un fallimento, allora il messaggio non può essere elaborato, quindi:
- Il contatore usmStatsDecryptionErrors viene incrementato
- Viene restituita un'indicazione di errore (decryptionError) insieme all'OID e al valore del contatore incrementato al modulo chiamante
Se il modulo di privacy restituisce successo, allora lo scopedPDU decrittografato viene utilizzato per ulteriore elaborazione.
Passaggio 9: Restituire i risultati (Return Results)
I seguenti valori vengono restituiti al modulo di elaborazione dei messaggi chiamante:
- securityEngineID: Il msgAuthoritativeEngineID
- securityName: Il msgUserName
- scopedPDU: Sia lo scopedPDU decrittografato (se privacy) sia lo scopedPDU in chiaro
- maxSizeResponseScopedPDU: Calcolato in base ai vincoli di dimensione del messaggio
- securityStateReference: Riferimento ai dati di sicurezza memorizzati nella cache
Processing Flow Summary (Riepilogo del flusso di elaborazione)
1. Analizzare securityParameters
2. Estrarre campi parametri di sicurezza
3. Verificare msgAuthoritativeEngineID (sconosciuto -> errore o creare voce)
4. Cercare utente in LCD (utente sconosciuto -> errore)
5. Verificare supporto livello sicurezza (non supportato -> errore)
6. Autenticare messaggio (se authNoPriv o authPriv)
└─> Verificare MAC/digest (errato -> errore)
7. Verificare finestra temporale (se autenticato)
└─> Per autorevole: validare boots e time
└─> Per non autorevole: aggiornare info temporali se più recenti, poi validare
└─> Fuori finestra -> errore
8. Decrittografare messaggio (se authPriv)
└─> Decrittografare encryptedPDU (fallito -> errore)
9. Restituire securityEngineID, securityName, scopedPDU, ecc.
Error Conditions Summary (Riepilogo delle condizioni di errore)
| Errore (Error) | Contatore (Counter) | Condizione (Condition) |
|---|---|---|
| parseError | snmpInASNParseErrs | Formato securityParameters non valido |
| unknownEngineID | usmStatsUnknownEngineIDs | msgAuthoritativeEngineID sconosciuto |
| unknownSecurityName | usmStatsUnknownUserNames | Utente non trovato in LCD |
| unsupportedSecurityLevel | usmStatsUnsupportedSecLevels | L'utente non supporta il livello richiesto |
| authenticationFailure | usmStatsWrongDigests | Verifica autenticazione fallita |
| notInTimeWindow | usmStatsNotInTimeWindows | Messaggio fuori finestra di 150 secondi |
| decryptionError | usmStatsDecryptionErrors | Decrittografia fallita |
Implementation Notes (Note di implementazione)
-
Gestione dello stato (State Management): Le implementazioni dovrebbero gestire e rilasciare correttamente i dati securityStateReference
-
Generazione di rapporti (Report Generation): Molti errori comportano l'invio di Report PDU con contatori di errore appropriati al mittente
-
Sincronizzazione temporale (Time Synchronization): I motori non autorevoli aggiornano automaticamente le loro informazioni temporali quando ricevono messaggi con valori temporali più recenti dai motori autorevoli
-
Scoperta (Discovery): I motori non autorevoli possono opzionalmente apprendere di nuovi motori creando voci LCD durante la scoperta
-
Livello di sicurezza nei rapporti (Security Level in Reports): L'errore notInTimeWindow deve essere segnalato con securityLevel authNoPriv (non authPriv) per consentire al mittente di ricevere ed elaborare il rapporto