Appendix A. Guidelines for Model Designers (Anhang A. Richtlinien für Modellentwickler)
Appendix A. Guidelines for Model Designers (Anhang A. Richtlinien für Modellentwickler)
Dieser Anhang bietet Richtlinien für Entwickler von Sicherheitsmodellen, Message Processing Models, Access Control Models und SNMP-Anwendungen. Diese Richtlinien sind informativ und sollen Implementierer bei der Erstellung von Komponenten unterstützen, die innerhalb der SNMP-Architektur ordnungsgemäß funktionieren.
A.1. Security Model Design Requirements (Anforderungen an das Design von Sicherheitsmodellen)
Ein Sicherheitsmodell muss Mechanismen für Authentifizierung, Vertraulichkeit und Aktualitätsprüfung bereitstellen. Dieser Abschnitt beschreibt die Anforderungen an Sicherheitsmodelle.
A.1.1. Threats (Bedrohungen)
Sicherheitsmodelle müssen die folgenden Bedrohungen adressieren:
-
Informationsänderung: Eine nicht autorisierte Entität, die Nachrichten während der Übertragung verändert
- Ein Sicherheitsmodell muss Datenintegritätsdienste bereitstellen, um solche Änderungen zu erkennen
-
Maskerade: Eine nicht autorisierte Entität, die die Identität einer autorisierten Entität annimmt
- Ein Sicherheitsmodell muss Authentifizierungsdienste zur Überprüfung der Identität bereitstellen
-
Nachrichtenstrom-Änderung: Neuordnung, Verzögerung oder Wiederholung von Nachrichten
- Ein Sicherheitsmodell muss Aktualitätsprüfungen bereitstellen, um solche Angriffe zu erkennen
-
Offenlegung: Freigabe von Nachrichteninhalten an eine nicht autorisierte Entität
- Ein Sicherheitsmodell kann optional Vertraulichkeitsdienste durch Verschlüsselung bereitstellen
A.1.2. Security Processing (Sicherheitsverarbeitung)
Ein Sicherheitsmodell muss die folgenden abstrakten Service-Primitiven implementieren:
-
generateRequestMsg: Sicherheitsverarbeitung auf ausgehende Anfrage- und Benachrichtigungsnachrichten anwenden
- Eingabe: scopedPDU, Sicherheitsparameter
- Ausgabe: gesicherte, übertragungsbereite Nachricht
- Verarbeitung:
- Authentifizierung anwenden (falls vom Sicherheitsniveau gefordert)
- Verschlüsselung anwenden (falls vom Sicherheitsniveau gefordert)
- Sicherheitsparameter zur Nachricht hinzufügen
- Sicherstellen, dass die Nachricht gemäß securityLevel geschützt ist
-
processIncomingMsg: Sicherheit eingehender Nachrichten verarbeiten
- Eingabe: empfangene Nachricht
- Ausgabe: extrahierte scopedPDU, Sicherheitsparameter
- Verarbeitung:
- Authentifizierung überprüfen (wenn die Nachricht behauptet, authentifiziert zu sein)
- Nachricht entschlüsseln (wenn die Nachricht verschlüsselt ist)
- Aktualität prüfen (um Replay-Angriffe zu verhindern)
- scopedPDU extrahieren
- Sicherheitszustand zwischenspeichern, falls Antwort erforderlich sein könnte
-
generateResponseMsg: Sicherheitsverarbeitung auf ausgehende Antwortnachrichten anwenden
- Eingabe: scopedPDU, zwischengespeicherter Sicherheitszustand
- Ausgabe: gesicherte Antwortnachricht
- Verarbeitung:
- Sicherheitsparameter aus zwischengespeichertem Zustand abrufen
- Gleiches Sicherheitsniveau wie Anfrage anwenden
- Authentifizierung anwenden (falls erforderlich)
- Verschlüsselung anwenden (falls erforderlich)
A.1.3. Validate the security-stamp in a received message (Sicherheitsstempel in einer empfangenen Nachricht validieren)
Ein Sicherheitsmodell muss Folgendes validieren:
-
Authentifizierung ist gültig: Wenn die Nachricht behauptet, authentifiziert zu sein, Authentifizierungscode überprüfen
- Geeignete kryptografische Überprüfung verwenden (z.B. HMAC-Überprüfung)
- Nachrichten mit ungültiger Authentifizierung ablehnen
-
Nachricht ist aktuell: Überprüfen, dass die Nachricht kein Replay ist
- Nachrichtentiming-Parameter prüfen
- Zustand zur Erkennung von Replays aufrechterhalten
- Nachrichten außerhalb des Zeitfensters ablehnen
-
Vertraulichkeit ist korrekt angewendet: Wenn die Nachricht verschlüsselt ist, überprüfen, dass sie entschlüsselt werden kann
- Entschlüsselung mit geeigneten Schlüsseln versuchen
- Erfolgreiche Entschlüsselung überprüfen
- Nachrichten ablehnen, die nicht entschlüsselt werden können
-
Sicherheitsniveau entspricht Anforderungen: Überprüfen, dass die tatsächlich angewendete Sicherheit mit der angeforderten übereinstimmt
- Prüfen, dass authNoPriv-Nachrichten authentifiziert, aber nicht verschlüsselt sind
- Prüfen, dass authPriv-Nachrichten sowohl authentifiziert als auch verschlüsselt sind
- Prüfen, dass noAuthNoPriv-Nachrichten weder authentifiziert noch verschlüsselt sind
A.1.4. Security MIBs (Sicherheits-MIBs)
Ein Sicherheitsmodell sollte ein MIB-Modul definieren, das Folgendes ermöglicht:
- Konfiguration von Sicherheitsparametern: Benutzer, Schlüssel, Authentifizierungsprotokolle, Vertraulichkeitsprotokolle
- Überwachung der Sicherheit: Zähler für Authentifizierungsfehler, Entschlüsselungsfehler usw.
- Fernkonfiguration: Sichere Mechanismen für die Remote-Konfiguration der Sicherheit
Das User-based Security Model (USM) definiert die SNMP-USER-BASED-SM-MIB für diesen Zweck.
A.1.5. Cached Security Data (Zwischengespeicherte Sicherheitsdaten)
Bei der Verarbeitung einer eingehenden Anfrage, die möglicherweise eine Antwort erfordert, muss ein Sicherheitsmodell Sicherheitszustandsinformationen zwischenspeichern. Diese zwischengespeicherten Daten ermöglichen es, die Antwort mit denselben Sicherheitsparametern wie die Anfrage zu sichern.
Zwischengespeicherte Sicherheitsdaten umfassen typischerweise:
- Sicherheitsparameter aus der Anfrage
- Für Authentifizierung und/oder Verschlüsselung verwendete Schlüssel
- Timing-Parameter
- Alle anderen für die Generierung einer Antwort benötigten Zustände
Das Sicherheitsmodell muss:
- Eine securityStateReference generieren: Ein eindeutiger Identifikator für den zwischengespeicherten Zustand
- Die securityStateReference zurückgeben: An das Message Processing Model
- Den zwischengespeicherten Zustand abrufen: Wenn generateResponseMsg aufgerufen wird
- Den zwischengespeicherten Zustand freigeben: Nachdem die Antwort generiert wurde oder wenn explizit freigegeben
Der zwischengespeicherte Zustand kann implizit freigegeben werden, wenn:
- Eine Antwort erfolgreich generiert wurde
- Ein Fehler auftritt und keine Antwort gesendet wird
- Ein Timeout auftritt
Der zwischengespeicherte Zustand kann explizit mit dem stateRelease-Primitiv freigegeben werden.
A.2. Message Processing Model Design Requirements (Anforderungen an das Design von Message Processing Models)
Ein Message Processing Model definiert ein Nachrichtenformat und die Verfahren zur Verarbeitung von Nachrichten in diesem Format. Dieser Abschnitt beschreibt die Anforderungen an Message Processing Models.
A.2.1. Receiving an SNMP Message from the Network (Empfangen einer SNMP-Nachricht aus dem Netzwerk)
Wenn eine Nachricht aus dem Netzwerk empfangen wird, bestimmt der Dispatcher, welches Message Processing Model sie verarbeiten soll (basierend auf der Nachrichtenversion oder dem Format). Das Message Processing Model muss das prepareDataElements-Primitiv implementieren.
prepareDataElements-Verarbeitung:
-
Nachrichtenformat analysieren: Die verschiedenen Komponenten aus der Nachricht extrahieren
- Nachrichtenheader
- Sicherheitsparameter
- Scoped PDU oder Payload
-
Sicherheitsmodell bestimmen: Identifizieren, welches Sicherheitsmodell verwendet wurde
- Normalerweise im Nachrichtenheader angegeben
-
Sicherheitsmodell aufrufen: processIncomingMsg aufrufen, um:
- Authentifizierung zu überprüfen
- Nachricht zu entschlüsseln
- Aktualität zu prüfen
- Scoped PDU zu extrahieren
-
Scoped PDU analysieren: Extrahieren:
- contextEngineID
- contextName
- PDU
-
Zustand bei Bedarf zwischenspeichern: Wenn dies eine Anfrage ist, die eine Antwort erfordern könnte:
- Zur Generierung der Antwort benötigte Informationen zwischenspeichern
- Eine stateReference generieren
- Die stateReference mit den zwischengespeicherten Daten verknüpfen
-
Extrahierte Datenelemente zurückgeben: Alle notwendigen Informationen an den Dispatcher zurückgeben:
- messageProcessingModel
- securityModel
- securityName
- securityLevel
- contextEngineID
- contextName
- pduVersion
- PDU
- pduType
- maxSizeResponseScopedPDU
- stateReference
- statusInformation
Fehlerbehandlung:
Wenn ein Schritt fehlschlägt, geeignete Fehler-statusInformation an den Dispatcher zurückgeben. Fehlerhafte oder nicht authentifizierte Nachrichten nicht an Anwendungen weitergeben.
A.2.2. Sending an SNMP Message to the Network (Senden einer SNMP-Nachricht an das Netzwerk)
Beim Senden einer Nachricht ruft der Dispatcher entweder prepareOutgoingMessage (für Anfragen und Benachrichtigungen) oder prepareResponseMessage (für Antworten) auf. Das Message Processing Model muss diese Primitive implementieren.
prepareOutgoingMessage-Verarbeitung:
-
Scoped PDU erstellen: contextEngineID, contextName und PDU kombinieren
-
Sicherheitsmodell aufrufen: generateRequestMsg aufrufen, um:
- Authentifizierung anzuwenden (falls erforderlich)
- Verschlüsselung anzuwenden (falls erforderlich)
- Sicherheitsparameter hinzuzufügen
-
Nachricht erstellen: Die gesicherte Payload im entsprechenden Nachrichtenformat verpacken
- Nachrichtenheader hinzufügen
- Versions- oder Formatidentifikator hinzufügen
- Nachrichtenspezifische Felder hinzufügen
-
Vollständige Nachricht zurückgeben: Die formatierte, übertragungsbereite Nachricht zurückgeben:
- outgoingMessage
- outgoingMessageLength
- statusInformation
prepareResponseMessage-Verarbeitung:
Ähnlich wie prepareOutgoingMessage, aber:
-
Zwischengespeicherten Zustand abrufen: Die stateReference verwenden, um zwischengespeicherte Informationen abzurufen
-
Scoped PDU erstellen: contextEngineID, contextName und PDU kombinieren (aus ursprünglicher Anfrage)
-
Sicherheitsmodell aufrufen: generateResponseMsg mit folgenden Parametern aufrufen:
- Die scoped PDU
- Die securityStateReference (um dieselben Sicherheitsparameter wie die Anfrage zu verwenden)
-
Antwortnachricht erstellen: Die gesicherte Payload im entsprechenden Format verpacken
-
Zwischengespeicherten Zustand freigeben: Nach erfolgreicher Erstellung der Antwort den zwischengespeicherten Zustand freigeben
-
Vollständige Antwort zurückgeben: Die formatierte Antwortnachricht zurückgeben
Fehlerbehandlung:
Wenn ein Schritt fehlschlägt, geeignete Fehler-statusInformation zurückgeben. Wenn eine Antwort nicht generiert werden kann, sicherstellen, dass der zwischengespeicherte Zustand freigegeben wird.
A.3. Application Design Requirements (Anforderungen an das Anwendungsdesign)
SNMP-Anwendungen nutzen die Dienste der SNMP-Engine, um Verwaltungsfunktionen auszuführen. Dieser Abschnitt beschreibt Anforderungen und Richtlinien für das Anwendungsdesign.
A.3.1. Applications that Initiate Messages (Anwendungen, die Nachrichten initiieren)
Anwendungen, die Nachrichten initiieren (Command Generators, Notification Originators), müssen:
-
Ziel bestimmen: Die Ziel-SNMP-Engine identifizieren
- transportDomain
- transportAddress
- contextEngineID
-
Sicherheitsparameter bestimmen:
- securityModel
- securityName
- securityLevel
-
PDU erstellen: Die Protocol Data Unit mit der gewünschten Operation und Variablen erstellen
-
sendPdu aufrufen: Das sendPdu-Primitiv des Dispatchers mit folgenden Parametern aufrufen:
- Zielinformationen
- Sicherheitsparameter
- contextEngineID und contextName
- PDU
- expectResponse-Flag
- sendPduHandle (um spätere Antwort zu korrelieren)
-
Antwort behandeln: Wenn expectResponse TRUE war, processResponsePdu implementieren, um die Antwort zu empfangen
Richtlinien:
- Ziele konfigurieren: Konfigurationsmechanismen (z.B. SNMP-TARGET-MIB) verwenden, um Zielinformationen zu verwalten
- Sicherheit konfigurieren: Konfigurationsmechanismen (z.B. SNMP-USER-BASED-SM-MIB) verwenden, um Sicherheitsparameter zu verwalten
- Fehler behandeln: statusInformation-Fehler von sendPdu ordnungsgemäß behandeln
- Timeouts implementieren: Wenn keine Antwort innerhalb einer angemessenen Zeit empfangen wird, Timeout behandeln
- Wiederholungen implementieren: Erneute Übertragung in Betracht ziehen, wenn keine Antwort empfangen wird
A.3.2. Applications that Receive Responses (Anwendungen, die Antworten empfangen)
Anwendungen, die Antworten empfangen, müssen das processResponsePdu-Primitiv implementieren.
processResponsePdu-Implementierung:
-
Antwort korrelieren: sendPduHandle verwenden, um die Antwort der ursprünglichen Anfrage zuzuordnen
-
statusInformation prüfen: Überprüfen, dass die Nachrichtenverarbeitung erfolgreich war
-
PDU verarbeiten: Antwortdaten extrahieren und verarbeiten
- error-status und error-index prüfen
- Variable Bindings extrahieren
- Anwendungsspezifische Verarbeitung durchführen
Richtlinien:
- Fehler behandeln: Auf SNMP-Fehler prüfen (z.B. noSuchName, tooBig, genErr)
- Ausnahmen behandeln: Auf Ausnahmewerte prüfen (noSuchObject, noSuchInstance, endOfMibView)
- Sicherheitsfehler behandeln: Auf Authentifizierungs- oder Vertraulichkeitsfehler vorbereitet sein
- Zustand bereinigen: Alle mit der Anfrage verbundenen Ressourcen freigeben
A.3.3. Applications that Receive Asynchronous Messages (Anwendungen, die asynchrone Nachrichten empfangen)
Anwendungen, die asynchrone Nachrichten empfangen (Command Responders, Notification Receivers), müssen:
-
Beim Dispatcher registrieren: registerContextEngineID aufrufen, um sich für Folgendes zu registrieren:
- Spezifische contextEngineID-Werte
- Spezifische PDU-Typen
-
processPdu implementieren: Eingehende PDUs empfangen und verarbeiten
- contextEngineID und contextName validieren
- PDU gemäß Anwendungssemantik verarbeiten
- Antwort generieren (falls erforderlich)
processPdu-Implementierung:
-
Kontext validieren: Sicherstellen, dass diese Anwendung für die contextEngineID und den contextName verantwortlich ist
-
Zugriffskontrolle prüfen (falls zutreffend): isAccessAllowed für jede Variable in der PDU aufrufen
-
Anfrage verarbeiten: Die angeforderte Operation ausführen
- Für GET: Variablenwerte abrufen
- Für SET: Variablenwerte ändern
- Für GETNEXT: Lexikografisch nächste Variable finden
- Für GETBULK: Mehrere Variablen effizient abrufen
-
Antwort-PDU erstellen (falls erforderlich): Eine Antwort-PDU mit Ergebnissen erstellen
-
returnResponsePdu aufrufen (falls erforderlich): Die Antwort an den Anforderer zurücksenden
Richtlinien:
- Eingabe validieren: Alle Eingaben sorgfältig validieren, um Sicherheitslücken zu verhindern
- Zugriffskontrolle implementieren: Geeignete Zugriffskontrolle auf alle Operationen anwenden
- Fehler angemessen behandeln: Geeignete Fehlerantworten für ungültige Anfragen zurückgeben
- maxSizeResponseScopedPDU respektieren: Sicherstellen, dass die Antwort die Größenbeschränkung nicht überschreitet
- stateReference verwenden: Die stateReference unverändert von processPdu an returnResponsePdu übergeben
A.3.4. Applications that Send Responses (Anwendungen, die Antworten senden)
Anwendungen, die Antworten senden, müssen das returnResponsePdu-Primitiv verwenden.
returnResponsePdu-Verwendung:
-
Parameter von processPdu verwenden: Folgendes durchreichen:
- messageProcessingModel
- securityModel
- securityName
- securityLevel
- contextEngineID
- contextName
- pduVersion
- maxSizeResponseScopedPDU
- stateReference
-
Antwort-PDU erstellen: Die PDU mit Ergebnissen erstellen
-
returnResponsePdu aufrufen: Das returnResponsePdu-Primitiv des Dispatchers aufrufen
Richtlinien:
- Sicherheitsparameter nicht ändern: Dieselben Sicherheitsparameter wie die Anfrage verwenden
- Größenbeschränkungen respektieren: Sicherstellen, dass die Antwort in maxSizeResponseScopedPDU passt
- Fehler behandeln: Wenn die Antwort nicht gesendet werden kann, den Fehler angemessen behandeln
- Zustand freigeben: Die stateReference wird vom Dispatcher nach dem Senden der Antwort freigegeben
A.4. Access Control Model Design Requirements (Anforderungen an das Design von Access Control Models)
Ein Access Control Model bestimmt, ob der Zugriff auf ein verwaltetes Objekt erlaubt werden sollte. Dieser Abschnitt beschreibt die Anforderungen an Access Control Models.
Ein Access Control Model muss das isAccessAllowed-Primitiv implementieren.
isAccessAllowed-Implementierung:
-
Principal bestimmen: Identifizieren, wer den Zugriff versucht
- securityModel und securityName verwenden
-
Zugriffstyp bestimmen: Identifizieren, welcher Zugriffstyp angefordert wird
- read: GET, GETNEXT, GETBULK
- write: SET
- notify: TRAP, INFORM
-
Ziel bestimmen: Identifizieren, auf welches Objekt zugegriffen wird
- variableName (OID)
- contextName
-
Zugriffskontrollrichtlinie anwenden: Basierend auf der konfigurierten Richtlinie bestimmen, ob Zugriff erlaubt werden sollte
-
Ergebnis zurückgeben: Erlaubt oder verweigert zurückgeben
Richtlinien:
- MIB definieren: Ein MIB-Modul zur Konfiguration der Zugriffskontrollrichtlinie definieren
- Fernkonfiguration unterstützen: Konfiguration der Richtlinie über SNMP ermöglichen
- Standardmäßig verweigern: Wenn keine explizite Richtlinie den Zugriff erlaubt, standardmäßig verweigern
- Effiziente Implementierung: Zugriffskontrolle kann viele Male pro Anfrage aufgerufen werden; effizient implementieren
- Konsistente Richtlinie: Sicherstellen, dass die Richtlinie konsistent angewendet wird
Das in RFC 3415 definierte View-based Access Control Model (VACM) ist eine Beispielimplementierung.