3.2. Processing an Incoming SNMP Message (Verarbeitung einer eingehenden SNMP-Nachricht)
3.2. Processing an Incoming SNMP Message (Verarbeitung einer eingehenden SNMP-Nachricht)
Dieser Abschnitt beschreibt die Vorgehensweise einer SNMP-Engine, wenn sie eine Nachricht mit einer Verwaltungsoperation im Namen eines Benutzers mit einem bestimmten securityLevel empfängt.
General Notes (Allgemeine Hinweise)
Um die Verfahrenselemente zu vereinfachen, wird die Freigabe von Statusinformationen nicht immer explizit angegeben. Als allgemeine Regel gilt: Wenn Statusinformationen verfügbar sind, wenn eine Nachricht verworfen wird, sollten die Statusinformationen ebenfalls freigegeben werden.
Außerdem kann eine Fehleranzeige Folgendes zurückgeben:
- Eine OID und einen Wert für einen inkrementierten Zähler
- Optional einen Wert für securityLevel
- Werte für contextEngineID oder contextName für den Zähler
- Die securityStateReference-Daten, wenn solche Informationen an der Stelle verfügbar sind, an der der Fehler erkannt wird
Schritt 1: securityParameters analysieren (Parse securityParameters)
Wenn die empfangenen securityParameters nicht die Serialisierung (gemäß den Konventionen von RFC 3417) eines OCTET STRING sind, der gemäß den in Abschnitt 2.4 definierten UsmSecurityParameters formatiert ist, dann:
- Wird der snmpInASNParseErrs-Zähler (RFC 3418) inkrementiert
- Wird eine Fehleranzeige (parseError) an das aufrufende Modul zurückgegeben
Hinweis: Wir kehren ohne die OID und den Wert des inkrementierten Zählers zurück, da in diesem Fall nicht genügend Informationen vorhanden sind, um ein Report-PDU zu generieren.
Schritt 2: Sicherheitsparameter extrahieren (Extract Security Parameters)
Die Werte der Sicherheitsparameterfelder werden aus den securityParameters extrahiert.
- Die an den Aufrufer zurückzugebende securityEngineID ist der Wert des msgAuthoritativeEngineID-Feldes
- Die cachedSecurityData werden vorbereitet und eine securityStateReference wird vorbereitet, um auf diese Daten zu verweisen
Zu cachende Werte (Values to be cached):
- msgUserName
- msgAuthoritativeEngineID
- msgAuthoritativeEngineBoots
- msgAuthoritativeEngineTime
- msgAuthenticationParameters
- msgPrivacyParameters
Schritt 3: msgAuthoritativeEngineID überprüfen (Check msgAuthoritativeEngineID)
Wenn der Wert des msgAuthoritativeEngineID-Feldes in den securityParameters unbekannt ist, dann:
Option a) Entdeckungsmodus (nicht-autoritative Engine) (Discovery Mode)
Eine nicht-autoritative SNMP-Engine, die Entdeckung durchführt, kann optional einen neuen Eintrag in ihrem lokalen Konfigurationsdatenspeicher (LCD) erstellen und die Verarbeitung fortsetzen.
Option b) Fehler zurückgeben (Return Error)
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.
Hinweis: Für den Fall, dass eine msgAuthoritativeEngineID mit Null-Länge oder einer anderen illegalen Größe empfangen wird, sollte Option b) gewählt werden, um die engineID-Entdeckung zu erleichtern. Andernfalls ist die Wahl zwischen a) und b) eine Implementierungsfrage.
Schritt 4: Benutzerinformationen nachschlagen (Lookup User Information)
Informationen über die Werte der Felder msgUserName und msgAuthoritativeEngineID werden aus dem lokalen Konfigurationsdatenspeicher (LCD, usmUserTable) extrahiert.
Wenn keine Informationen für den Benutzer verfügbar sind, dann:
- Wird der usmStatsUnknownUserNames-Zähler inkrementiert
- Wird eine Fehleranzeige (unknownSecurityName) zusammen mit der OID und dem Wert des inkrementierten Zählers an das aufrufende Modul zurückgegeben
Schritt 5: Sicherheitslevel-Support überprüfen (Check Security Level Support)
Wenn die Informationen über den Benutzer darauf hinweisen, dass er den vom Aufrufer angeforderten securityLevel nicht unterstützt, dann:
- Wird der usmStatsUnsupportedSecLevels-Zähler inkrementiert
- Wird eine Fehleranzeige (unsupportedSecurityLevel) zusammen mit der OID und dem Wert des inkrementierten Zählers an das aufrufende Modul zurückgegeben
Schritt 6: Nachricht authentifizieren (falls erforderlich) (Authenticate Message)
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 vorgenommen, das das Authentifizierungsprotokoll des Benutzers gemäß der abstrakten Dienstprimitive implementiert:
statusInformation = -- Erfolg oder Fehler
authenticateIncomingMsg(
IN authKey -- lokalisierter authKey des Benutzers
IN authParameters -- wie über das Netz empfangen
IN wholeMsg -- wie über das Netz empfangen
OUT authenticatedWholeMsg -- auf Authentifizierung überprüft
)
Parameter (Parameters):
-
statusInformation: Gibt 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
-
authParameters: Die msgAuthenticationParameters, wie sie in der Nachricht empfangen wurden
-
wholeMsg: Die vollständige serialisierte Nachricht, die authentifiziert werden soll
-
authenticatedWholeMsg: Identisch mit der Eingabe für den authenticateIncomingMsg-Dienst, aber nach Überprüfung der Authentifizierung
Fehlerbehandlung (Error Handling):
Wenn das Authentifizierungsmodul einen Fehler zurückgibt, kann der Nachricht nicht vertraut werden, daher:
- Wird der usmStatsWrongDigests-Zähler inkrementiert
- Wird eine Fehleranzeige (authenticationFailure) zusammen mit der OID und dem Wert des inkrementierten Zählers an das aufrufende Modul zurückgegeben
Wenn das Authentifizierungsmodul Erfolg zurückgibt, ist die Nachricht authentisch und kann vertraut werden, sodass die Verarbeitung fortgesetzt wird.
Schritt 7: Zeitfenster überprüfen (für authentifizierte Nachrichten) (Check Time Window)
Wenn der securityLevel eine authentifizierte Nachricht anzeigt, werden die lokalen Werte von snmpEngineBoots, snmpEngineTime und latestReceivedEngineTime, die dem Wert des msgAuthoritativeEngineID-Feldes entsprechen, aus dem lokalen Konfigurationsdatenspeicher extrahiert.
7a) Autoritative Engine (msgAuthoritativeEngineID == lokale snmpEngineID)
Wenn der extrahierte Wert von msgAuthoritativeEngineID mit dem Wert von snmpEngineID der verarbeitenden SNMP-Engine identisch ist (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 (Maximalwert erreicht)
-
Der Wert des msgAuthoritativeEngineBoots-Feldes unterscheidet sich vom lokalen Wert von snmpEngineBoots
-
Der Wert des msgAuthoritativeEngineTime-Feldes unterscheidet sich von der lokalen Vorstellung von snmpEngineTime um mehr als +/- 150 Sekunden
Wenn außerhalb des Zeitfensters:
- Wird der usmStatsNotInTimeWindows-Zähler inkrementiert
- Wird 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, an das aufrufende Modul zurückgegeben
7b) Nicht-autoritative Engine (msgAuthoritativeEngineID != lokale snmpEngineID)
Wenn der extrahierte Wert von msgAuthoritativeEngineID nicht mit dem Wert snmpEngineID der verarbeitenden SNMP-Engine identisch ist (was bedeutet, dass dies nicht die autoritative SNMP-Engine ist), dann:
7b.1) Zeitinformationen aktualisieren (falls neuer) (Update Time Information)
Wenn mindestens eine der folgenden Bedingungen wahr ist:
-
Der extrahierte Wert des msgAuthoritativeEngineBoots-Feldes ist größer als die lokale Vorstellung vom Wert von snmpEngineBoots; ODER
-
Der extrahierte Wert des msgAuthoritativeEngineBoots-Feldes ist gleich der lokalen Vorstellung vom Wert von snmpEngineBoots, UND der extrahierte Wert des msgAuthoritativeEngineTime-Feldes ist größer als der Wert von latestReceivedEngineTime
Dann wird der LCD-Eintrag, der dem extrahierten Wert des msgAuthoritativeEngineID-Feldes entspricht, aktualisiert, indem Folgendes gesetzt wird:
- Die lokale Vorstellung vom Wert von snmpEngineBoots auf den Wert des msgAuthoritativeEngineBoots-Feldes
- Die lokale Vorstellung vom Wert von snmpEngineTime auf den Wert des msgAuthoritativeEngineTime-Feldes
- Die latestReceivedEngineTime auf den Wert des msgAuthoritativeEngineTime-Feldes
7b.2) Zeitfenster überprüfen (Check Time Window)
Wenn eine der folgenden Bedingungen wahr ist, wird die Nachricht als außerhalb des Zeitfensters betrachtet:
-
Die lokale Vorstellung vom Wert von snmpEngineBoots ist 2147483647
-
Der Wert des msgAuthoritativeEngineBoots-Feldes ist kleiner als die lokale Vorstellung vom Wert von snmpEngineBoots
-
Der Wert des msgAuthoritativeEngineBoots-Feldes ist gleich der lokalen Vorstellung vom Wert von snmpEngineBoots UND der Wert des msgAuthoritativeEngineTime-Feldes ist mehr als 150 Sekunden weniger als die lokale Vorstellung vom Wert von snmpEngineTime
Wenn außerhalb des Zeitfensters:
- Wird der usmStatsNotInTimeWindows-Zähler inkrementiert
- Wird eine Fehleranzeige (notInTimeWindow) zusammen mit der OID und dem Wert des inkrementierten Zählers an das aufrufende Modul zurückgegeben
Schritt 8: Nachricht entschlüsseln (falls erforderlich) (Decrypt Message)
Wenn der securityLevel anzeigt, dass die Nachricht vor Offenlegung geschützt ist (Datenschutz), wird der OCTET STRING, der das encryptedPDU darstellt, gemäß dem Datenschutzprotokoll des Benutzers entschlüsselt.
Dazu wird ein Aufruf an das Datenschutzmodul vorgenommen, das das Datenschutzprotokoll des Benutzers gemäß der abstrakten Dienstprimitive implementiert:
statusInformation = -- Erfolg oder Fehler
decryptData(
IN decryptKey -- lokalisierter privKey des Benutzers
IN privParameters -- wie über das Netz empfangen
IN encryptedData -- empfangenes encryptedPDU
OUT decryptedData -- entschlüsseltes scopedPDU
)
Parameter (Parameters):
-
statusInformation: Gibt 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 wird
-
privParameters: Die msgPrivacyParameters, wie sie in der Nachricht empfangen wurden
-
encryptedData: Das encryptedPDU aus der Nachricht
-
decryptedData: Das entschlüsselte scopedPDU
Fehlerbehandlung (Error Handling):
Wenn das Datenschutzmodul einen Fehler zurückgibt, kann die Nachricht nicht verarbeitet werden, daher:
- Wird der usmStatsDecryptionErrors-Zähler inkrementiert
- Wird eine Fehleranzeige (decryptionError) zusammen mit der OID und dem Wert des inkrementierten Zählers an das aufrufende Modul zurückgegeben
Wenn das Datenschutzmodul Erfolg zurückgibt, wird das entschlüsselte scopedPDU für die weitere Verarbeitung verwendet.
Schritt 9: Ergebnisse zurückgeben (Return Results)
Die folgenden Werte werden an das aufrufende Nachrichtenverarbeitungsmodul zurückgegeben:
- securityEngineID: Die msgAuthoritativeEngineID
- securityName: Der msgUserName
- scopedPDU: Entweder das entschlüsselte scopedPDU (bei Datenschutz) oder das Klartext-scopedPDU
- maxSizeResponseScopedPDU: Berechnet basierend auf den Nachrichtengrößenbeschränkungen
- securityStateReference: Referenz auf die zwischengespeicherten Sicherheitsdaten
Processing Flow Summary (Zusammenfassung des Verarbeitungsablaufs)
1. securityParameters analysieren
2. Sicherheitsparameterfelder extrahieren
3. msgAuthoritativeEngineID überprüfen (unbekannt -> Fehler oder Eintrag erstellen)
4. Benutzer im LCD nachschlagen (unbekannter Benutzer -> Fehler)
5. Sicherheitslevel-Support überprüfen (nicht unterstützt -> Fehler)
6. Nachricht authentifizieren (falls authNoPriv oder authPriv)
└─> MAC/Digest überprüfen (falsch -> Fehler)
7. Zeitfenster überprüfen (falls authentifiziert)
└─> Für autoritativ: boots und time validieren
└─> Für nicht-autoritativ: Zeitinformationen aktualisieren falls neuer, dann validieren
└─> Außerhalb des Fensters -> Fehler
8. Nachricht entschlüsseln (falls authPriv)
└─> encryptedPDU entschlüsseln (fehlgeschlagen -> Fehler)
9. securityEngineID, securityName, scopedPDU usw. zurückgeben
Error Conditions Summary (Zusammenfassung der Fehlerbedingungen)
| Fehler (Error) | Zähler (Counter) | Bedingung (Condition) |
|---|---|---|
| parseError | snmpInASNParseErrs | Ungültiges securityParameters-Format |
| unknownEngineID | usmStatsUnknownEngineIDs | Unbekannte msgAuthoritativeEngineID |
| unknownSecurityName | usmStatsUnknownUserNames | Benutzer im LCD nicht gefunden |
| unsupportedSecurityLevel | usmStatsUnsupportedSecLevels | Benutzer unterstützt angefordertes Level nicht |
| authenticationFailure | usmStatsWrongDigests | Authentifizierungsprüfung fehlgeschlagen |
| notInTimeWindow | usmStatsNotInTimeWindows | Nachricht außerhalb 150-Sekunden-Fenster |
| decryptionError | usmStatsDecryptionErrors | Entschlüsselung fehlgeschlagen |
Implementation Notes (Implementierungshinweise)
-
Zustandsverwaltung (State Management): Implementierungen sollten securityStateReference-Daten ordnungsgemäß verwalten und freigeben
-
Berichtsgenerierung (Report Generation): Viele Fehler führen dazu, dass Report-PDUs mit entsprechenden Fehlerzählern an den Absender zurückgesendet werden
-
Zeitsynchronisation (Time Synchronization): Nicht-autoritative Engines aktualisieren automatisch ihre Zeitinformationen, wenn sie Nachrichten mit neueren Zeitwerten von autoritativen Engines empfangen
-
Entdeckung (Discovery): Nicht-autoritative Engines können optional über neue Engines lernen, indem sie während der Entdeckung LCD-Einträge erstellen
-
Sicherheitslevel in Berichten (Security Level in Reports): Der notInTimeWindow-Fehler muss mit securityLevel authNoPriv (nicht authPriv) gemeldet werden, damit der Absender den Bericht empfangen und verarbeiten kann