Aller au contenu principal

4. Abstract Service Interfaces

4. Abstract Service Interfaces

Cette section décrit les interfaces de service abstraites entre les principaux composants de l'architecture SNMP. Ces interfaces sont définies à l'aide de primitives abstraites, qui représentent les informations qui doivent être transmises entre les composants sans spécifier comment elles sont transmises.

Les interfaces de service abstraites sont organisées en plusieurs catégories:

  • Primitives du répartiteur: Interfaces entre les applications et le répartiteur
  • Primitives du sous-système de traitement des messages: Interfaces entre le répartiteur et les modèles de traitement des messages
  • Primitives du sous-système de contrôle d'accès: Interfaces entre les applications et le sous-système de contrôle d'accès
  • Primitives du sous-système de sécurité: Interfaces entre les modèles de traitement des messages et les modèles de sécurité

4.1. Dispatcher Primitives

Le répartiteur fournit des services aux applications pour l'envoi et la réception de messages SNMP. Il agit comme le point central pour le routage des messages et des PDU.

4.1.1. Generate Outgoing Request or Notification

Les applications utilisent la primitive sendPdu pour demander au répartiteur d'envoyer un message SNMP contenant une PDU.

Primitive:

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
)

Paramètres:

  • transportDomain: Le protocole de transport à utiliser (par exemple UDP)
  • transportAddress: L'adresse de destination
  • messageProcessingModel: Le format de message à utiliser
  • securityModel: Le modèle de sécurité à utiliser
  • securityName: Le principal au nom duquel le message est envoyé
  • securityLevel: Le niveau de sécurité (noAuthNoPriv, authNoPriv ou authPriv)
  • contextEngineID: L'ID du moteur de contexte
  • contextName: Le nom du contexte
  • pduVersion: La version de la PDU
  • PDU: La PDU à envoyer
  • expectResponse: Si une réponse est attendue
  • sendPduHandle: Un handle pour identifier cette requête
  • destTransportDomain: (OUT) Le domaine de transport réellement utilisé
  • destTransportAddress: (OUT) L'adresse de transport réellement utilisée
  • statusInformation: (OUT) Indication de succès ou d'erreur

4.1.2. Process Incoming Request or Notification PDU

Le répartiteur utilise la primitive processPdu pour livrer une PDU de requête ou de notification entrante à une application.

Primitive:

processPdu(
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN maxSizeResponseScopedPDU
IN stateReference
)

Paramètres:

  • messageProcessingModel: Le format de message utilisé
  • securityModel: Le modèle de sécurité utilisé
  • securityName: Le principal au nom duquel le message a été envoyé
  • securityLevel: Le niveau de sécurité appliqué au message
  • contextEngineID: L'ID du moteur de contexte
  • contextName: Le nom du contexte
  • pduVersion: La version de la PDU
  • PDU: La PDU reçue
  • maxSizeResponseScopedPDU: La taille maximale pour une réponse
  • stateReference: Référence aux informations d'état en cache

4.1.3. Generate Outgoing Response

Les applications utilisent la primitive returnResponsePdu pour demander au répartiteur d'envoyer un message de réponse.

Primitive:

result =
returnResponsePdu(
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN maxSizeResponseScopedPDU
IN stateReference
IN statusInformation
)

Paramètres:

  • messageProcessingModel: Le format de message à utiliser (de processPdu)
  • securityModel: Le modèle de sécurité à utiliser (de processPdu)
  • securityName: Le principal (de processPdu)
  • securityLevel: Le niveau de sécurité (de processPdu)
  • contextEngineID: L'ID du moteur de contexte (de processPdu)
  • contextName: Le nom du contexte (de processPdu)
  • pduVersion: La version de la PDU (de processPdu)
  • PDU: La PDU de réponse à envoyer
  • maxSizeResponseScopedPDU: Taille maximale pour la réponse (de processPdu)
  • stateReference: Informations d'état (de processPdu)
  • statusInformation: Informations d'état sur le traitement de la requête
  • result: (OUT) Indication de succès ou d'erreur

4.1.4. Process Incoming Response PDU

Le répartiteur utilise la primitive processResponsePdu pour livrer une PDU de réponse à une application.

Primitive:

processResponsePdu(
IN messageProcessingModel
IN securityModel
IN securityName
IN securityLevel
IN contextEngineID
IN contextName
IN pduVersion
IN PDU
IN statusInformation
IN sendPduHandle
)

Paramètres:

  • messageProcessingModel: Le format de message utilisé
  • securityModel: Le modèle de sécurité utilisé
  • securityName: Le principal
  • securityLevel: Le niveau de sécurité appliqué
  • contextEngineID: L'ID du moteur de contexte
  • contextName: Le nom du contexte
  • pduVersion: La version de la PDU
  • PDU: La PDU de réponse reçue
  • statusInformation: Informations d'état sur le traitement du message
  • sendPduHandle: Le handle de la requête sendPdu originale

