3. Elemente des Verfahrens
Dieser Abschnitt beschreibt die sicherheitsbezogenen Verfahren, die von einer SNMP-Engine beim Verarbeiten von SNMP-Nachrichten gemäß dem User-based Security Model befolgt werden.
3.1. Generieren einer ausgehenden SNMP-Nachricht
Dieser Abschnitt beschreibt das Verfahren, das von einer SNMP-Engine befolgt wird, wann immer sie eine Nachricht generiert, die eine Managementoperation (wie eine Anfrage, eine Antwort, eine Benachrichtigung oder einen Bericht) im Namen eines Benutzers mit einem bestimmten securityLevel enthält.
-
a) Wenn eine securityStateReference übergeben wird (Response- oder Report-Nachricht), werden Informationen über den Benutzer aus den cachedSecurityData extrahiert. Die cachedSecurityData können jetzt verworfen werden. Die securityEngineID wird auf die lokale snmpEngineID gesetzt. Der securityLevel wird auf den vom aufrufenden Modul angegebenen Wert gesetzt.
Andernfalls,
b) basierend auf dem securityName werden Informationen über den Benutzer an der Ziel-snmpEngineID, die durch die securityEngineID angegeben ist, aus dem Local Configuration Datastore (LCD, usmUserTable) extrahiert. Wenn Informationen über den Benutzer im LCD fehlen, wird eine Fehleranzeige (unknownSecurityName) an das aufrufende Modul zurückgegeben.
-
Wenn der securityLevel angibt, dass die Nachricht vor Offenlegung geschützt werden soll, der Benutzer aber sowohl ein Authentifizierungs- als auch ein Datenschutzprotokoll nicht unterstützt, kann die Nachricht nicht gesendet werden. Eine Fehleranzeige (unsupportedSecurityLevel) wird an das aufrufende Modul zurückgegeben.
-
Wenn der securityLevel angibt, dass die Nachricht authentifiziert werden soll, der Benutzer aber kein Authentifizierungsprotokoll unterstützt, kann die Nachricht nicht gesendet werden. Eine Fehleranzeige (unsupportedSecurityLevel) wird an das aufrufende Modul zurückgegeben.
-
a) Wenn der securityLevel angibt, dass die Nachricht vor Offenlegung geschützt werden soll, wird die Oktettsequenz, die die serialisierte scopedPDU darstellt, gemäß dem Datenschutzprotokoll des Benutzers verschlüsselt. Dazu wird ein Aufruf an das Datenschutzmodul gemacht, das das Datenschutzprotokoll des Benutzers gemäß dem abstrakten Primitiv implementiert:
statusInformation = -- Erfolg oder Misserfolg
encryptData(
IN encryptKey -- lokalisierter privKey des Benutzers
IN dataToEncrypt -- serialisierte scopedPDU
OUT encryptedData -- serialisierte encryptedPDU
OUT privParameters -- serialisierte Datenschutzparameter
)-
statusInformation zeigt an, ob der Verschlüsselungsprozess erfolgreich war oder nicht.
-
encryptKey Der lokalisierte private privKey des Benutzers ist der geheime Schlüssel, der vom Verschlüsselungsalgorithmus verwendet werden kann.
-
dataToEncrypt Die serialisierte scopedPDU sind die zu verschlüsselnden Daten.
-
encryptedData Die encryptedPDU repräsentiert die verschlüsselte scopedPDU, codiert als OCTET STRING.
-
privParameters Die Datenschutzparameter, codiert als OCTET STRING.
Wenn das Datenschutzmodul einen Fehler zurückgibt, kann die Nachricht nicht gesendet werden, und eine Fehleranzeige (encryptionError) wird an das aufrufende Modul zurückgegeben.
Wenn das Datenschutzmodul Erfolg zurückgibt, werden die zurückgegebenen privParameters in das Feld msgPrivacyParameters der securityParameters eingefügt, und die encryptedPDU dient als Payload der vorbereiteten Nachricht.
Andernfalls,
b) Wenn der securityLevel angibt, dass die Nachricht nicht vor Offenlegung geschützt werden soll, wird ein OCTET STRING mit Länge Null in das Feld msgPrivacyParameters der securityParameters codiert, und die Klartext-scopedPDU dient als Payload der vorbereiteten Nachricht.
-
-
Die securityEngineID wird als OCTET STRING in das Feld msgAuthoritativeEngineID der securityParameters codiert. Beachten Sie, dass eine leere (Länge Null) securityEngineID für eine Request-Nachricht in Ordnung ist, da dies dazu führt, dass die entfernte (autoritative) SNMP-Engine eine Report-PDU zurückgibt, bei der die korrekte securityEngineID in der msgAuthoritativeEngineID in den securityParameters dieser zurückgegebenen Report-PDU enthalten ist.
-
a) Wenn der securityLevel angibt, dass die Nachricht authentifiziert werden soll, werden die aktuellen Werte von snmpEngineBoots und snmpEngineTime, die der securityEngineID aus dem LCD entsprechen, verwendet.
Andernfalls,
b) Wenn dies eine Response- oder Report-Nachricht ist, werden die aktuellen Werte von snmpEngineBoots und snmpEngineTime, die der lokalen snmpEngineID aus dem LCD entsprechen, verwendet.
Andernfalls,
c) Wenn dies eine Request-Nachricht ist, wird ein Nullwert sowohl für snmpEngineBoots als auch für snmpEngineTime verwendet. Dieser Nullwert wird verwendet, wenn snmpEngineID leer ist.
Die Werte werden jeweils als INTEGER in die Felder msgAuthoritativeEngineBoots und msgAuthoritativeEngineTime der securityParameters codiert.
-
Der userName wird als OCTET STRING in das Feld msgUserName der securityParameters codiert.
-
a) Wenn der securityLevel angibt, dass die Nachricht authentifiziert werden soll, wird die Nachricht gemäß dem Authentifizierungsprotokoll des Benutzers authentifiziert. Dazu wird ein Aufruf an das Authentifizierungsmodul gemacht, das das Authentifizierungsprotokoll des Benutzers gemäß dem abstrakten Dienstprimitiv implementiert:
statusInformation =
authenticateOutgoingMsg(
IN authKey -- lokalisierter authKey des Benutzers
IN wholeMsg -- nicht authentifizierte Nachricht
OUT authenticatedWholeMsg -- authentifizierte vollständige Nachricht
)-
statusInformation zeigt an, ob die Authentifizierung erfolgreich war oder nicht.
-
authKey Der lokalisierte private authKey des Benutzers ist der geheime Schlüssel, der vom Authentifizierungsalgorithmus verwendet werden kann.
-
wholeMsg Die vollständige serialisierte Nachricht, die authentifiziert werden soll.
-
authenticatedWholeMsg Das gleiche wie die Eingabe, die dem authenticateOutgoingMsg-Dienst gegeben wurde, aber mit korrekt ausgefüllten msgAuthenticationParameters.
Wenn das Authentifizierungsmodul einen Fehler zurückgibt, kann die Nachricht nicht gesendet werden, und eine Fehleranzeige (authenticationFailure) wird an das aufrufende Modul zurückgegeben.
Wenn das Authentifizierungsmodul Erfolg zurückgibt, wird das Feld msgAuthenticationParameters in die securityParameters eingefügt, und die authenticatedWholeMsg repräsentiert die Serialisierung der vorbereiteten authentifizierten Nachricht.
Andernfalls,
b) Wenn der securityLevel angibt, dass die Nachricht nicht authentifiziert werden soll, wird ein OCTET STRING mit Länge Null in das Feld msgAuthenticationParameters der securityParameters codiert. Die wholeMsg wird jetzt serialisiert und repräsentiert dann die vorbereitete nicht authentifizierte Nachricht.
-
-
Die fertige Nachricht mit ihrer Länge wird an das aufrufende Modul zurückgegeben, wobei die statusInformation auf Erfolg gesetzt ist.
3.2. Verarbeiten einer eingehenden SNMP-Nachricht
Dieser Abschnitt beschreibt das Verfahren, das von einer SNMP-Engine befolgt wird, wann immer sie eine Nachricht empfängt, die eine Managementoperation im Namen eines Benutzers mit einem bestimmten securityLevel enthält.
Um die Elemente des Verfahrens zu vereinfachen, wird die Freigabe von Zustandsinformationen nicht immer explizit angegeben. Als allgemeine Regel gilt: Wenn Zustandsinformationen verfügbar sind, wenn eine Nachricht verworfen wird, sollten die Zustandsinformationen ebenfalls freigegeben werden. Außerdem kann eine Fehleranzeige eine OID und einen Wert für einen inkrementierten Zähler und optional einen Wert für securityLevel sowie Werte für contextEngineID oder contextName für den Zähler zurückgeben. Zusätzlich werden die securityStateReference-Daten zurückgegeben, wenn solche Informationen an dem Punkt verfügbar sind, an dem der Fehler erkannt wird.
-
Wenn die empfangenen securityParameters nicht die Serialisierung (gemäß den Konventionen von [RFC3417]) eines OCTET STRING sind, der gemäß den in Abschnitt 2.4 definierten UsmSecurityParameters formatiert ist, wird der snmpInASNParseErrs-Zähler [RFC3418] inkrementiert, und eine Fehleranzeige (parseError) wird an das aufrufende Modul zurückgegeben. Beachten Sie, dass wir ohne die OID und den Wert des inkrementierten Zählers zurückkehren, da in diesem Fall nicht genügend Informationen vorhanden sind, um eine Report-PDU zu generieren.
-
Die Werte der Sicherheitsparameterfelder werden aus den securityParameters extrahiert. Die securityEngineID, die an den Aufrufer zurückgegeben werden soll, ist der Wert des Feldes msgAuthoritativeEngineID. Die cachedSecurityData werden vorbereitet, und eine securityStateReference wird vorbereitet, um auf diese Daten zu verweisen. Zu cachende Werte sind:
msgUserName
-
Wenn der Wert des Feldes msgAuthoritativeEngineID in den securityParameters unbekannt ist, dann:
a) kann eine nicht-autoritative SNMP-Engine, die Discovery durchführt, optional einen neuen Eintrag in ihrem Local Configuration Datastore (LCD) erstellen und mit der Verarbeitung fortfahren;
oder
b) der usmStatsUnknownEngineIDs-Zähler wird inkrementiert, und eine Fehleranzeige (unknownEngineID) zusammen mit der OID und dem Wert des inkrementierten Zählers wird an das aufrufende Modul zurückgegeben.
Beachten Sie, dass für den Fall, dass eine msgAuthoritativeEngineID mit Länge Null oder einer anderen ungültigen Größe empfangen wird, b) gewählt werden sollte, um die engineID-Erkennung zu erleichtern. Andernfalls ist die Wahl zwischen a) und b) eine Implementierungsfrage.
-
Informationen über den Wert der Felder msgUserName und msgAuthoritativeEngineID werden aus dem Local Configuration Datastore (LCD, usmUserTable) extrahiert. Wenn für den Benutzer keine Informationen verfügbar sind, wird der usmStatsUnknownUserNames-Zähler inkrementiert, und eine Fehleranzeige (unknownSecurityName) zusammen mit der OID und dem Wert des inkrementierten Zählers wird an das aufrufende Modul zurückgegeben.
-
Wenn die Informationen über den Benutzer darauf hinweisen, dass er den vom Aufrufer angeforderten securityLevel nicht unterstützt, wird der usmStatsUnsupportedSecLevels-Zähler inkrementiert, und eine Fehleranzeige (unsupportedSecurityLevel) zusammen mit der OID und dem Wert des inkrementierten Zählers wird an das aufrufende Modul zurückgegeben.
-
Wenn der securityLevel angibt, dass die Nachricht authentifiziert werden soll, wird die Nachricht gemäß dem Authentifizierungsprotokoll des Benutzers authentifiziert. Dazu wird ein Aufruf an das Authentifizierungsmodul gemacht, das das Authentifizierungsprotokoll des Benutzers gemäß dem abstrakten Dienstprimitiv implementiert:
statusInformation = -- Erfolg oder Misserfolg
authenticateIncomingMsg(
IN authKey -- lokalisierter authKey des Benutzers
IN authParameters -- wie auf der Leitung empfangen
IN wholeMsg -- wie auf der Leitung empfangen
OUT authenticatedWholeMsg -- auf Authentifizierung überprüft
)-
statusInformation zeigt an, ob die Authentifizierung erfolgreich war oder nicht.
-
authKey Der lokalisierte private authKey des Benutzers ist der geheime Schlüssel, der vom Authentifizierungsalgorithmus verwendet werden kann.
-
wholeMsg Die vollständige serialisierte Nachricht, die authentifiziert werden soll.
-
authenticatedWholeMsg Das gleiche wie die Eingabe, die dem authenticateIncomingMsg-Dienst gegeben wurde, aber nachdem die Authentifizierung überprüft wurde.
Wenn das Authentifizierungsmodul einen Fehler zurückgibt, kann der Nachricht nicht vertraut werden, daher wird der usmStatsWrongDigests-Zähler inkrementiert, und eine Fehleranzeige (authenticationFailure) zusammen mit der OID und dem Wert des inkrementierten Zählers wird an das aufrufende Modul zurückgegeben.
Wenn das Authentifizierungsmodul Erfolg zurückgibt, ist die Nachricht authentisch und kann vertraut werden, daher wird die Verarbeitung fortgesetzt.
-
-
Wenn der securityLevel eine authentifizierte Nachricht anzeigt, werden die lokalen Werte von snmpEngineBoots, snmpEngineTime und latestReceivedEngineTime, die dem Wert des Feldes msgAuthoritativeEngineID entsprechen, aus dem Local Configuration Datastore extrahiert.
a) Wenn der extrahierte Wert von msgAuthoritativeEngineID derselbe ist wie der Wert von snmpEngineID der verarbeitenden SNMP-Engine (was bedeutet, dass dies die autoritative SNMP-Engine ist), dann wird die Nachricht als außerhalb des Zeitfensters betrachtet, wenn eine der folgenden Bedingungen wahr ist:
- der lokale Wert von snmpEngineBoots ist 2147483647;
- der Wert des Feldes msgAuthoritativeEngineBoots unterscheidet sich vom lokalen Wert von snmpEngineBoots; oder,
- der Wert des Feldes msgAuthoritativeEngineTime unterscheidet sich von der lokalen Vorstellung von snmpEngineTime um mehr als +/- 150 Sekunden.
Wenn die Nachricht als außerhalb des Zeitfensters betrachtet wird, wird der usmStatsNotInTimeWindows-Zähler inkrementiert, und eine Fehleranzeige (notInTimeWindow) zusammen mit der OID, dem Wert des inkrementierten Zählers und einer Angabe, dass der Fehler mit einem securityLevel von authNoPriv gemeldet werden muss, wird an das aufrufende Modul zurückgegeben.b) Wenn der extrahierte Wert von msgAuthoritativeEngineID nicht derselbe ist wie der Wert snmpEngineID der verarbeitenden SNMP-Engine (was bedeutet, dass dies nicht die autoritative SNMP-Engine ist), dann:
1) wenn mindestens eine der folgenden Bedingungen wahr ist:
- der extrahierte Wert des Feldes msgAuthoritativeEngineBoots ist größer als die lokale Vorstellung des Wertes von snmpEngineBoots; oder,
- der extrahierte Wert des Feldes msgAuthoritativeEngineBoots ist gleich der lokalen Vorstellung des Wertes von snmpEngineBoots, und der extrahierte Wert des Feldes msgAuthoritativeEngineTime ist größer als der Wert von latestReceivedEngineTime,
dann wird der LCD-Eintrag, der dem extrahierten Wert des Feldes msgAuthoritativeEngineID entspricht, aktualisiert, indem gesetzt wird:
- die lokale Vorstellung des Wertes von snmpEngineBoots auf den Wert des Feldes msgAuthoritativeEngineBoots,
- die lokale Vorstellung des Wertes von snmpEngineTime auf den Wert des Feldes msgAuthoritativeEngineTime, und
- latestReceivedEngineTime auf den Wert des Wertes des Feldes msgAuthoritativeEngineTime.
2) wenn eine der folgenden Bedingungen wahr ist, wird die Nachricht als außerhalb des Zeitfensters betrachtet:
- die lokale Vorstellung des Wertes von snmpEngineBoots ist 2147483647;
- der Wert des Feldes msgAuthoritativeEngineBoots ist kleiner als die lokale Vorstellung des Wertes von snmpEngineBoots; oder,
- der Wert des Feldes msgAuthoritativeEngineBoots ist gleich der lokalen Vorstellung des Wertes von snmpEngineBoots, und der Wert des Feldes msgAuthoritativeEngineTime ist mehr als 150 Sekunden kleiner als die lokale Vorstellung des Wertes von snmpEngineTime.
Wenn die Nachricht als außerhalb des Zeitfensters betrachtet wird, wird eine Fehleranzeige (notInTimeWindow) an das aufrufende Modul zurückgegeben.
Beachten Sie, dass dies bedeutet, dass eine zu alte (möglicherweise wiedergegebene) Nachricht erkannt wurde und als nicht authentisch angesehen wird.
Beachten Sie, dass dieses Verfahren es ermöglicht, dass der Wert von msgAuthoritativeEngineBoots in der Nachricht größer ist als die lokale Vorstellung des Wertes von snmpEngineBoots, um empfangene Nachrichten als authentisch zu akzeptieren, wenn sie von einer autoritativen SNMP-Engine empfangen werden, die seit der letzten (Re-)Synchronisierung der empfangenden SNMP-Engine neu gestartet wurde. -
a) Wenn der securityLevel anzeigt, dass die Nachricht vor Offenlegung geschützt wurde, wird der OCTET STRING, der die encryptedPDU darstellt, gemäß dem Datenschutzprotokoll des Benutzers entschlüsselt, um einen unverschlüsselten serialisierten scopedPDU-Wert zu erhalten. Dazu wird ein Aufruf an das Datenschutzmodul gemacht, das das Datenschutzprotokoll des Benutzers gemäß dem abstrakten Primitiv implementiert:
statusInformation = -- Erfolg oder Misserfolg
decryptData(
IN decryptKey -- lokalisierter privKey des Benutzers
IN privParameters -- wie auf der Leitung empfangen
IN encryptedData -- encryptedPDU wie empfangen
OUT decryptedData -- serialisierte entschlüsselte scopedPDU
)-
statusInformation zeigt an, ob der Entschlüsselungsprozess erfolgreich war oder nicht.
-
decryptKey Der lokalisierte private privKey des Benutzers ist der geheime Schlüssel, der vom Entschlüsselungsalgorithmus verwendet werden kann.
-
privParameters Die msgPrivacyParameters, codiert als OCTET STRING.
-
encryptedData Die encryptedPDU repräsentiert die verschlüsselte scopedPDU, codiert als OCTET STRING.
-
decryptedData Die serialisierte scopedPDU, wenn die Entschlüsselung erfolgreich ist.
Wenn das Datenschutzmodul einen Fehler zurückgibt, kann die Nachricht nicht verarbeitet werden, daher wird der usmStatsDecryptionErrors-Zähler inkrementiert, und eine Fehleranzeige (decryptionError) zusammen mit der OID und dem Wert des inkrementierten Zählers wird an das aufrufende Modul zurückgegeben.
Wenn das Datenschutzmodul Erfolg zurückgibt, ist die entschlüsselte scopedPDU die Nachrichtennutzlast, die an das aufrufende Modul zurückgegeben werden soll.
Andernfalls,
b) Die scopedPDU-Komponente wird als Klartext angenommen und ist die Nachrichtennutzlast, die an das aufrufende Modul zurückgegeben werden soll.
-
-
Die maxSizeResponseScopedPDU wird berechnet. Dies ist die maximal zulässige Größe für eine scopedPDU für eine mögliche Response-Nachricht. Es ist Platz für einen Nachrichtenheader vorgesehen, der denselben securityLevel wie die empfangene Request ermöglicht.
-
Der securityName für den Benutzer wird aus der usmUserTable abgerufen.
-
Die Sicherheitsdaten werden als cachedSecurityData gecacht, damit eine mögliche Antwort auf diese Nachricht dieselben Authentifizierungs- und Datenschutzgeheimnisse verwenden kann und wird. Zu speichernde/cachende Informationen sind wie folgt:
msgUserName, usmUserAuthProtocol, usmUserAuthKey usmUserPrivProtocol, usmUserPrivKey
-
Die statusInformation wird auf Erfolg gesetzt, und es wird an das aufrufende Modul zurückgekehrt, wobei die im processIncomingMsg-Primitiv angegebenen OUT-Parameter zurückgegeben werden.