Zum Hauptinhalt springen

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:

  1. 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.

  2. 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.
  3. 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.
  4. 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.
  5. 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.

  6. v3MP erstellt eine scopedPDU unter Verwendung der Werte von contextEngineID, contextName und PDU.

  7. 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
)
  1. Wenn statusInformation einen Fehler anzeigt, gibt v3MP statusInformation an den Dispatcher zurück. Die Nachrichtenverarbeitung wird gestoppt.

  2. 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:

  1. v3MP parst die empfangene Nachricht, um die folgenden Felder zu extrahieren:

    • msgVersion
    • msgID
    • msgMaxSize
    • msgFlags
    • msgSecurityModel
    • msgSecurityParameters
    • scopedPduData
  2. Wenn msgVersion nicht 3 ist, gibt v3MP einen Fehler an den Dispatcher zurück. Die Nachrichtenverarbeitung wird gestoppt.

  3. 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.

  4. msgFlags werden geparst, um die auth-, priv- und reportable-Bits zu extrahieren.

  5. 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.

  6. 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
  7. 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
)
  1. 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.

  2. 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.

  3. 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.

  1. 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)
  1. Die Verarbeitung ist abgeschlossen.