Passa al contenuto principale

2. Elementi del Modello

Questa sezione contiene le definizioni richieste per realizzare il modello di sicurezza definito da questo memorandum.

2.1. Utenti del Modello di Sicurezza Basato sull'Utente

Le operazioni di gestione che utilizzano questo modello di sicurezza fanno uso di un insieme definito di identità utente. Per qualsiasi utente per conto del quale le operazioni di gestione sono autorizzate presso un particolare motore SNMP, quel motore SNMP deve avere conoscenza di quell'utente. Un motore SNMP che desidera comunicare con un altro motore SNMP deve anche avere conoscenza di un utente noto a quel motore, inclusa la conoscenza degli attributi applicabili di quell'utente.

Un utente e i suoi attributi sono definiti come segue:

  • userName Una stringa che rappresenta il nome dell'utente.

  • securityName Una stringa leggibile dall'uomo che rappresenta l'utente in un formato indipendente dal modello di sicurezza. Esiste una relazione uno-a-uno tra userName e securityName.

  • authProtocol Un'indicazione se i messaggi inviati per conto di questo utente possono essere autenticati e, in caso affermativo, il tipo di protocollo di autenticazione utilizzato. Due di questi protocolli sono definiti in questo memorandum:

    • il protocollo di autenticazione HMAC-MD5-96.
    • il protocollo di autenticazione HMAC-SHA-96.
  • authKey Se i messaggi inviati per conto di questo utente possono essere autenticati, la chiave di autenticazione (privata) da utilizzare con il protocollo di autenticazione. Si noti che la chiave di autenticazione di un utente sarà normalmente diversa presso diversi motori SNMP autoritativi. L'authKey non è accessibile tramite SNMP. I requisiti di lunghezza dell'authKey sono definiti dall'authProtocol in uso.

  • authKeyChange e authOwnKeyChange L'unico modo per aggiornare remotamente la chiave di autenticazione. Lo fa in modo sicuro, in modo che l'aggiornamento possa essere completato senza la necessità di impiegare la protezione della privacy.

  • privProtocol Un'indicazione se i messaggi inviati per conto di questo utente possono essere protetti dalla divulgazione e, in caso affermativo, il tipo di protocollo di privacy utilizzato. Un tale protocollo è definito in questo memorandum: il protocollo di crittografia simmetrica CBC-DES.

  • privKey Se i messaggi inviati per conto di questo utente possono essere cifrati/decifrati, la chiave di privacy (privata) da utilizzare con il protocollo di privacy. Si noti che la chiave di privacy di un utente sarà normalmente diversa presso diversi motori SNMP autoritativi. La privKey non è accessibile tramite SNMP. I requisiti di lunghezza della privKey sono definiti dal privProtocol in uso.

  • privKeyChange e privOwnKeyChange L'unico modo per aggiornare remotamente la chiave di crittografia. Lo fa in modo sicuro, in modo che l'aggiornamento possa essere completato senza la necessità di impiegare la protezione della privacy.

2.2. Protezione contro la Riesecuzione

