3. Elementi di procedura
Questa sezione descrive le procedure relative alla sicurezza seguite da un motore SNMP durante l'elaborazione dei messaggi SNMP secondo il modello di sicurezza basato sull'utente.
3.1. 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.
-
a) Se viene passato un securityStateReference (messaggio di risposta o rapporto), allora le informazioni relative all'utente vengono estratte dai cachedSecurityData. I cachedSecurityData possono ora essere scartati. Il securityEngineID è impostato sul snmpEngineID locale. Il securityLevel è impostato sul valore specificato dal modulo chiamante.
Altrimenti,
b) in base al securityName, le informazioni relative all'utente presso lo snmpEngineID di destinazione, specificato dal securityEngineID, vengono estratte dal Local Configuration Datastore (LCD, usmUserTable). Se le informazioni sull'utente sono assenti dall'LCD, allora viene restituita un'indicazione di errore (unknownSecurityName) al modulo chiamante.
-
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, allora il messaggio non può essere inviato. Viene restituita un'indicazione di errore (unsupportedSecurityLevel) al modulo chiamante.
-
Se il securityLevel specifica che il messaggio deve essere autenticato, ma l'utente non supporta un protocollo di autenticazione, allora il messaggio non può essere inviato. Viene restituita un'indicazione di errore (unsupportedSecurityLevel) al modulo chiamante.
-
a) Se il securityLevel specifica che il messaggio deve essere protetto dalla divulgazione, allora la sequenza di ottetti che rappresenta il 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 = -- success or failure
encryptData(
IN encryptKey -- user's localized privKey
IN dataToEncrypt -- serialized scopedPDU
OUT encryptedData -- serialized encryptedPDU
OUT privParameters -- serialized privacy parameters
)-
statusInformation indica se il processo di crittografia ha avuto successo o meno.
-
encryptKey la privKey localizzata privata dell'utente è la chiave segreta che può essere utilizzata dall'algoritmo di crittografia.
-
dataToEncrypt il scopedPDU serializzato sono i dati da crittografare.
-
encryptedData l'encryptedPDU rappresenta il scopedPDU crittografato, codificato come OCTET STRING.
-
privParameters i parametri di privacy, codificati come OCTET STRING.
Se il modulo di privacy restituisce un fallimento, allora il messaggio non può essere inviato e viene restituita un'indicazione di errore (encryptionError) al modulo chiamante.
Se il modulo di privacy restituisce un successo, allora i privParameters restituiti vengono inseriti nel campo msgPrivacyParameters dei securityParameters e l'encryptedPDU serve come payload del messaggio in preparazione.
Altrimenti,
b) 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 e il scopedPDU in chiaro serve come payload del messaggio in preparazione.
-
-
Il securityEngineID viene codificato come OCTET STRING nel campo msgAuthoritativeEngineID dei securityParameters. Si noti che un securityEngineID vuoto (lunghezza zero) è accettabile per un messaggio di richiesta, perché ciò farà sì che il motore SNMP remoto (autoritativo) restituisca un PDU di rapporto con il securityEngineID appropriato incluso nel msgAuthoritativeEngineID nei securityParameters di quel PDU di rapporto restituito.
-
a) Se il securityLevel specifica che il messaggio deve essere autenticato, allora vengono utilizzati i valori correnti di snmpEngineBoots e snmpEngineTime corrispondenti al securityEngineID dall'LCD.
Altrimenti,
b) Se si tratta di un messaggio di risposta o rapporto, allora viene utilizzato il valore corrente di snmpEngineBoots e snmpEngineTime corrispondente allo snmpEngineID locale dall'LCD.
Altrimenti,
c) Se si tratta di un messaggio di richiesta, allora viene utilizzato un valore zero sia per snmpEngineBoots che per snmpEngineTime. Questo valore zero viene utilizzato se snmpEngineID è vuoto.
I valori vengono codificati rispettivamente come INTEGER nei campi msgAuthoritativeEngineBoots e msgAuthoritativeEngineTime dei securityParameters.
-
Il userName viene codificato come OCTET STRING nel campo msgUserName dei securityParameters.
-
a) Se il securityLevel specifica che il messaggio deve essere autenticato, 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 =
authenticateOutgoingMsg(
IN authKey -- the user's localized authKey
IN wholeMsg -- unauthenticated message
OUT authenticatedWholeMsg -- authenticated complete message
)-
statusInformation indica se l'autenticazione ha avuto successo o meno.
-
authKey l'authKey localizzata privata dell'utente è la chiave segreta che può essere utilizzata dall'algoritmo di autenticazione.
-
wholeMsg il messaggio serializzato completo da autenticare.
-
authenticatedWholeMsg uguale all'input fornito al servizio authenticateOutgoingMsg, ma con msgAuthenticationParameters correttamente compilato.
Se il modulo di autenticazione restituisce un fallimento, allora il messaggio non può essere inviato e viene restituita un'indicazione di errore (authenticationFailure) al modulo chiamante.
Se il modulo di autenticazione restituisce un successo, allora il campo msgAuthenticationParameters viene inserito nei securityParameters e authenticatedWholeMsg rappresenta la serializzazione del messaggio autenticato in preparazione.
Altrimenti,
b) Se il securityLevel specifica che il messaggio non deve essere autenticato, allora un OCTET STRING di lunghezza zero viene codificato nel campo msgAuthenticationParameters dei securityParameters. Il wholeMsg viene ora serializzato e quindi rappresenta il messaggio non autenticato in preparazione.
-
-
Il messaggio completo con la sua lunghezza viene restituito al modulo chiamante con statusInformation impostato su successo.
3.2. Elaborazione di un messaggio SNMP in entrata
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.
Per semplificare gli elementi di procedura, il rilascio delle informazioni di stato non è sempre esplicitamente specificato. Come regola generale, se le informazioni di stato sono disponibili quando un messaggio viene scartato, anche le informazioni di stato dovrebbero essere rilasciate. Inoltre, un'indicazione di errore può restituire un OID e un valore per un contatore incrementato e opzionalmente un valore per securityLevel, e valori per contextEngineID o contextName per il contatore. Inoltre, i dati securityStateReference vengono restituiti se tali informazioni sono disponibili nel punto in cui viene rilevato l'errore.
-
Se i securityParameters ricevuti non sono la serializzazione (secondo le convenzioni di [RFC3417]) di un OCTET STRING formattato secondo i UsmSecurityParameters definiti nella sezione 2.4, allora il contatore snmpInASNParseErrs [RFC3418] viene incrementato e viene restituita un'indicazione di errore (parseError) al modulo chiamante. Si noti che ritorniamo senza l'OID e il valore del contatore incrementato, perché in questo caso non ci sono abbastanza informazioni per generare un PDU di rapporto.
-
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. I valori da memorizzare nella cache sono:
msgUserName
-
Se il valore del campo msgAuthoritativeEngineID nei securityParameters è sconosciuto allora:
a) un motore SNMP non autoritativo che esegue il discovery può opzionalmente creare una nuova voce nel suo Local Configuration Datastore (LCD) e continuare l'elaborazione;
o
b) 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.
Si noti che nel caso in cui venga ricevuto un msgAuthoritativeEngineID di lunghezza zero o di dimensione illegale, dovrebbe essere scelto b) per facilitare il discovery dell'engineID. Altrimenti la scelta tra a) e b) è una questione di implementazione.
-
Le informazioni sul valore dei campi msgUserName e msgAuthoritativeEngineID vengono estratte dal Local Configuration Datastore (LCD, usmUserTable). Se non sono disponibili informazioni per l'utente, allora il contatore usmStatsUnknownUserNames viene incrementato e viene restituita un'indicazione di errore (unknownSecurityName) insieme all'OID e al valore del contatore incrementato al modulo chiamante.
-
Se le informazioni sull'utente indicano che non supporta il securityLevel richiesto dal chiamante, allora il contatore usmStatsUnsupportedSecLevels viene incrementato e viene restituita un'indicazione di errore (unsupportedSecurityLevel) insieme all'OID e al valore del contatore incrementato al modulo chiamante.
-
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 = -- success or failure
authenticateIncomingMsg(
IN authKey -- the user's localized authKey
IN authParameters -- as received on the wire
IN wholeMsg -- as received on the wire
OUT authenticatedWholeMsg -- checked for authentication
)-
statusInformation indica se l'autenticazione ha avuto successo o meno.
-
authKey l'authKey localizzata privata dell'utente è la chiave segreta che può essere utilizzata dall'algoritmo di autenticazione.
-
wholeMsg il messaggio serializzato completo da autenticare.
-
authenticatedWholeMsg uguale all'input fornito al servizio authenticateIncomingMsg, ma dopo che l'autenticazione è stata verificata.
Se il modulo di autenticazione restituisce un fallimento, allora il messaggio non può essere considerato attendibile, quindi il contatore usmStatsWrongDigests viene incrementato e 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 un successo, allora il messaggio è autentico e può essere considerato attendibile quindi l'elaborazione continua.
-
-
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 Local Configuration Datastore.
a) Se il valore estratto di msgAuthoritativeEngineID è lo stesso del valore di snmpEngineID del motore SNMP in elaborazione (il che significa che questo è il motore SNMP autoritativo), allora se una delle seguenti condizioni è vera, il messaggio è considerato al di fuori della finestra temporale:
- il valore locale di snmpEngineBoots è 2147483647;
- il valore del campo msgAuthoritativeEngineBoots differisce dal valore locale di snmpEngineBoots; oppure,
- il valore del campo msgAuthoritativeEngineTime differisce dalla nozione locale di snmpEngineTime di più di +/- 150 secondi.
Se il messaggio è considerato al di fuori della finestra temporale, allora il contatore usmStatsNotInTimeWindows viene incrementato e 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 chiamanteb) Se il valore estratto di msgAuthoritativeEngineID non è lo stesso del valore snmpEngineID del motore SNMP in elaborazione (il che significa che questo non è il motore SNMP autoritativo), allora:
1) se almeno una delle seguenti condizioni è vera:
- il valore estratto del campo msgAuthoritativeEngineBoots è maggiore della nozione locale del valore di snmpEngineBoots; oppure,
- il valore estratto del campo msgAuthoritativeEngineBoots è uguale alla nozione locale del valore di snmpEngineBoots, e il valore estratto del campo msgAuthoritativeEngineTime è maggiore del 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, e
- il latestReceivedEngineTime al valore del valore del campo msgAuthoritativeEngineTime.
2) 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 alla nozione locale del valore di snmpEngineBoots; oppure,
- il valore del campo msgAuthoritativeEngineBoots è uguale alla nozione locale del valore di snmpEngineBoots e il valore del campo msgAuthoritativeEngineTime è inferiore di più di 150 secondi rispetto alla nozione locale del valore di snmpEngineTime.
Se il messaggio è considerato al di fuori della finestra temporale, allora viene restituita un'indicazione di errore (notInTimeWindow) al modulo chiamante.
Si noti che ciò significa che un messaggio troppo vecchio (possibilmente riprodotto) è stato rilevato ed è considerato non autentico.
Si noti che questa procedura consente al valore di msgAuthoritativeEngineBoots nel messaggio di essere maggiore della nozione locale del valore di snmpEngineBoots per consentire ai messaggi ricevuti di essere accettati come autentici quando ricevuti da un motore SNMP autoritativo che si è riavviato dall'ultima (ri-)sincronizzazione del motore SNMP ricevente. -
a) Se il securityLevel indica che il messaggio è stato protetto dalla divulgazione, allora l'OCTET STRING che rappresenta l'encryptedPDU viene decrittografato secondo il protocollo di privacy dell'utente per ottenere un valore scopedPDU serializzato non crittografato. Per farlo viene effettuata una chiamata al modulo di privacy che implementa il protocollo di privacy dell'utente secondo la primitiva astratta:
statusInformation = -- success or failure
decryptData(
IN decryptKey -- the user's localized privKey
IN privParameters -- as received on the wire
IN encryptedData -- encryptedPDU as received
OUT decryptedData -- serialized decrypted scopedPDU
)-
statusInformation indica se il processo di decrittografia ha avuto successo o meno.
-
decryptKey la privKey localizzata privata dell'utente è la chiave segreta che può essere utilizzata dall'algoritmo di decrittografia.
-
privParameters i msgPrivacyParameters, codificati come OCTET STRING.
-
encryptedData l'encryptedPDU rappresenta il scopedPDU crittografato, codificato come OCTET STRING.
-
decryptedData il scopedPDU serializzato se la decrittografia ha successo.
Se il modulo di privacy restituisce un fallimento, allora il messaggio non può essere elaborato, quindi il contatore usmStatsDecryptionErrors viene incrementato e 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 un successo, allora il scopedPDU decrittografato è il payload del messaggio da restituire al modulo chiamante.
Altrimenti,
b) Si presume che il componente scopedPDU sia in testo semplice ed è il payload del messaggio da restituire al modulo chiamante.
-
-
Il maxSizeResponseScopedPDU viene calcolato. Questa è la dimensione massima consentita per un scopedPDU per un possibile messaggio di risposta. È prevista un'intestazione del messaggio che consente lo stesso securityLevel della richiesta ricevuta.
-
Il securityName per l'utente viene recuperato dalla usmUserTable.
-
I dati di sicurezza vengono memorizzati nella cache come cachedSecurityData, in modo che una possibile risposta a questo messaggio possa e utilizzerà gli stessi segreti di autenticazione e privacy. Le informazioni da salvare/memorizzare nella cache sono le seguenti:
msgUserName, usmUserAuthProtocol, usmUserAuthKey usmUserPrivProtocol, usmUserPrivKey
-
Lo statusInformation viene impostato su successo e viene effettuato un ritorno al modulo chiamante restituendo i parametri OUT come specificato nella primitiva processIncomingMsg.