Passa al contenuto principale

3.1. Generating an Outgoing SNMP Message (Generazione di un messaggio SNMP in uscita)

3.1. Generating an Outgoing SNMP Message (Generazione di un messaggio SNMP in uscita)

Questa sezione descrive la procedura seguita da un motore SNMP ogni volta che genera un messaggio contenente un'operazione di gestione (come una richiesta, una risposta, una notifica o un rapporto) per conto di un utente, con un particolare securityLevel.

Passaggio 1: Determinare le informazioni utente (Determine User Information)

1a) Messaggio di risposta o rapporto (Response or Report Message)

Se viene passato un securityStateReference (messaggio di risposta o rapporto), le informazioni riguardanti l'utente vengono estratte dai cachedSecurityData. I cachedSecurityData possono ora essere scartati.

  • Il securityEngineID è impostato sullo snmpEngineID locale
  • Il securityLevel è impostato sul valore specificato dal modulo chiamante

1b) Messaggio di richiesta o notifica (Request or Notification Message)

Altrimenti, in base al securityName, le informazioni riguardanti l'utente presso lo snmpEngineID di destinazione, specificato dal securityEngineID, vengono estratte dal datastore di configurazione locale (LCD, usmUserTable).

Se le informazioni sull'utente sono assenti dal LCD, viene restituita un'indicazione di errore (unknownSecurityName) al modulo chiamante.

Passaggio 2: Verificare il supporto della privacy (Check Privacy Support)

Se il securityLevel specifica che il messaggio deve essere protetto dalla divulgazione, ma l'utente non supporta sia un protocollo di autenticazione che un protocollo di privacy, il messaggio non può essere inviato.

Viene restituita un'indicazione di errore (unsupportedSecurityLevel) al modulo chiamante.

Nota: La privacy (crittografia) richiede l'autenticazione. La combinazione noAuth + privacy non è consentita.

Passaggio 3: Verificare il supporto dell'autenticazione (Check Authentication Support)

Se il securityLevel specifica che il messaggio deve essere autenticato, ma l'utente non supporta un protocollo di autenticazione, il messaggio non può essere inviato.

Viene restituita un'indicazione di errore (unsupportedSecurityLevel) al modulo chiamante.

Passaggio 4: Crittografare il messaggio (se necessario) (Encrypt the Message)

4a) Con privacy (authPriv)

Se il securityLevel specifica che il messaggio deve essere protetto dalla divulgazione, la sequenza di ottetti che rappresenta lo scopedPDU serializzato viene crittografata 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 astratta:

statusInformation =       -- successo o fallimento
encryptData(
IN encryptKey -- privKey localizzata dell'utente
IN dataToEncrypt -- scopedPDU serializzato
OUT encryptedData -- encryptedPDU serializzato
OUT privParameters -- parametri di privacy serializzati
)

Parametri (Parameters):

  • statusInformation: Indica se il processo di crittografia ha avuto successo o meno

  • encryptKey: La privKey privata localizzata dell'utente è la chiave segreta che può essere utilizzata dall'algoritmo di crittografia

  • dataToEncrypt: Lo scopedPDU serializzato sono i dati da crittografare

  • encryptedData: L'encryptedPDU rappresenta lo scopedPDU crittografato, codificato come OCTET STRING

  • privParameters: I parametri di privacy, codificati come OCTET STRING

Gestione degli errori (Error Handling):

Se il modulo di privacy restituisce un fallimento, il messaggio non può essere inviato e viene restituita un'indicazione di errore (encryptionError) al modulo chiamante.

Se il modulo di privacy restituisce successo, allora:

  • I privParameters restituiti vengono inseriti nel campo msgPrivacyParameters dei securityParameters
  • L'encryptedPDU funge da payload del messaggio in preparazione

4b) Senza privacy (noAuthNoPriv o authNoPriv)

Se il securityLevel specifica che il messaggio non deve essere protetto dalla divulgazione, allora:

  • Un OCTET STRING di lunghezza zero viene codificato nel campo msgPrivacyParameters dei securityParameters
  • Lo scopedPDU in chiaro funge da payload del messaggio in preparazione

Passaggio 5: Impostare msgAuthoritativeEngineID

Il securityEngineID viene codificato come OCTET STRING nel campo msgAuthoritativeEngineID dei securityParameters.

Nota: Un securityEngineID vuoto (lunghezza zero) è accettabile per un messaggio di richiesta, poiché ciò farà sì che il motore SNMP remoto (autorevole) restituisca un Report PDU con il securityEngineID appropriato incluso nel msgAuthoritativeEngineID nei securityParameters di quel Report PDU restituito. Questo fa parte del meccanismo di scoperta.

Passaggio 6: Impostare snmpEngineBoots e snmpEngineTime

6a) Messaggio autenticato (Authenticated Message)

Se il securityLevel specifica che il messaggio deve essere autenticato, vengono utilizzati i valori correnti di snmpEngineBoots e snmpEngineTime corrispondenti al securityEngineID dal LCD.

6b) Messaggio di risposta o rapporto (non autenticato) (Response or Report Message - unauthenticated)

Altrimenti, se questo è un messaggio di risposta o rapporto, vengono utilizzati i valori correnti di snmpEngineBoots e snmpEngineTime corrispondenti allo snmpEngineID locale dal LCD.