Ogni motore SNMP mantiene tre oggetti:

  • snmpEngineID, che (almeno all'interno di un dominio amministrativo) identifica in modo unico e inequivocabile un motore SNMP.

  • snmpEngineBoots, che è un conteggio del numero di volte in cui il motore SNMP si è riavviato/reinizializzato dall'ultima volta che è stato configurato snmpEngineID; e,

  • snmpEngineTime, che è il numero di secondi dall'ultima volta che il contatore snmpEngineBoots è stato incrementato.

Ogni motore SNMP è sempre autoritativo rispetto a questi oggetti nella propria entità SNMP. È responsabilità di un motore SNMP non autoritativo sincronizzarsi con il motore SNMP autoritativo, a seconda dei casi.

Un motore SNMP autoritativo è tenuto a mantenere i valori del suo snmpEngineID e snmpEngineBoots in uno storage non volatile.

2.2.1. msgAuthoritativeEngineID

Il valore msgAuthoritativeEngineID contenuto in un messaggio autenticato viene utilizzato per contrastare gli attacchi in cui i messaggi da un motore SNMP a un altro motore SNMP vengono riprodotti verso un motore SNMP diverso. Rappresenta lo snmpEngineID presso il motore SNMP autoritativo coinvolto nello scambio del messaggio.

Quando un motore SNMP autoritativo viene installato per la prima volta, imposta il suo valore locale di snmpEngineID secondo un algoritmo specifico dell'azienda (vedere la definizione della Convenzione Testuale per SnmpEngineID nel documento Architettura SNMP [RFC3411]).

2.2.2. msgAuthoritativeEngineBoots e msgAuthoritativeEngineTime

I valori msgAuthoritativeEngineBoots e msgAuthoritativeEngineTime contenuti in un messaggio autenticato vengono utilizzati per contrastare gli attacchi in cui i messaggi vengono riprodotti quando non sono più validi. Rappresentano i valori snmpEngineBoots e snmpEngineTime presso il motore SNMP autoritativo coinvolto nello scambio del messaggio.

Attraverso l'uso di snmpEngineBoots e snmpEngineTime, non è necessario che un motore SNMP abbia un orologio non volatile che scatti (cioè, aumenti con il passare del tempo) anche quando il motore SNMP è spento. Piuttosto, ogni volta che un motore SNMP si riavvia, recupera, incrementa e quindi memorizza snmpEngineBoots in uno storage non volatile e reimposta snmpEngineTime a zero.

Quando un motore SNMP viene installato per la prima volta, imposta i suoi valori locali di snmpEngineBoots e snmpEngineTime a zero. Se snmpEngineTime raggiunge mai il suo valore massimo (2147483647), allora snmpEngineBoots viene incrementato come se il motore SNMP si fosse riavviato e snmpEngineTime viene reimpostato a zero e ricomincia a incrementarsi.

Ogni volta che un motore SNMP autoritativo si riavvia, qualsiasi motore SNMP che detiene i valori snmpEngineBoots e snmpEngineTime di quel motore SNMP autoritativo deve risincronizzarsi prima di inviare messaggi correttamente autenticati a quel motore SNMP autoritativo (vedere la sezione 2.3 per le procedure di (ri-)sincronizzazione). Si noti, tuttavia, che le procedure prevedono che una notifica venga accettata come autentica da un motore SNMP ricevente, quando viene inviata da un motore SNMP autoritativo che si è riavviato dall'ultima (ri-)sincronizzazione del motore SNMP ricevente.

Se un motore SNMP autoritativo non è mai in grado di determinare il suo ultimo valore snmpEngineBoots, allora deve impostare il suo valore snmpEngineBoots a 2147483647.

Ogni volta che il valore locale di snmpEngineBoots ha il valore 2147483647, si blocca a quel valore e un messaggio autenticato causa sempre un errore di autenticazione notInTimeWindow.

Per reimpostare un motore SNMP il cui valore snmpEngineBoots ha raggiunto il valore 2147483647, è richiesto un intervento manuale. Il motore deve essere visitato fisicamente e riconfigurato, sia con un nuovo valore snmpEngineID, sia con nuovi valori segreti per i protocolli di autenticazione e privacy di tutti gli utenti noti a quel motore SNMP. Si noti che anche se un motore SNMP si riavvia una volta al secondo, ci vorrebbero ancora circa 68 anni prima che venga raggiunto il valore massimo di 2147483647.

2.2.3. Finestra Temporale

La finestra temporale è un valore che specifica la finestra di tempo in cui un messaggio generato per conto di qualsiasi utente è valido. Questo memorandum specifica che viene utilizzato lo stesso valore della finestra temporale, 150 secondi, per tutti gli utenti.

2.3. Sincronizzazione Temporale

La sincronizzazione temporale, richiesta da un motore SNMP non autoritativo per procedere con comunicazioni autentiche, si è verificata quando il motore SNMP non autoritativo ha ottenuto una nozione locale dei valori snmpEngineBoots e snmpEngineTime del motore SNMP autoritativo dal motore SNMP autoritativo. Questi valori devono essere (e rimanere) all'interno della finestra temporale del motore SNMP autoritativo. Quindi la nozione locale dei valori del motore SNMP autoritativo deve essere mantenuta debolmente sincronizzata con i valori memorizzati presso il motore SNMP autoritativo. Oltre a mantenere una copia locale di snmpEngineBoots e snmpEngineTime dal motore SNMP autoritativo, un motore SNMP non autoritativo deve anche mantenere una variabile locale, latestReceivedEngineTime. Questo valore registra il valore più alto di snmpEngineTime che è stato ricevuto dal motore SNMP non autoritativo dal motore SNMP autoritativo ed è utilizzato per eliminare la possibilità di riprodurre messaggi che impedirebbero alla nozione del motore SNMP non autoritativo dello snmpEngineTime di avanzare.

Un motore SNMP non autoritativo deve mantenere nozioni locali di questi valori (snmpEngineBoots, snmpEngineTime e latestReceivedEngineTime) per ciascun motore SNMP autoritativo con cui desidera comunicare. Poiché ciascun motore SNMP autoritativo è identificato in modo unico e inequivocabile dal suo valore di snmpEngineID, il motore SNMP non autoritativo può utilizzare questo valore come chiave per memorizzare nella cache le sue nozioni locali di questi valori.

La sincronizzazione temporale si verifica come parte delle procedure di ricezione di un messaggio SNMP (Sezione 3.2, passaggio 7b). Come tale, non è richiesta alcuna procedura esplicita di sincronizzazione temporale da parte di un motore SNMP non autoritativo. Si noti che ogni volta che il valore locale di snmpEngineID viene modificato (ad esempio, attraverso la scoperta) o quando vengono stabilite per la prima volta comunicazioni sicure con un motore SNMP autoritativo, i valori locali di snmpEngineBoots e latestReceivedEngineTime devono essere impostati a zero. Questo causerà la sincronizzazione temporale quando viene ricevuto il prossimo messaggio autentico.

2.4. Messaggi SNMP che Utilizzano questo Modello di Sicurezza

La sintassi di un messaggio SNMP che utilizza questo modello di sicurezza aderisce al formato del messaggio definito nel documento del modello di elaborazione dei messaggi specifico della versione (ad esempio [RFC3412]).

Il campo msgSecurityParameters nei messaggi SNMPv3 ha un tipo di dati OCTET STRING. Il suo valore è la serializzazione BER della seguente sequenza ASN.1:

USMSecurityParametersSyntax DEFINITIONS IMPLICIT TAGS ::= BEGIN

UsmSecurityParameters ::=
SEQUENCE {
-- parametri di sicurezza globali basati sull'utente
msgAuthoritativeEngineID OCTET STRING,
msgAuthoritativeEngineBoots INTEGER (0..2147483647),
msgAuthoritativeEngineTime INTEGER (0..2147483647),
msgUserName OCTET STRING (SIZE(0..32)),
-- parametri specifici del protocollo di autenticazione
msgAuthenticationParameters OCTET STRING,
-- parametri specifici del protocollo di privacy
msgPrivacyParameters OCTET STRING
}
END

I campi di questa sequenza sono:

  • Il msgAuthoritativeEngineID specifica lo snmpEngineID del motore SNMP autoritativo coinvolto nello scambio del messaggio.

  • Il msgAuthoritativeEngineBoots specifica il valore snmpEngineBoots presso il motore SNMP autoritativo coinvolto nello scambio del messaggio.

  • Il msgAuthoritativeEngineTime specifica il valore snmpEngineTime presso il motore SNMP autoritativo coinvolto nello scambio del messaggio.

  • Il msgUserName specifica l'utente (principale) per conto del quale il messaggio viene scambiato. Si noti che un userName di lunghezza zero non corrisponderà a nessun utente, ma può essere utilizzato per la scoperta di snmpEngineID.

  • I msgAuthenticationParameters sono definiti dal protocollo di autenticazione in uso per il messaggio, come definito dalla colonna usmUserAuthProtocol nella voce dell'utente nella usmUserTable.

  • I msgPrivacyParameters sono definiti dal protocollo di privacy in uso per il messaggio, come definito dalla colonna usmUserPrivProtocol nella voce dell'utente nella usmUserTable.

Vedere l'appendice A.4 per un esempio della codifica BER del campo msgSecurityParameters.

2.5. Servizi Forniti dal Modello di Sicurezza Basato sull'Utente

Questa sezione descrive i servizi forniti dal modello di sicurezza basato sull'utente con i loro input e output.

I servizi sono descritti come primitive di un'interfaccia di servizio astratta e gli input e output sono descritti come elementi di dati astratti come vengono passati in queste primitive di servizio astratte.

2.5.1. Servizi per Generare un Messaggio SNMP in Uscita

Quando il sottosistema di elaborazione dei messaggi (MP) invoca il modulo di sicurezza basato sull'utente per proteggere un messaggio SNMP in uscita, deve utilizzare il servizio appropriato fornito dal modulo di sicurezza. Vengono forniti questi due servizi:

  1. Un servizio per generare un messaggio di richiesta. La primitiva di servizio astratta è:
statusInformation =            -- successo o indicazione di errore
generateRequestMsg(
IN messageProcessingModel -- tipicamente, versione SNMP
IN globalData -- intestazione del messaggio, dati admin
IN maxMessageSize -- dell'entità SNMP mittente
IN securityModel -- per il messaggio in uscita
IN securityEngineID -- entità SNMP autoritativa
IN securityName -- per conto di questo principale
IN securityLevel -- livello di sicurezza richiesto
IN scopedPDU -- payload del messaggio (testo in chiaro)
OUT securityParameters -- compilato dal modulo di sicurezza
OUT wholeMsg -- messaggio completo generato
OUT wholeMsgLength -- lunghezza del messaggio generato
)
  1. Un servizio per generare un messaggio di risposta. La primitiva di servizio astratta è:
statusInformation =            -- successo o indicazione di errore
generateResponseMsg(
IN messageProcessingModel -- tipicamente, versione SNMP
IN globalData -- intestazione del messaggio, dati admin
IN maxMessageSize -- dell'entità SNMP mittente
IN securityModel -- per il messaggio in uscita
IN securityEngineID -- entità SNMP autoritativa
IN securityName -- per conto di questo principale
IN securityLevel -- livello di sicurezza richiesto
IN scopedPDU -- payload del messaggio (testo in chiaro)
IN securityStateReference -- riferimento alle informazioni sullo
-- stato di sicurezza dalla richiesta
-- originale
OUT securityParameters -- compilato dal modulo di sicurezza
OUT wholeMsg -- messaggio completo generato
OUT wholeMsgLength -- lunghezza del messaggio generato
)

Gli elementi di dati astratti passati come parametri nelle primitive di servizio astratte sono i seguenti:

  • statusInformation Un'indicazione se la codifica e la protezione del messaggio hanno avuto successo. In caso contrario, è un'indicazione del problema.

  • messageProcessingModel Il numero di versione SNMP per il messaggio da generare. Questi dati non sono utilizzati dal modulo di sicurezza basato sull'utente.

  • globalData L'intestazione del messaggio (cioè, le sue informazioni amministrative). Questi dati non sono utilizzati dal modulo di sicurezza basato sull'utente.

  • maxMessageSize La dimensione massima del messaggio inclusa nel messaggio. Questi dati non sono utilizzati dal modulo di sicurezza basato sull'utente.

  • securityParameters Questi sono i parametri di sicurezza. Saranno compilati dal modulo di sicurezza basato sull'utente.

  • securityModel Il securityModel in uso. Dovrebbe essere il modello di sicurezza basato sull'utente. Questi dati non sono utilizzati dal modulo di sicurezza basato sull'utente.

  • securityName Insieme allo snmpEngineID, identifica una riga nella usmUserTable che deve essere utilizzata per proteggere il messaggio. Il securityName ha un formato indipendente dal modello di sicurezza. Nel caso di una risposta, questo parametro viene ignorato e viene utilizzato il valore dalla cache.

  • securityLevel Il livello di sicurezza dal quale il modulo di sicurezza basato sull'utente determina se il messaggio deve essere protetto dalla divulgazione e se il messaggio deve essere autenticato.

  • securityEngineID Lo snmpEngineID del motore SNMP autoritativo a cui deve essere inviato un messaggio di richiesta di dati. Nel caso di una risposta, è implicito essere lo snmpEngineID del motore SNMP di elaborazione e quindi se viene specificato, viene ignorato.

  • scopedPDU Il payload del messaggio. I dati sono opachi per quanto riguarda il modello di sicurezza basato sull'utente.

  • securityStateReference Un handle/riferimento ai cachedSecurityData da utilizzare quando si protegge un messaggio di risposta in uscita. Questo è esattamente lo stesso handle/riferimento generato dal modulo di sicurezza basato sull'utente durante l'elaborazione del messaggio di richiesta in arrivo a cui questa è la risposta.

  • wholeMsg Il messaggio completamente codificato e protetto pronto per l'invio sul cavo.

  • wholeMsgLength La lunghezza del messaggio codificato e protetto (wholeMsg).

Al completamento del processo, il modulo di sicurezza basato sull'utente restituisce statusInformation. Se il processo ha avuto successo, viene restituito il messaggio completo con privacy e autenticazione applicate se richiesto dal securityLevel specificato. Se il processo non ha avuto successo, viene restituita un'indicazione di errore.

2.5.2. Servizi per Elaborare un Messaggio SNMP in Arrivo

Quando il sottosistema di elaborazione dei messaggi (MP) invoca il modulo di sicurezza basato sull'utente per verificare la corretta sicurezza di un messaggio in arrivo, deve utilizzare il servizio fornito per un messaggio in arrivo. La primitiva di servizio astratta è:

statusInformation =             -- indicazione di errore o successo
-- OID/valore del contatore di errori se errore
processIncomingMsg(
IN messageProcessingModel -- tipicamente, versione SNMP
IN maxMessageSize -- dell'entità SNMP mittente
IN securityParameters -- per il messaggio ricevuto
IN securityModel -- per il messaggio ricevuto
IN securityLevel -- livello di sicurezza
IN wholeMsg -- come ricevuto sul cavo
IN wholeMsgLength -- lunghezza come ricevuto sul cavo
OUT securityEngineID -- entità SNMP autoritativa
OUT securityName -- identificazione del principale
OUT scopedPDU, -- payload del messaggio (testo in chiaro)
OUT maxSizeResponseScopedPDU -- dimensione massima del PDU di risposta
OUT securityStateReference -- riferimento allo stato di sicurezza
) -- informazioni, necessarie per la risposta

Gli elementi di dati astratti passati come parametri nelle primitive di servizio astratte sono i seguenti:

  • statusInformation Un'indicazione se il processo ha avuto successo o meno. In caso contrario, allora il statusInformation include l'OID e il valore del contatore di errori che è stato incrementato.

  • messageProcessingModel Il numero di versione SNMP come ricevuto nel messaggio. Questi dati non sono utilizzati dal modulo di sicurezza basato sull'utente.

  • maxMessageSize La dimensione massima del messaggio inclusa nel messaggio. Il modulo di sicurezza basato sull'utente utilizza questo valore per calcolare il maxSizeResponseScopedPDU.

  • securityParameters Questi sono i parametri di sicurezza come ricevuti nel messaggio.

  • securityModel Il securityModel in uso. Dovrebbe essere il modello di sicurezza basato sull'utente. Questi dati non sono utilizzati dal modulo di sicurezza basato sull'utente.

  • securityLevel Il livello di sicurezza dal quale il modulo di sicurezza basato sull'utente determina se il messaggio deve essere protetto dalla divulgazione e se il messaggio deve essere autenticato.

  • wholeMsg L'intero messaggio come è stato ricevuto.

  • wholeMsgLength La lunghezza del messaggio come è stato ricevuto (wholeMsg).

  • securityEngineID Lo snmpEngineID che è stato estratto dal campo msgAuthoritativeEngineID e che è stato utilizzato per cercare i segreti nella usmUserTable.

  • securityName Il nome di sicurezza che rappresenta l'utente per conto del quale è stato ricevuto il messaggio. Il securityName ha un formato indipendente dal modello di sicurezza.

  • scopedPDU Il payload del messaggio. I dati sono opachi per quanto riguarda il modello di sicurezza basato sull'utente.

  • maxSizeResponseScopedPDU La dimensione massima di un scopedPDU da includere in un possibile messaggio di risposta. Il modulo di sicurezza basato sull'utente calcola questa dimensione in base al msgMaxSize (come ricevuto nel messaggio) e allo spazio richiesto per l'intestazione del messaggio (inclusi i securityParameters) per tale messaggio di risposta.

  • securityStateReference Un handle/riferimento ai cachedSecurityData da utilizzare quando si protegge un messaggio di risposta in uscita. Quando il sottosistema di elaborazione dei messaggi chiama il modulo di sicurezza basato sull'utente per generare una risposta a questo messaggio in arrivo, deve passare questo handle/riferimento.

Al completamento del processo, il modulo di sicurezza basato sull'utente restituisce statusInformation e, se il processo ha avuto successo, gli elementi di dati aggiuntivi per un'ulteriore elaborazione del messaggio. Se il processo non ha avuto successo, allora un'indicazione di errore, possibilmente con una coppia OID e valore di un contatore di errori che è stato incrementato.

2.6. Algoritmo di Localizzazione delle Chiavi

Una chiave localizzata è una chiave segreta condivisa tra un utente U e un motore SNMP autoritativo E. Anche se un utente può avere solo una password e quindi una sola chiave per l'intera rete, i segreti effettivi condivisi tra l'utente e ciascun motore SNMP autoritativo saranno diversi. Questo viene ottenuto mediante la localizzazione delle chiavi [Localized-key].

Per prima cosa, se un utente utilizza una password, allora la password dell'utente viene convertita in una chiave Ku utilizzando uno dei due algoritmi descritti nelle appendici A.2.1 e A.2.2.

Per convertire la chiave Ku in una chiave localizzata Kul dell'utente U presso il motore SNMP autoritativo E, si aggiunge lo snmpEngineID del motore SNMP autoritativo alla chiave Ku e quindi si aggiunge la chiave Ku al risultato, avvolgendo così lo snmpEngineID all'interno delle due copie della chiave Ku dell'utente. Quindi si esegue una funzione di hash sicura (quale dipende dal protocollo di autenticazione definito per questo utente U presso il motore SNMP autoritativo E; questo documento definisce due protocolli di autenticazione con i loro algoritmi associati basati su MD5 e SHA). L'output della funzione di hash è la chiave localizzata Kul per l'utente U presso il motore SNMP autoritativo E.