2.4. SNMP Messages Using this Security Model (SNMP-Nachrichten unter Verwendung dieses Sicherheitsmodells)
2.4. SNMP Messages Using this Security Model (SNMP-Nachrichten unter Verwendung dieses Sicherheitsmodells)
Dieser Abschnitt beschreibt das Format und die Struktur von SNMP-Nachrichten bei Verwendung des benutzerbasierten Sicherheitsmodells.
SNMPv3 Message Format (SNMPv3-Nachrichtenformat)
Eine SNMPv3-Nachricht unter Verwendung von USM hat folgende Struktur:
SNMPv3Message ::= SEQUENCE {
msgVersion INTEGER (3),
msgGlobalData HeaderData,
msgSecurityParameters OCTET STRING,
msgData ScopedPduData
}
Message Components (Nachrichtenkomponenten)
1. msgVersion (Nachrichtenversion)
- Typ (Type): INTEGER
- Wert (Value): 3 (für SNMPv3)
- Zweck (Purpose): Identifiziert die SNMP-Version
2. msgGlobalData (HeaderData) (Globale Nachrichtendaten)
Enthält globale Nachrichtenkopfzeileninfo:
HeaderData ::= SEQUENCE {
msgID INTEGER (0..2147483647),
msgMaxSize INTEGER (484..2147483647),
msgFlags OCTET STRING (SIZE(1)),
msgSecurityModel INTEGER (1..2147483647)
}
Felder (Fields):
-
msgID (Nachrichten-ID): Eindeutige Kennung zur Koordinierung von Anfrage- und Antwortnachrichten
- Bereich: 0 bis 2147483647
- Wird vom Anfrage/Antwort-Modell verwendet, um Antworten mit Anfragen abzugleichen
-
msgMaxSize (Maximale Nachrichtengröße): Maximale Nachrichtengröße, die der Absender akzeptieren kann
- Minimum: 484 Oktette
- Wird für die Nachrichtengrößenverhandlung verwendet
-
msgFlags (Nachrichtenflags): OCTET STRING von 1 Oktett mit Bit-Flags
- Bit 0 (LSB):
authFlag- 1, wenn Authentifizierung verwendet wird, sonst 0 - Bit 1:
privFlag- 1, wenn Datenschutz (Verschlüsselung) verwendet wird, sonst 0 - Bit 2:
reportableFlag- 1, wenn bei Fehler ein Report-PDU gesendet werden soll - Bits 3-7: Reserviert, müssen Null sein
- Bit 0 (LSB):
-
msgSecurityModel (Nachrichtensicherheitsmodell): Identifiziert das verwendete Sicherheitsmodell
- Wert: 3 für benutzerbasiertes Sicherheitsmodell (USM)
3. msgSecurityParameters (Nachrichtensicherheitsparameter)
Für USM ist dies ein OCTET STRING, der die BER-kodierten UsmSecurityParameters enthält:
UsmSecurityParameters ::= SEQUENCE {
msgAuthoritativeEngineID OCTET STRING,
msgAuthoritativeEngineBoots INTEGER (0..2147483647),
msgAuthoritativeEngineTime INTEGER (0..2147483647),
msgUserName OCTET STRING (SIZE(0..32)),
msgAuthenticationParameters OCTET STRING,
msgPrivacyParameters OCTET STRING
}
Felder (Fields):
-
msgAuthoritativeEngineID (Autoritative Engine-ID): Die snmpEngineID der autoritativen SNMP-Engine
- Für Anfragen: Die engineID des Befehlsresponders
- Für Benachrichtigungen: Die engineID des Benachrichtigungsinitiators
- Für Antworten: Die engineID des Befehlsresponders
- Für Berichte: Die engineID des Berichtsenders
-
msgAuthoritativeEngineBoots (Autoritative Engine-Starts): Boot-Zähler der autoritativen Engine
- Bereich: 0 bis 2147483647
- Wird bei Neuinitialisierung der Engine inkrementiert
- Wird für Replay-Schutz verwendet
-
msgAuthoritativeEngineTime (Autoritative Engine-Zeit): Anzahl der Sekunden seit dem letzten Start
- Bereich: 0 bis 2147483647
- Wird jede Sekunde inkrementiert
- Wird für Replay-Schutz und Zeitfenster-Verifizierung verwendet
-
msgUserName (Benutzername): Der Benutzer (Principal), in dessen Namen die Nachricht gesendet wird
- Länge: 0 bis 32 Oktette
- Muss in der usmUserTable der autoritativen Engine existieren
- Groß-/Kleinschreibung beachtend
-
msgAuthenticationParameters (Authentifizierungsparameter): Authentifizierungs-Digest
- Länge hängt vom Authentifizierungsprotokoll ab:
- HMAC-MD5-96: 12 Oktette
- HMAC-SHA-96: 12 Oktette
- Leer (Null-Länge), wenn keine Authentifizierung
- Über die gesamte Nachricht berechnet (mit diesem Feld zunächst auf Null gesetzt)
- Länge hängt vom Authentifizierungsprotokoll ab:
-
msgPrivacyParameters (Datenschutzparameter): Datenschutzprotokollparameter
- Für CBC-DES: 8 Oktette (Salzwert)
- Leer (Null-Länge), wenn kein Datenschutz
- Wird verwendet, um unterschiedliche Cipher-Initialisierungsvektoren sicherzustellen
4. msgData (ScopedPduData) (Nachrichtendaten)
Die Nachrichtennutzlast, die entweder Klartext oder verschlüsselt sein kann:
ScopedPduData ::= CHOICE {
plaintext ScopedPDU,
encryptedPDU OCTET STRING
}
Wenn Datenschutz NICHT verwendet wird (privFlag = 0):
- msgData enthält
plaintext ScopedPDU(Klartext)
Wenn Datenschutz verwendet wird (privFlag = 1):
- msgData enthält
encryptedPDU(OCTET STRING) - Die verschlüsselten Daten sind das BER-kodierte ScopedPDU
ScopedPDU Format (ScopedPDU-Format)
ScopedPDU ::= SEQUENCE {
contextEngineID OCTET STRING,
contextName OCTET STRING,
data ANY -- PDU from RFC 3416
}
Felder (Fields):
-
contextEngineID (Kontext-Engine-ID): Die snmpEngineID für den Kontext
- Typischerweise gleich msgAuthoritativeEngineID für Nicht-Proxy-Szenarien
- Kann in Proxy-Szenarien abweichen
-
contextName (Kontextname): Der Kontextname
- Wird mit contextEngineID verwendet, um die Verwaltungsinformationen zu identifizieren
- Ermöglicht mehrere virtuelle SNMP-Kontexte auf einer einzelnen Engine
-
data (Daten): Das tatsächliche SNMP-PDU
- GetRequest, GetNextRequest, GetBulkRequest, SetRequest, InformRequest, SNMPv2-Trap, Response oder Report
Security Level Combinations (Sicherheitsstufen-Kombinationen)
Die msgFlags bestimmen drei Sicherheitsstufen:
-
noAuthNoPriv (Keine Authentifizierung, kein Datenschutz):
authFlag=0, privFlag=0- Keine Authentifizierung, kein Datenschutz
- msgAuthenticationParameters ist leer
- msgPrivacyParameters ist leer
- msgData ist Klartext
-
authNoPriv (Authentifizierung ohne Datenschutz):
authFlag=1, privFlag=0- Authentifizierung ohne Datenschutz
- msgAuthenticationParameters enthält Digest
- msgPrivacyParameters ist leer
- msgData ist Klartext
-
authPriv (Authentifizierung mit Datenschutz):
authFlag=1, privFlag=1- Authentifizierung und Datenschutz
- msgAuthenticationParameters enthält Digest
- msgPrivacyParameters enthält Datenschutzparameter
- msgData ist verschlüsselt
Hinweis: Datenschutz ohne Authentifizierung (authFlag=0, privFlag=1) ist nicht erlaubt. Solche Nachrichten müssen abgelehnt werden.
Message Flow Examples (Nachrichtenfluss-Beispiele)
Beispiel 1: noAuthNoPriv Entdeckungsanfrage
SNMPv3Message {
msgVersion: 3,
msgGlobalData: {
msgID: 12345,
msgMaxSize: 65507,
msgFlags: 0x04 (reportableFlag gesetzt),
msgSecurityModel: 3
},
msgSecurityParameters: {
msgAuthoritativeEngineID: "",
msgAuthoritativeEngineBoots: 0,
msgAuthoritativeEngineTime: 0,
msgUserName: "",
msgAuthenticationParameters: "",
msgPrivacyParameters: ""
},
msgData: plaintext ScopedPDU {
contextEngineID: "",
contextName: "",
data: GetRequest-PDU
}
}
Beispiel 2: authPriv Authentifizierte und verschlüsselte Anfrage
SNMPv3Message {
msgVersion: 3,
msgGlobalData: {
msgID: 12346,
msgMaxSize: 65507,
msgFlags: 0x07 (authFlag, privFlag, reportableFlag),
msgSecurityModel: 3
},
msgSecurityParameters: {
msgAuthoritativeEngineID: 0x80001F8880...,
msgAuthoritativeEngineBoots: 15,
msgAuthoritativeEngineTime: 3045678,
msgUserName: "admin",
msgAuthenticationParameters: 0x9F3B7A2E... (12 Oktette),
msgPrivacyParameters: 0x0000000012345678 (8 Oktette)
},
msgData: encryptedPDU (verschlüsseltes ScopedPDU)
}
Message Size Considerations (Überlegungen zur Nachrichtengröße)
Die minimale Nachrichtengröße, die Implementierungen unterstützen müssen, beträgt 484 Oktette. Dies gewährleistet:
- Platz für Nachrichtenkopfzeilen
- Mindestens minimalen PDU-Inhalt
- Sicherheitsparameter einschließlich Authentifizierungs-Digest
Implementierungen sollten größere Nachrichten unterstützen (z.B. 65507 Oktette für UDP auf IPv4), um Folgendes zu ermöglichen:
- Große Variablenbindungen
- GetBulk-Antworten mit vielen Elementen
- Verschlüsselte Nachrichten mit Padding-Overhead
Special Message Cases (Spezielle Nachrichtenfälle)
Report Messages (Berichtsnachrichten)
Report-PDUs sind spezielle Antworten, die für Fehlerbenachrichtigung und Informationsaustausch (Entdeckung, Zeitsynchronisation) verwendet werden. Sie:
- Können ohne Authentifizierung gesendet werden (für Entdeckung)
- Können mit Authentifizierung gesendet werden (für andere Fehler)
- Enthalten eine einzelne Variablenbindung mit einer Fehlerzähler-OID
- Verwenden die msgID aus der Nachricht, die den Bericht verursacht hat
Notification Messages (Benachrichtigungsnachrichten)
Für InformRequest- und SNMPv2-Trap-PDUs:
- Der Benachrichtigungsinitiator (notification originator) ist die autoritative Engine
- msgAuthoritativeEngineID ist die engineID des Initiators
- Der Benachrichtigungsempfänger muss die Zeitwerte des Initiators zwischenspeichern
Dies ist das Gegenteil des Befehlsresponder-Modells, bei dem der Befehlsresponder autoritativ ist.