4. Abstract Service Interfaces (Abstrakte Service-Schnittstellen)
4. Abstract Service Interfaces (Abstrakte Service-Schnittstellen)
Dieser Abschnitt beschreibt die abstrakten Service-Schnittstellen zwischen den Hauptkomponenten der SNMP-Architektur. Diese Schnittstellen werden unter Verwendung abstrakter Primitive definiert, die die Informationen darstellen, die zwischen Komponenten übergeben werden müssen, ohne zu spezifizieren, wie sie übergeben werden.
Die abstrakten Service-Schnittstellen sind in mehrere Kategorien organisiert:
- Dispatcher-Primitive: Schnittstellen zwischen Anwendungen und dem Dispatcher
- Message Processing Subsystem-Primitive: Schnittstellen zwischen dem Dispatcher und Message Processing Models
- Access Control Subsystem-Primitive: Schnittstellen zwischen Anwendungen und dem Access Control Subsystem
- Security Subsystem-Primitive: Schnittstellen zwischen Message Processing Models und Security Models
4.1. Dispatcher Primitives (Dispatcher-Primitive)
Der Dispatcher bietet Anwendungen Dienste zum Senden und Empfangen von SNMP-Nachrichten. Er fungiert als zentraler Punkt für das Routing von Nachrichten und PDUs.
4.1.1. Generate Outgoing Request or Notification (Ausgehende Anfrage oder Benachrichtigung generieren)
Anwendungen verwenden das sendPdu-Primitiv, um vom Dispatcher zu verlangen, eine SNMP-Nachricht mit einer PDU zu senden.
Primitiv:
statusInformation =
sendPdu(
IN transportDomain
IN transportAddress
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN expectResponse
IN sendPduHandle
OUT destTransportDomain
OUT destTransportAddress
)
Parameter:
transportDomain: Das zu verwendende Transportprotokoll (z.B. UDP)transportAddress: Die ZieladressemessageProcessingModel: Das zu verwendende NachrichtenformatsecurityModel: Das zu verwendende SicherheitsmodellsecurityName: Der Principal, in dessen Namen die Nachricht gesendet wirdsecurityLevel: Das Sicherheitsniveau (noAuthNoPriv, authNoPriv oder authPriv)contextEngineID: Die Context-Engine-IDcontextName: Der Context-NamepduVersion: Die PDU-VersionPDU: Die zu sendende PDUexpectResponse: Ob eine Antwort erwartet wirdsendPduHandle: Ein Handle zur Identifizierung dieser AnfragedestTransportDomain: (OUT) Die tatsächlich verwendete Transport-DomaindestTransportAddress: (OUT) Die tatsächlich verwendete Transport-AdressestatusInformation: (OUT) Erfolgs- oder Fehleranzeige
4.1.2. Process Incoming Request or Notification PDU (Eingehende Anfrage oder Benachrichtigungs-PDU verarbeiten)
Der Dispatcher verwendet das processPdu-Primitiv, um eine eingehende Anfrage- oder Benachrichtigungs-PDU an eine Anwendung zu liefern.
Primitiv:
processPdu(
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN maxSizeResponseScopedPDU
IN stateReference
)
Parameter:
messageProcessingModel: Das verwendete NachrichtenformatsecurityModel: Das verwendete SicherheitsmodellsecurityName: Der Principal, in dessen Namen die Nachricht gesendet wurdesecurityLevel: Das auf die Nachricht angewendete SicherheitsniveaucontextEngineID: Die Context-Engine-IDcontextName: Der Context-NamepduVersion: Die PDU-VersionPDU: Die empfangene PDUmaxSizeResponseScopedPDU: Die maximale Größe für eine AntwortstateReference: Verweis auf zwischengespeicherte Zustandsinformationen
4.1.3. Generate Outgoing Response (Ausgehende Antwort generieren)
Anwendungen verwenden das returnResponsePdu-Primitiv, um vom Dispatcher zu verlangen, eine Antwortnachricht zu senden.
Primitiv:
result =
returnResponsePdu(
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN maxSizeResponseScopedPDU
IN stateReference
IN statusInformation
)
Parameter:
messageProcessingModel: Das zu verwendende Nachrichtenformat (von processPdu)securityModel: Das zu verwendende Sicherheitsmodell (von processPdu)securityName: Der Principal (von processPdu)securityLevel: Das Sicherheitsniveau (von processPdu)contextEngineID: Die Context-Engine-ID (von processPdu)contextName: Der Context-Name (von processPdu)pduVersion: Die PDU-Version (von processPdu)PDU: Die zu sendende Antwort-PDUmaxSizeResponseScopedPDU: Maximale Größe für die Antwort (von processPdu)stateReference: Zustandsinformationen (von processPdu)statusInformation: Statusinformationen über die Verarbeitung der Anfrageresult: (OUT) Erfolgs- oder Fehleranzeige
4.1.4. Process Incoming Response PDU (Eingehende Antwort-PDU verarbeiten)
Der Dispatcher verwendet das processResponsePdu-Primitiv, um eine Antwort-PDU an eine Anwendung zu liefern.
Primitiv:
processResponsePdu(
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN statusInformation
IN sendPduHandle
)
Parameter:
messageProcessingModel: Das verwendete NachrichtenformatsecurityModel: Das verwendete SicherheitsmodellsecurityName: Der PrincipalsecurityLevel: Das angewendete SicherheitsniveaucontextEngineID: Die Context-Engine-IDcontextName: Der Context-NamepduVersion: Die PDU-VersionPDU: Die empfangene Antwort-PDUstatusInformation: Statusinformationen über die NachrichtenverarbeitungsendPduHandle: Das Handle aus der ursprünglichen sendPdu-Anfrage
4.1.5. Registering Responsibility for Handling SNMP PDUs (Registrierung der Verantwortlichkeit für die Behandlung von SNMP-PDUs)
Anwendungen müssen sich beim Dispatcher registrieren, um bestimmte Arten von PDUs zu empfangen.
Primitiv für Registrierung:
statusInformation =
registerContextEngineID(
IN contextEngineID
IN pduType
)
Primitiv für Deregistrierung:
unregisterContextEngineID(
IN contextEngineID
IN pduType
)
Parameter:
contextEngineID: Die zu registrierende Context-Engine-IDpduType: Der Typ der zu empfangenden PDU (Get, GetNext, GetBulk, Set, Trap, InformRequest usw.)statusInformation: (OUT) Erfolgs- oder Fehleranzeige
Nur eine Anwendung kann sich gleichzeitig für eine bestimmte Kombination aus contextEngineID und pduType registrieren.
4.2. Message Processing Subsystem Primitives (Message Processing Subsystem-Primitive)
Das Message Processing Subsystem bietet dem Dispatcher Dienste zur Vorbereitung von Nachrichten und zur Extraktion von Daten aus Nachrichten.
4.2.1. Prepare Outgoing SNMP Request or Notification Message (Ausgehende SNMP-Anfrage oder Benachrichtigungsnachricht vorbereiten)
Der Dispatcher verwendet das prepareOutgoingMessage-Primitiv, um von einem Message Processing Model zu verlangen, eine Nachricht für die Übertragung vorzubereiten.
Primitiv:
statusInformation =
prepareOutgoingMessage(
IN transportDomain
IN transportAddress
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN expectResponse
IN sendPduHandle
OUT destTransportDomain
OUT destTransportAddress
OUT outgoingMessage
OUT outgoingMessageLength
)
Parameter:
- Eingabeparameter sind die gleichen wie für sendPdu
outgoingMessage: (OUT) Die übertragungsbereite NachrichtoutgoingMessageLength: (OUT) Die Länge der NachrichtstatusInformation: (OUT) Erfolgs- oder Fehleranzeige
Das Message Processing Model:
- Erstellt eine scopedPDU aus contextEngineID, contextName und PDU
- Ruft das Security Model auf, um Sicherheitsverarbeitung anzuwenden
- Verpackt die gesicherte Nachricht im entsprechenden Nachrichtenformat
- Gibt die vollständige übertragungsbereite Nachricht zurück
4.2.2. Prepare an Outgoing SNMP Response Message (Ausgehende SNMP-Antwortnachricht vorbereiten)
Der Dispatcher verwendet das prepareResponseMessage-Primitiv, um von einem Message Processing Model zu verlangen, eine Antwortnachricht für die Übertragung vorzubereiten.
Primitiv:
result =
prepareResponseMessage(
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN maxSizeResponseScopedPDU
IN stateReference
IN statusInformation
OUT destTransportDomain
OUT destTransportAddress
OUT outgoingMessage
OUT outgoingMessageLength
)
Parameter:
- Eingabeparameter enthalten Zustandsinformationen aus der ursprünglichen Anfrage
outgoingMessage: (OUT) Die vorbereitete AntwortnachrichtoutgoingMessageLength: (OUT) Die Länge der Nachrichtresult: (OUT) Erfolgs- oder Fehleranzeige
Das Message Processing Model:
- Ruft zwischengespeicherte Informationen unter Verwendung der stateReference ab
- Erstellt eine scopedPDU aus contextEngineID, contextName und PDU
- Ruft das Security Model auf, um Sicherheitsverarbeitung anzuwenden
- Verpackt die gesicherte Nachricht im entsprechenden Nachrichtenformat
- Gibt die vollständige übertragungsbereite Nachricht zurück
- Gibt die zwischengespeicherten Zustandsinformationen frei
4.2.3. Prepare Data Elements from an Incoming SNMP Message (Datenelemente aus einer eingehenden SNMP-Nachricht vorbereiten)
Der Dispatcher verwendet das prepareDataElements-Primitiv, um von einem Message Processing Model zu verlangen, Daten aus einer empfangenen Nachricht zu extrahieren.
Primitiv:
result =
prepareDataElements(
IN transportDomain
IN transportAddress
IN wholeMsg
IN wholeMsgLength
OUT messageProcessingModel
OUT securityModel
OUT securityName
OUT securityLevel
OUT contextEngineID
OUT contextName
OUT pduVersion
OUT PDU
OUT pduType
OUT sendPduHandle
OUT maxSizeResponseScopedPDU
OUT statusInformation
OUT stateReference
)
Parameter:
transportDomain: Das Transportprotokoll, über das die Nachricht angekommen isttransportAddress: Die QuelladressewholeMsg: Die empfangene NachrichtwholeMsgLength: Die Länge der Nachricht- Alle OUT-Parameter enthalten die extrahierten Datenelemente
result: (OUT) Erfolgs- oder Fehleranzeige
Das Message Processing Model:
- Analysiert das Nachrichtenformat
- Ruft das Security Model auf, um Sicherheit zu verarbeiten
- Extrahiert die scopedPDU
- Analysiert die scopedPDU, um contextEngineID, contextName und PDU zu extrahieren
- Speichert Zustandsinformationen zwischen, wenn die Nachricht eine Antwort erfordert
- Gibt alle extrahierten Datenelemente zurück
4.3. Access Control Subsystem Primitives (Access Control Subsystem-Primitive)
Das Access Control Subsystem bietet Anwendungen Dienste zur Bestimmung, ob der Zugriff auf ein verwaltetes Objekt erlaubt werden sollte.
Primitiv:
statusInformation =
isAccessAllowed(
IN securityModel
IN securityName
IN securityLevel
IN viewType
IN contextName
IN variableName
)
Parameter:
securityModel: Das verwendete SicherheitsmodellsecurityName: Der Principal, der den Zugriff versuchtsecurityLevel: Das Sicherheitsniveau der NachrichtviewType: Der Zugriffstyp (read, write oder notify)contextName: Der Context, auf den zugegriffen wirdvariableName: Die OID des verwalteten ObjektsstatusInformation: (OUT) Erlaubt oder verweigert
Das Access Control Model bestimmt basierend auf seiner konfigurierten Richtlinie, ob die angegebene Operation erlaubt werden sollte.
4.4. Security Subsystem Primitives (Security Subsystem-Primitive)
Das Security Subsystem bietet Message Processing Models Dienste zur Anwendung und Überprüfung von Sicherheit.
4.4.1. Generate a Request or Notification Message (Anfrage- oder Benachrichtigungsnachricht generieren)
Message Processing Models verwenden das generateRequestMsg-Primitiv, um vom Security Subsystem zu verlangen, Sicherheitsverarbeitung auf eine ausgehende Anfrage- oder Benachrichtigungsnachricht anzuwenden.
Primitiv:
statusInformation =
generateRequestMsg(
IN messageProcessingModel
IN globalData
IN maxMessageSize
IN securityModel
IN securityEngineID
IN securityName
IN securityLevel
IN scopedPDU
OUT securityParameters
OUT wholeMsg
OUT wholeMsgLength
)
Parameter:
messageProcessingModel: Das verwendete NachrichtenformatglobalData: Nachrichtenformat-spezifische Header-DatenmaxMessageSize: Unterstützte maximale NachrichtengrößesecurityModel: Das zu verwendende SicherheitsmodellsecurityEngineID: Die autoritative Engine-IDsecurityName: Der PrincipalsecurityLevel: Das gewünschte SicherheitsniveauscopedPDU: Die zu sichernde scoped PDUsecurityParameters: (OUT) Sicherheitsmodell-spezifische ParameterwholeMsg: (OUT) Die vollständig gesicherte NachrichtwholeMsgLength: (OUT) Die Länge der NachrichtstatusInformation: (OUT) Erfolgs- oder Fehleranzeige
4.4.2. Process Incoming Message (Eingehende Nachricht verarbeiten)
Message Processing Models verwenden das processIncomingMsg-Primitiv, um vom Security Subsystem zu verlangen, eine eingehende Nachricht zu verarbeiten.
Primitiv:
statusInformation =
processIncomingMsg(
IN messageProcessingModel
IN maxMessageSize
IN securityParameters
IN securityModel
IN securityLevel
IN wholeMsg
IN wholeMsgLength
OUT securityEngineID
OUT securityName
OUT scopedPDU
OUT maxSizeResponseScopedPDU
OUT securityStateReference
)
Parameter:
messageProcessingModel: Das verwendete NachrichtenformatmaxMessageSize: Unterstützte maximale NachrichtengrößesecurityParameters: Sicherheitsmodell-spezifische Parameter aus der NachrichtsecurityModel: Das in der Nachricht angegebene SicherheitsmodellsecurityLevel: Das gewünschte SicherheitsniveauwholeMsg: Die empfangene NachrichtwholeMsgLength: Die Länge der NachrichtsecurityEngineID: (OUT) Die autoritative Engine-IDsecurityName: (OUT) Der PrincipalscopedPDU: (OUT) Die extrahierte und verifizierte scoped PDUmaxSizeResponseScopedPDU: (OUT) Maximale Größe für eine AntwortsecurityStateReference: (OUT) Verweis auf zwischengespeicherten SicherheitszustandstatusInformation: (OUT) Erfolgs- oder Fehleranzeige
Das Security Model:
- Überprüft, ob die Nachricht authentisch ist (wenn Authentifizierung erforderlich ist)
- Entschlüsselt die Nachricht (wenn Vertraulichkeit erforderlich ist)
- Überprüft die Aktualität der Nachricht (um Replay-Angriffe zu verhindern)
- Extrahiert die scopedPDU
- Speichert Sicherheitszustand zwischen, wenn eine Antwort erforderlich sein könnte
- Gibt alle extrahierten Daten zurück
4.4.3. Generate a Response Message (Antwortnachricht generieren)
Message Processing Models verwenden das generateResponseMsg-Primitiv, um vom Security Subsystem zu verlangen, Sicherheitsverarbeitung auf eine ausgehende Antwortnachricht anzuwenden.
Primitiv:
statusInformation =
generateResponseMsg(
IN messageProcessingModel
IN globalData
IN maxMessageSize
IN securityModel
IN securityEngineID
IN securityName
IN securityLevel
IN scopedPDU
IN securityStateReference
OUT securityParameters
OUT wholeMsg
OUT wholeMsgLength
)
Parameter:
- Ähnlich wie generateRequestMsg, aber enthält securityStateReference
securityStateReference: Zwischengespeicherter Zustand aus der ursprünglichen Anfrage- Andere Parameter sind ähnlich wie bei generateRequestMsg
Das Security Model verwendet den zwischengespeicherten Sicherheitszustand, um dieselbe Sicherheitsverarbeitung auf die Antwort anzuwenden wie auf die Anfrage.
4.5. Common Primitives (Gemeinsame Primitive)
4.5.1. Release State Reference Information (Zustandsreferenzinformationen freigeben)
Komponenten verwenden das stateRelease-Primitiv, um zwischengespeicherte Zustandsinformationen freizugeben.
Primitiv:
stateRelease(
IN stateReference
)
Parameter:
stateReference: Der Verweis auf den freizugebenden zwischengespeicherten Zustand
Dieses Primitiv wird verwendet, um Ressourcen freizugeben, wenn zwischengespeicherte Zustandsinformationen nicht mehr benötigt werden. Es wird typischerweise aufgerufen, wenn:
- Eine Antwort gesendet wurde
- Ein Fehler aufgetreten ist und keine Antwort gesendet wird
- Ein Timeout beim Warten auf eine Antwort aufgetreten ist
4.6. Scenario Diagrams (Szenariodiagramme)
Dieser Abschnitt enthält Szenariodiagramme, die den Fluss von Primitiven für allgemeine Operationen zeigen.
4.6.1. Command Generator or Notification Originator (Command Generator oder Notification Originator)
Das folgende Diagramm zeigt den Ablauf, wenn eine Anwendung eine Anfrage oder Benachrichtigung initiiert:
Application Dispatcher Message Processing Security
Model Model
sendPdu ----------->
prepareOutgoing
Message -------->
generateRequestMsg -->
(Sicherheit anwenden)
<------------------
<--------------
(Nachricht ans Netzwerk senden)
(später kommt Antwort)
(Nachricht vom Netzwerk empfangen)
prepareData
Elements ------->
processIncomingMsg -->
(Sicherheit prüfen)
<------------------
<--------------
processResponsePdu <-
4.6.2. Scenario Diagram for a Command Responder Application (Szenariodiagramm für eine Command Responder-Anwendung)
Das folgende Diagramm zeigt den Ablauf, wenn eine Anwendung auf eine Anfrage antwortet:
Application Dispatcher Message Processing Security
Model Model
(Nachricht vom Netzwerk empfangen)
prepareData
Elements ------->
processIncomingMsg -->
(Sicherheit prüfen)
<------------------
<--------------
processPdu <--------
(Anwendung verarbeitet Anfrage)
returnResponsePdu ->
prepareResponse
Message -------->
generateResponseMsg ->
(Sicherheit anwenden)
<------------------
<--------------
(Nachricht ans Netzwerk senden)
Diese Diagramme veranschaulichen das modulare Design der Architektur und die klare Trennung der Zuständigkeiten zwischen verschiedenen Subsystemen.