6c) Altri messaggi non autenticati (Other Unauthenticated Messages)

Altrimenti (questa è una richiesta o notifica non autenticata), sia snmpEngineBoots che snmpEngineTime sono impostati a zero.

Passaggio 7: Codificare i valori temporali (Encode Time Values)

I valori di msgAuthoritativeEngineBoots e msgAuthoritativeEngineTime sono impostati sui valori determinati nel passaggio 6 e sono codificati come valori INTEGER nei securityParameters.

Passaggio 8: Impostare msgUserName

Il campo msgUserName è impostato sul securityName ed è codificato come OCTET STRING nei securityParameters.

Passaggio 9: Autenticare il messaggio (se necessario) (Authenticate the Message)

9a) Con autenticazione (authNoPriv o authPriv)

Se il securityLevel specifica che il messaggio deve essere autenticato, il messaggio viene autenticato secondo il protocollo di autenticazione dell'utente.

Il campo msgAuthenticationParameters è impostato sulla serializzazione secondo le regole del protocollo di autenticazione di:

authenticationInformation =
authenticationAlgorithm(
IN authKey -- authKey localizzata dell'utente
IN wholeMsg -- messaggio non autenticato
)

Processo (Process):

  1. Il campo msgAuthenticationParameters viene temporaneamente riempito con un valore determinato dal protocollo di autenticazione (tipicamente 12 ottetti zero per HMAC-MD5-96 e HMAC-SHA-96)

  2. L'algoritmo di autenticazione viene eseguito sull'intero messaggio serializzato (wholeMsg)

  3. L'output dell'algoritmo di autenticazione (il MAC/digest) sostituisce il valore temporaneo in msgAuthenticationParameters

Parametri (Parameters):

  • authKey: L'authKey privata localizzata dell'utente è la chiave segreta utilizzata dall'algoritmo di autenticazione

  • wholeMsg: Il messaggio non autenticato (con msgAuthenticationParameters temporaneamente impostato a zeri)

  • authenticationInformation: Il digest/MAC di autenticazione calcolato

Il digest di autenticazione calcolato viene inserito nel campo msgAuthenticationParameters.

9b) Senza autenticazione (noAuthNoPriv)

Se il securityLevel specifica che il messaggio non deve essere autenticato, un OCTET STRING di lunghezza zero viene codificato nel campo msgAuthenticationParameters.

Passaggio 10: Finalizzare e restituire (Finalize and Return)

Il wholeMsg completato viene restituito al modulo chiamante insieme a statusInformation che indica il successo.

Message Generation Flow Summary (Riepilogo del flusso di generazione dei messaggi)

1. Cercare informazioni utente (dalla cache o LCD)
2. Validare il supporto del livello di sicurezza
3. Verificare il supporto dell'autenticazione
4. Crittografare scopedPDU (se authPriv)
└─> Impostare msgPrivacyParameters
5. Impostare msgAuthoritativeEngineID
6. Determinare i valori temporali (boots/time)
7. Codificare i valori temporali
8. Impostare msgUserName
9. Autenticare il messaggio (se authNoPriv o authPriv)
└─> Calcolare MAC/digest
└─> Impostare msgAuthenticationParameters
10. Restituire wholeMsg completo

Special Cases (Casi speciali)

Discovery Messages (Messaggi di scoperta)

Per i messaggi di scoperta:

  • securityEngineID è vuoto (lunghezza zero)
  • securityLevel è noAuthNoPriv
  • msgAuthoritativeEngineID è vuoto
  • msgAuthoritativeEngineBoots e msgAuthoritativeEngineTime sono zero
  • msgUserName è vuoto
  • msgAuthenticationParameters è vuoto
  • msgPrivacyParameters è vuoto

Notification Messages (Messaggi di notifica)

Per i messaggi di notifica (Trap, Inform):

  • L'iniziatore di notifica (notification originator) è il motore autorevole
  • securityEngineID è lo snmpEngineID locale
  • Utilizzare i valori locali snmpEngineBoots e snmpEngineTime

Error Conditions (Condizioni di errore)

Le seguenti indicazioni di errore possono essere restituite:

Errore (Error)Condizione (Condition)
unknownSecurityNameUtente non trovato nel LCD
unsupportedSecurityLevelL'utente manca del protocollo di autenticazione o privacy richiesto
encryptionErrorIl modulo di privacy non è riuscito a crittografare i dati

Implementation Notes (Note di implementazione)

  1. Dati di sicurezza memorizzati nella cache (Cached Security Data): Per i messaggi di risposta e rapporto, le informazioni di sicurezza vengono recuperate dai dati memorizzati nella cache salvati durante l'elaborazione del messaggio di richiesta originale

  2. Sincronizzazione temporale (Time Synchronization): I messaggi autenticati utilizzano i valori temporali dal LCD per il motore autorevole di destinazione. Questi valori devono essere mantenuti sincronizzati (vedere Sezione 4 sulla scoperta)

  3. Utilizzo delle chiavi (Key Usage): Devono essere utilizzate le authKey e privKey localizzate per il securityEngineID specifico

  4. Dimensione del messaggio (Message Size): L'implementazione deve garantire che il messaggio generato non superi il maxMessageSize negoziato con il motore remoto