3.1. Generating an Outgoing SNMP Message (Generieren einer ausgehenden SNMP-Nachricht)
3.1. Generating an Outgoing SNMP Message (Generieren einer ausgehenden SNMP-Nachricht)
Dieser Abschnitt beschreibt die Vorgehensweise einer SNMP-Engine, wenn sie eine Nachricht mit einer Verwaltungsoperation (wie Anfrage, Antwort, Benachrichtigung oder Bericht) im Namen eines Benutzers mit einem bestimmten securityLevel generiert.
Schritt 1: Benutzerinformationen bestimmen (Determine User Information)
1a) Antwort- oder Berichtsnachricht (Response or Report Message)
Wenn eine securityStateReference übergeben wird (Antwort- oder Berichtsnachricht), 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
1b) Anfrage- oder Benachrichtigungsnachricht (Request or Notification Message)
Andernfalls werden basierend auf dem securityName Informationen über den Benutzer an der Ziel-snmpEngineID, die durch die securityEngineID angegeben ist, aus dem lokalen Konfigurationsdatenspeicher (LCD, usmUserTable) extrahiert.
Wenn Informationen über den Benutzer im LCD fehlen, wird eine Fehleranzeige (unknownSecurityName) an das aufrufende Modul zurückgegeben.
Schritt 2: Datenschutz-Support überprüfen (Check Privacy Support)
Wenn der securityLevel angibt, dass die Nachricht vor Offenlegung geschützt werden soll, der Benutzer aber nicht sowohl ein Authentifizierungs- als auch ein Datenschutzprotokoll unterstützt, kann die Nachricht nicht gesendet werden.
Eine Fehleranzeige (unsupportedSecurityLevel) wird an das aufrufende Modul zurückgegeben.
Hinweis: Datenschutz (Verschlüsselung) erfordert Authentifizierung. Die Kombination noAuth + privacy ist nicht erlaubt.
Schritt 3: Authentifizierungs-Support überprüfen (Check Authentication Support)
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.
Schritt 4: Nachricht verschlüsseln (falls erforderlich) (Encrypt the Message)
4a) Mit Datenschutz (authPriv)
Wenn der securityLevel angibt, dass die Nachricht vor Offenlegung geschützt werden soll, wird die Oktettsequenz, die das serialisierte scopedPDU darstellt, gemäß dem Datenschutzprotokoll des Benutzers verschlüsselt.
Dazu wird ein Aufruf an das Datenschutzmodul vorgenommen, das das Datenschutzprotokoll des Benutzers gemäß der abstrakten Primitive implementiert:
statusInformation = -- Erfolg oder Fehler
encryptData(
IN encryptKey -- lokalisierter privKey des Benutzers
IN dataToEncrypt -- serialisiertes scopedPDU
OUT encryptedData -- serialisiertes encryptedPDU
OUT privParameters -- serialisierte Datenschutzparameter
)
Parameter (Parameters):
-
statusInformation: Gibt 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: Das serialisierte scopedPDU sind die zu verschlüsselnden Daten
-
encryptedData: Das encryptedPDU repräsentiert das verschlüsselte scopedPDU, kodiert als OCTET STRING
-
privParameters: Die Datenschutzparameter, kodiert als OCTET STRING
Fehlerbehandlung (Error Handling):
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, dann:
- Werden die zurückgegebenen privParameters in das msgPrivacyParameters-Feld der securityParameters eingefügt
- Dient das encryptedPDU als Nutzlast der vorbereiteten Nachricht
4b) Ohne Datenschutz (noAuthNoPriv oder authNoPriv)
Wenn der securityLevel angibt, dass die Nachricht nicht vor Offenlegung geschützt werden soll, dann:
- Wird ein OCTET STRING mit Null-Länge in das msgPrivacyParameters-Feld der securityParameters kodiert
- Dient das Klartext-scopedPDU als Nutzlast der vorbereiteten Nachricht
Schritt 5: msgAuthoritativeEngineID setzen
Die securityEngineID wird als OCTET STRING in das msgAuthoritativeEngineID-Feld der securityParameters kodiert.
Hinweis: Eine leere (Null-Länge) securityEngineID ist für eine Anfragenachricht in Ordnung, da dies dazu führt, dass die entfernte (autoritative) SNMP-Engine ein Report-PDU mit der richtigen securityEngineID zurückgibt, die in der msgAuthoritativeEngineID in den securityParameters dieses zurückgegebenen Report-PDU enthalten ist. Dies ist Teil des Entdeckungsmechanismus.
Schritt 6: snmpEngineBoots und snmpEngineTime setzen
6a) Authentifizierte Nachricht (Authenticated Message)
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.
6b) Antwort- oder Berichtsnachricht (nicht authentifiziert) (Response or Report Message - unauthenticated)
Andernfalls, wenn dies eine Antwort- oder Berichtsnachricht ist, werden die aktuellen Werte von snmpEngineBoots und snmpEngineTime, die der lokalen snmpEngineID aus dem LCD entsprechen, verwendet.
6c) Andere nicht authentifizierte Nachrichten (Other Unauthenticated Messages)
Andernfalls (dies ist eine nicht authentifizierte Anfrage oder Benachrichtigung) werden sowohl snmpEngineBoots als auch snmpEngineTime auf Null gesetzt.
Schritt 7: Zeitwerte kodieren (Encode Time Values)
Die Werte von msgAuthoritativeEngineBoots und msgAuthoritativeEngineTime werden auf die in Schritt 6 bestimmten Werte gesetzt und als INTEGER-Werte in die securityParameters kodiert.
Schritt 8: msgUserName setzen
Das msgUserName-Feld wird auf den securityName gesetzt und als OCTET STRING in die securityParameters kodiert.
Schritt 9: Nachricht authentifizieren (falls erforderlich) (Authenticate the Message)
9a) Mit Authentifizierung (authNoPriv oder authPriv)
Wenn der securityLevel angibt, dass die Nachricht authentifiziert werden soll, wird die Nachricht gemäß dem Authentifizierungsprotokoll des Benutzers authentifiziert.
Das msgAuthenticationParameters-Feld wird auf die Serialisierung gemäß den Regeln des Authentifizierungsprotokolls gesetzt von:
authenticationInformation =
authenticationAlgorithm(
IN authKey -- lokalisierter authKey des Benutzers
IN wholeMsg -- nicht authentifizierte Nachricht
)
Prozess (Process):
-
Das msgAuthenticationParameters-Feld wird vorübergehend mit einem vom Authentifizierungsprotokoll bestimmten Wert gefüllt (typischerweise 12 Null-Oktette für HMAC-MD5-96 und HMAC-SHA-96)
-
Der Authentifizierungsalgorithmus wird über die gesamte serialisierte Nachricht (wholeMsg) ausgeführt
-
Die Ausgabe des Authentifizierungsalgorithmus (der MAC/Digest) ersetzt den temporären Wert in msgAuthenticationParameters
Parameter (Parameters):
-
authKey: Der lokalisierte private authKey des Benutzers ist der geheime Schlüssel, der vom Authentifizierungsalgorithmus verwendet wird
-
wholeMsg: Die nicht authentifizierte Nachricht (mit msgAuthenticationParameters vorübergehend auf Null gesetzt)
-
authenticationInformation: Der berechnete Authentifizierungs-Digest/MAC
Der berechnete Authentifizierungs-Digest wird in das msgAuthenticationParameters-Feld eingefügt.
9b) Ohne Authentifizierung (noAuthNoPriv)
Wenn der securityLevel angibt, dass die Nachricht nicht authentifiziert werden soll, wird ein OCTET STRING mit Null-Länge in das msgAuthenticationParameters-Feld kodiert.
Schritt 10: Abschließen und zurückgeben (Finalize and Return)
Die vollständige wholeMsg wird zusammen mit statusInformation, die Erfolg anzeigt, an das aufrufende Modul zurückgegeben.
Message Generation Flow Summary (Zusammenfassung des Nachrichtengenerierungsablaufs)
1. Benutzerinformationen nachschlagen (aus Cache oder LCD)
2. Sicherheitslevel-Support validieren
3. Authentifizierungs-Support überprüfen
4. scopedPDU verschlüsseln (falls authPriv)
└─> msgPrivacyParameters setzen
5. msgAuthoritativeEngineID setzen
6. Zeitwerte bestimmen (boots/time)
7. Zeitwerte kodieren
8. msgUserName setzen
9. Nachricht authentifizieren (falls authNoPriv oder authPriv)
└─> MAC/Digest berechnen
└─> msgAuthenticationParameters setzen
10. Vollständige wholeMsg zurückgeben
Special Cases (Spezialfälle)
Discovery Messages (Entdeckungsnachrichten)
Für Entdeckungsnachrichten:
- securityEngineID ist leer (Null-Länge)
- securityLevel ist noAuthNoPriv
- msgAuthoritativeEngineID ist leer
- msgAuthoritativeEngineBoots und msgAuthoritativeEngineTime sind Null
- msgUserName ist leer
- msgAuthenticationParameters ist leer
- msgPrivacyParameters ist leer
Notification Messages (Benachrichtigungsnachrichten)
Für Benachrichtigungsnachrichten (Trap, Inform):
- Der Benachrichtigungsinitiator (notification originator) ist die autoritative Engine
- securityEngineID ist die lokale snmpEngineID
- Lokale snmpEngineBoots- und snmpEngineTime-Werte verwenden
Error Conditions (Fehlerbedingungen)
Die folgenden Fehleranzeigen können zurückgegeben werden:
| Fehler (Error) | Bedingung (Condition) |
|---|---|
| unknownSecurityName | Benutzer im LCD nicht gefunden |
| unsupportedSecurityLevel | Benutzer fehlt erforderliches Authentifizierungs- oder Datenschutzprotokoll |
| encryptionError | Datenschutzmodul konnte Daten nicht verschlüsseln |
Implementation Notes (Implementierungshinweise)
-
Zwischengespeicherte Sicherheitsdaten (Cached Security Data): Für Antwort- und Berichtsnachrichten werden Sicherheitsinformationen aus zwischengespeicherten Daten abgerufen, die während der Verarbeitung der ursprünglichen Anfragenachricht gespeichert wurden
-
Zeitsynchronisation (Time Synchronization): Authentifizierte Nachrichten verwenden die Zeitwerte aus dem LCD für die Ziel-autoritative Engine. Diese Werte müssen synchron gehalten werden (siehe Abschnitt 4 zur Entdeckung)
-
Schlüsselverwendung (Key Usage): Der lokalisierte authKey und privKey für die spezifische securityEngineID müssen verwendet werden
-
Nachrichtengröße (Message Size): Die Implementierung muss sicherstellen, dass die generierte Nachricht die mit der entfernten Engine ausgehandelte maxMessageSize nicht überschreitet