4.1.5. Registering Responsibility for Handling SNMP PDUs

Les applications doivent s'enregistrer auprès du répartiteur pour recevoir certains types de PDU.

Primitive d'enregistrement:

statusInformation =
registerContextEngineID(
IN contextEngineID
IN pduType
)

Primitive de désenregistrement:

unregisterContextEngineID(
IN contextEngineID
IN pduType
)

Paramètres:

  • contextEngineID: L'ID du moteur de contexte pour lequel s'enregistrer
  • pduType: Le type de PDU à recevoir (Get, GetNext, GetBulk, Set, Trap, InformRequest, etc.)
  • statusInformation: (OUT) Indication de succès ou d'erreur

Une seule application peut s'enregistrer pour une combinaison donnée de contextEngineID et pduType à la fois.

4.2. Message Processing Subsystem Primitives

Le sous-système de traitement des messages fournit des services au répartiteur pour préparer les messages et extraire les données des messages.

4.2.1. Prepare Outgoing SNMP Request or Notification Message

Le répartiteur utilise la primitive prepareOutgoingMessage pour demander à un modèle de traitement des messages de préparer un message pour la transmission.

Primitive:

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
)

Paramètres:

  • Les paramètres d'entrée sont les mêmes que pour sendPdu
  • outgoingMessage: (OUT) Le message prêt pour la transmission
  • outgoingMessageLength: (OUT) La longueur du message
  • statusInformation: (OUT) Indication de succès ou d'erreur

Le modèle de traitement des messages:

  1. Crée une scopedPDU à partir du contextEngineID, contextName et PDU
  2. Appelle le modèle de sécurité pour appliquer le traitement de sécurité
  3. Emballe le message sécurisé dans le format de message approprié
  4. Retourne le message complet prêt pour la transmission

4.2.2. Prepare an Outgoing SNMP Response Message

Le répartiteur utilise la primitive prepareResponseMessage pour demander à un modèle de traitement des messages de préparer un message de réponse pour la transmission.

Primitive:

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
)

Paramètres:

  • Les paramètres d'entrée incluent les informations d'état de la requête originale
  • outgoingMessage: (OUT) Le message de réponse préparé
  • outgoingMessageLength: (OUT) La longueur du message
  • result: (OUT) Indication de succès ou d'erreur

Le modèle de traitement des messages:

  1. Récupère les informations en cache à l'aide de la stateReference
  2. Crée une scopedPDU à partir du contextEngineID, contextName et PDU
  3. Appelle le modèle de sécurité pour appliquer le traitement de sécurité
  4. Emballe le message sécurisé dans le format de message approprié
  5. Retourne le message complet prêt pour la transmission
  6. Libère les informations d'état en cache

4.2.3. Prepare Data Elements from an Incoming SNMP Message

Le répartiteur utilise la primitive prepareDataElements pour demander à un modèle de traitement des messages d'extraire des données d'un message reçu.

Primitive:

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
)

Paramètres:

  • transportDomain: Le protocole de transport sur lequel le message est arrivé
  • transportAddress: L'adresse source
  • wholeMsg: Le message reçu
  • wholeMsgLength: La longueur du message
  • Tous les paramètres OUT contiennent les éléments de données extraits
  • result: (OUT) Indication de succès ou d'erreur

Le modèle de traitement des messages:

  1. Analyse le format du message
  2. Appelle le modèle de sécurité pour traiter la sécurité
  3. Extrait la scopedPDU
  4. Analyse la scopedPDU pour extraire contextEngineID, contextName et PDU
  5. Met en cache les informations d'état si le message nécessite une réponse
  6. Retourne tous les éléments de données extraits

4.3. Access Control Subsystem Primitives

Le sous-système de contrôle d'accès fournit des services aux applications pour déterminer si l'accès à un objet géré doit être autorisé.

Primitive:

statusInformation =
isAccessAllowed(
IN securityModel
IN securityName
IN securityLevel
IN viewType
IN contextName
IN variableName
)

Paramètres:

  • securityModel: Le modèle de sécurité en cours d'utilisation
  • securityName: Le principal tentant l'accès
  • securityLevel: Le niveau de sécurité du message
  • viewType: Le type d'accès (read, write ou notify)
  • contextName: Le contexte accédé
  • variableName: L'OID de l'objet géré
  • statusInformation: (OUT) Autorisé ou refusé

Le modèle de contrôle d'accès détermine si l'opération spécifiée doit être autorisée en fonction de sa politique configurée.

4.4. Security Subsystem Primitives

Le sous-système de sécurité fournit des services aux modèles de traitement des messages pour appliquer et vérifier la sécurité.

4.4.1. Generate a Request or Notification Message

Les modèles de traitement des messages utilisent la primitive generateRequestMsg pour demander au sous-système de sécurité d'appliquer un traitement de sécurité à un message de requête ou de notification sortant.

Primitive:

statusInformation =
generateRequestMsg(
IN messageProcessingModel
IN globalData
IN maxMessageSize
IN securityModel
IN securityEngineID
IN securityName
IN securityLevel
IN scopedPDU
OUT securityParameters
OUT wholeMsg
OUT wholeMsgLength
)

Paramètres:

  • messageProcessingModel: Le format de message utilisé
  • globalData: Données d'en-tête spécifiques au format de message
  • maxMessageSize: Taille maximale de message supportée
  • securityModel: Le modèle de sécurité à utiliser
  • securityEngineID: L'ID du moteur autoritaire
  • securityName: Le principal
  • securityLevel: Le niveau de sécurité souhaité
  • scopedPDU: La scoped PDU à sécuriser
  • securityParameters: (OUT) Paramètres spécifiques au modèle de sécurité
  • wholeMsg: (OUT) Le message sécurisé complet
  • wholeMsgLength: (OUT) La longueur du message
  • statusInformation: (OUT) Indication de succès ou d'erreur

4.4.2. Process Incoming Message

Les modèles de traitement des messages utilisent la primitive processIncomingMsg pour demander au sous-système de sécurité de traiter un message entrant.

Primitive:

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
)

Paramètres:

  • messageProcessingModel: Le format de message utilisé
  • maxMessageSize: Taille maximale de message supportée
  • securityParameters: Paramètres spécifiques au modèle de sécurité du message
  • securityModel: Le modèle de sécurité indiqué dans le message
  • securityLevel: Le niveau de sécurité souhaité
  • wholeMsg: Le message reçu
  • wholeMsgLength: La longueur du message
  • securityEngineID: (OUT) L'ID du moteur autoritaire
  • securityName: (OUT) Le principal
  • scopedPDU: (OUT) La scoped PDU extraite et vérifiée
  • maxSizeResponseScopedPDU: (OUT) Taille maximale pour une réponse
  • securityStateReference: (OUT) Référence à l'état de sécurité en cache
  • statusInformation: (OUT) Indication de succès ou d'erreur

Le modèle de sécurité:

  1. Vérifie que le message est authentique (si l'authentification est requise)
  2. Déchiffre le message (si la confidentialité est requise)
  3. Vérifie l'actualité du message (pour empêcher les attaques par rejeu)
  4. Extrait la scopedPDU
  5. Met en cache l'état de sécurité si une réponse peut être nécessaire
  6. Retourne toutes les données extraites

4.4.3. Generate a Response Message

Les modèles de traitement des messages utilisent la primitive generateResponseMsg pour demander au sous-système de sécurité d'appliquer un traitement de sécurité à un message de réponse sortant.

Primitive:

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
)

Paramètres:

  • Similaire à generateRequestMsg, mais inclut securityStateReference
  • securityStateReference: État en cache de la requête originale
  • Les autres paramètres sont similaires à generateRequestMsg

Le modèle de sécurité utilise l'état de sécurité en cache pour appliquer le même traitement de sécurité à la réponse qu'à la requête.

4.5. Common Primitives

4.5.1. Release State Reference Information

Les composants utilisent la primitive stateRelease pour libérer les informations d'état en cache.

Primitive:

stateRelease(
IN stateReference
)

Paramètres:

  • stateReference: La référence à l'état en cache à libérer

Cette primitive est utilisée pour libérer des ressources lorsque les informations d'état en cache ne sont plus nécessaires. Elle est généralement appelée lorsque:

  • Une réponse a été envoyée
  • Une erreur s'est produite et aucune réponse ne sera envoyée
  • Un délai d'attente s'est produit en attendant une réponse

4.6. Scenario Diagrams

Cette section fournit des diagrammes de scénario montrant le flux des primitives pour les opérations courantes.

4.6.1. Command Generator or Notification Originator

Le diagramme suivant montre le flux lorsqu'une application initie une requête ou une notification:

Application          Dispatcher       Message Processing    Security
Model Model

sendPdu ----------->
prepareOutgoing
Message -------->
generateRequestMsg -->
(appliquer sécurité)
<------------------
<--------------
(envoyer message au réseau)

(plus tard, la réponse arrive)

(recevoir message du réseau)
prepareData
Elements ------->
processIncomingMsg -->
(vérifier sécurité)
<------------------
<--------------
processResponsePdu <-

4.6.2. Scenario Diagram for a Command Responder Application

Le diagramme suivant montre le flux lorsqu'une application répond à une requête:

Application          Dispatcher       Message Processing    Security
Model Model

(recevoir message du réseau)
prepareData
Elements ------->
processIncomingMsg -->
(vérifier sécurité)
<------------------
<--------------
processPdu <--------

(application traite la requête)

returnResponsePdu ->
prepareResponse
Message -------->
generateResponseMsg ->
(appliquer sécurité)
<------------------
<--------------
(envoyer message au réseau)

Ces diagrammes illustrent la conception modulaire de l'architecture et la séparation claire des préoccupations entre les différents sous-systèmes.