7. Verfahrenselemente von v3MP
Dieser Abschnitt beschreibt das Verfahren, das das SNMPv3-Nachrichtenverarbeitungsmodell befolgt, wenn es SNMP-Nachrichten generiert und verarbeitet. Das SNMPv3-Nachrichtenverarbeitungsmodell interagiert mit dem Sicherheitssubsystem bei der Generierung und Verarbeitung von Nachrichten.
7.1. Vorbereitung einer ausgehenden SNMP-Nachricht
Dieser Abschnitt beschreibt das Verfahren, das das SNMPv3-Nachrichtenverarbeitungsmodell befolgt, wenn es eine ausgehende SNMP-Nachricht vorbereitet.
Dieses Verfahren wird vom Dispatcher unter Verwendung des abstrakten Service-Interface prepareOutgoingMessage aufgerufen.
Verfahren:
-
Das Nachrichtenverarbeitungsmodell verwendet den Local Configuration Datastore (LCD), um die maximale Nachrichtengröße zu bestimmen, die die lokale SNMP-Engine unterstützt. Dies wird durch snmpEngineMaxMessageSize dargestellt, wie in [RFC3411] definiert. Das Nachrichtenverarbeitungsmodell bestimmt auch die snmpEngineID der lokalen SNMP-Engine. Dies wird durch snmpEngineID dargestellt, wie in [RFC3411] definiert.
-
Wenn die Länge der contextEngineID null ist oder nicht gleich der snmpEngineID der lokalen SNMP-Engine ist:
a) Wenn der Wert von pduType ein bestätigter Klasse-PDU-Typ (Get, GetNext, GetBulk, Set oder Inform) ist:
- v3MP erstellt eine msgID. Die msgID wird verwendet, um Anfrage und Antwort zu koordinieren.
b) Wenn der Wert von pduType ein unbestätigter Klasse-PDU-Typ (Trap, Report, Response) ist:
- v3MP erstellt eine msgID. Die msgID wird nicht verwendet, um Anfrage und Antwort zu koordinieren, wird aber intern von v3MP verwendet.
-
v3MP erstellt msgMaxSize. msgMaxSize ist der Mindestwert von:
- der maximalen Nachrichtengröße, die von der lokalen SNMP-Engine unterstützt wird (snmpEngineMaxMessageSize), und
- der maximalen Nachrichtengröße, die vom Transportdomäne und der Transportadresse unterstützt werden kann, die zum Senden der Nachricht verwendet werden.
-
v3MP erstellt msgFlags. msgFlags werden basierend auf securityLevel erstellt:
- Wenn securityLevel noAuthNoPriv angibt, msgFlags auth-Bit = 0 und priv-Bit = 0.
- Wenn securityLevel authNoPriv angibt, msgFlags auth-Bit = 1 und priv-Bit = 0.
- Wenn securityLevel authPriv angibt, msgFlags auth-Bit = 1 und priv-Bit = 1.
-
Wenn pduType ein bestätigter Klasse-PDU-Typ ist, wird das msgFlags reportable-Bit auf 1 gesetzt. Andernfalls wird das msgFlags reportable-Bit auf 0 gesetzt.
-
v3MP erstellt eine scopedPDU unter Verwendung der Werte von contextEngineID, contextName und PDU.
-
v3MP erstellt das msgSecurityParameters-Feld der ausgehenden Nachricht. Dies geschieht durch Aufruf des durch den securityModel-Parameter identifizierten Sicherheitsmodells unter Verwendung des abstrakten Service-Interface generateRequestMsg oder generateResponseMsg, je nach Bedarf.
a) Bei der Vorbereitung einer Anfrage oder Benachrichtigung ruft v3MP das Sicherheitsmodell mit dem abstrakten generateRequestMsg-Service-Interface auf:
statusInformation = generateRequestMsg(
IN messageProcessingModel -- in diesem Fall SNMPv3
IN globalData -- msgID, msgMaxSize, msgFlags, msgSecurityModel
IN maxMessageSize -- oben bestimmte maximale Nachrichtengröße
IN securityModel -- verwendetes Sicherheitsmodell
IN securityEngineID -- autoritative SNMP-Engine
IN securityName -- Prinzipal
IN securityLevel -- gefordertes Sicherheitsniveau
IN scopedPDU -- zu schützende Nachricht
OUT securityParameters -- vom Sicherheitsmodell ausgefüllt
OUT wholeMsg -- vollständig generierte Nachricht
OUT wholeMsgLength -- Länge der generierten Nachricht
)
b) Bei der Vorbereitung einer Antwort ruft v3MP das Sicherheitsmodell mit dem abstrakten generateResponseMsg-Service-Interface auf:
statusInformation = generateResponseMsg(
IN messageProcessingModel -- in diesem Fall SNMPv3
IN globalData -- msgID, msgMaxSize, msgFlags, msgSecurityModel
IN maxMessageSize -- oben bestimmte maximale Nachrichtengröße
IN securityModel -- verwendetes Sicherheitsmodell
IN securityEngineID -- autoritative SNMP-Engine
IN securityName -- Prinzipal
IN securityLevel -- Sicherheitsniveau
IN scopedPDU -- zu schützende Nachricht
IN securityStateReference -- Referenz auf Sicherheitszustandsinformationen
OUT securityParameters -- vom Sicherheitsmodell ausgefüllt
OUT wholeMsg -- vollständig generierte Nachricht
OUT wholeMsgLength -- Länge der generierten Nachricht
)
-
Wenn statusInformation einen Fehler anzeigt, gibt v3MP statusInformation an den Dispatcher zurück. Die Nachrichtenverarbeitung wird gestoppt.
-
Wenn statusInformation Erfolg anzeigt, gibt v3MP outgoingMessage und outgoingMessageLength an den Dispatcher zurück.
7.2. Vorbereitung von Datenelementen aus einer empfangenen SNMP-Nachricht
Dieser Abschnitt beschreibt das Verfahren, das das SNMPv3-Nachrichtenverarbeitungsmodell befolgt, wenn es Datenelemente aus einer empfangenen SNMP-Nachricht vorbereitet.
Dieses Verfahren wird vom Dispatcher unter Verwendung des abstrakten Service-Interface prepareDataElements aufgerufen.
Verfahren:
-
v3MP parst die empfangene Nachricht, um die folgenden Felder zu extrahieren:
- msgVersion
- msgID
- msgMaxSize
- msgFlags
- msgSecurityModel
- msgSecurityParameters
- scopedPduData
-
Wenn msgVersion nicht 3 ist, gibt v3MP einen Fehler an den Dispatcher zurück. Die Nachrichtenverarbeitung wird gestoppt.
-
Wenn scopedPduData nicht geparst werden kann, wird der snmpInASNParseErrs-Zähler [RFC3418] erhöht. v3MP gibt einen Fehler an den Dispatcher zurück. Die Nachrichtenverarbeitung wird gestoppt.
-
msgFlags werden geparst, um die auth-, priv- und reportable-Bits zu extrahieren.
-
Wenn das auth-Bit 0 und das priv-Bit 1 ist, ist dies ein Fehler. Der snmpInvalidMsgs-Zähler [RFC3418] wird erhöht. v3MP gibt einen Fehler an den Dispatcher zurück. Die Nachrichtenverarbeitung wird gestoppt.
-
Bestimmen Sie securityLevel aus msgFlags:
- Wenn auth-Bit = 0 und priv-Bit = 0, dann securityLevel = noAuthNoPriv
- Wenn auth-Bit = 1 und priv-Bit = 0, dann securityLevel = authNoPriv
- Wenn auth-Bit = 1 und priv-Bit = 1, dann securityLevel = authPriv
-
v3MP ruft das durch msgSecurityModel identifizierte Sicherheitsmodell mit dem abstrakten processIncomingMsg-Service-Interface auf:
statusInformation = processIncomingMsg(
IN messageProcessingModel -- in diesem Fall SNMPv3
IN maxMessageSize -- vom Absender bestimmte maximale Nachrichtengröße
IN securityParameters -- Sicherheitsparameter aus empfangener Nachricht
IN securityModel -- verwendetes Sicherheitsmodell
IN securityLevel -- Sicherheitsniveau
IN wholeMsg -- gesamte Nachricht
IN wholeMsgLength -- Länge der gesamten Nachricht
OUT securityEngineID -- autoritative SNMP-Engine
OUT securityName -- Identifikation des Prinzipals
OUT scopedPDU -- Nachricht (Klartext)
OUT maxSizeResponseScopedPDU -- maximale Größe der Antwort-PDU
OUT securityStateReference -- Referenz auf Sicherheitszustandsinformationen
)
-
Wenn statusInformation einen Fehler anzeigt:
a) Wenn das reportable-Bit 1 ist und pduType ein bestätigter Klasse-PDU ist, erstellt v3MP eine Report-PDU unter Verwendung von usmStatsUnknownEngineIDs, usmStatsNotInTimeWindows, usmStatsUnknownUserNames, usmStatsWrongDigests, usmStatsDecryptionErrors oder einem anderen geeigneten Fehlerzähler und ruft den Dispatcher mit dem returnResponsePdu-Service-Interface auf.
b) v3MP gibt einen Fehler an den Dispatcher zurück. Die Nachrichtenverarbeitung wird gestoppt.
-
Wenn statusInformation Erfolg anzeigt:
a) Parsen Sie scopedPDU, um Folgendes zu extrahieren:
- contextEngineID
- contextName
- data (PDU)
b) Wenn scopedPDU nicht geparst werden kann, wird der snmpInASNParseErrs-Zähler erhöht. v3MP gibt einen Fehler an den Dispatcher zurück. Die Nachrichtenverarbeitung wird gestoppt.
-
Parsen Sie die PDU, um pduType und andere PDU-spezifische Informationen zu bestimmen:
a) Wenn die PDU nicht geparst werden kann, wird der snmpInASNParseErrs-Zähler erhöht. v3MP gibt einen Fehler an den Dispatcher zurück. Die Nachrichtenverarbeitung wird gestoppt.
- v3MP gibt die folgenden Datenelemente an den Dispatcher zurück:
- messageProcessingModel (3 für SNMPv3)
- securityModel
- securityName
- securityLevel
- contextEngineID
- contextName
- pduVersion
- PDU
- pduType
- sendPduHandle (falls zutreffend, aus request-id in der PDU extrahiert)
- maxSizeResponseScopedPDU
- statusInformation (Erfolg)
- stateReference (securityStateReference vom Sicherheitsmodell)
- Die Verarbeitung ist abgeschlossen.