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 destinationmessageProcessingModel: Le format de message à utilisersecurityModel: Le modèle de sécurité à utilisersecurityName: 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 contextecontextName: Le nom du contextepduVersion: La version de la PDUPDU: La PDU à envoyerexpectResponse: Si une réponse est attenduesendPduHandle: Un handle pour identifier cette requêtedestTransportDomain: (OUT) Le domaine de transport réellement utilisédestTransportAddress: (OUT) L'adresse de transport réellement utiliséestatusInformation: (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 messagecontextEngineID: L'ID du moteur de contextecontextName: Le nom du contextepduVersion: La version de la PDUPDU: La PDU reçuemaxSizeResponseScopedPDU: La taille maximale pour une réponsestateReference: 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 à envoyermaxSizeResponseScopedPDU: Taille maximale pour la réponse (de processPdu)stateReference: Informations d'état (de processPdu)statusInformation: Informations d'état sur le traitement de la requêteresult: (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 principalsecurityLevel: Le niveau de sécurité appliquécontextEngineID: L'ID du moteur de contextecontextName: Le nom du contextepduVersion: La version de la PDUPDU: La PDU de réponse reçuestatusInformation: Informations d'état sur le traitement du messagesendPduHandle: 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'enregistrerpduType: 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 transmissionoutgoingMessageLength: (OUT) La longueur du messagestatusInformation: (OUT) Indication de succès ou d'erreur
Le modèle de traitement des messages:
- Crée une scopedPDU à partir du contextEngineID, contextName et PDU
- Appelle le modèle de sécurité pour appliquer le traitement de sécurité
- Emballe le message sécurisé dans le format de message approprié
- 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 messageresult: (OUT) Indication de succès ou d'erreur
Le modèle de traitement des messages:
- Récupère les informations en cache à l'aide de la stateReference
- Crée une scopedPDU à partir du contextEngineID, contextName et PDU
- Appelle le modèle de sécurité pour appliquer le traitement de sécurité
- Emballe le message sécurisé dans le format de message approprié
- Retourne le message complet prêt pour la transmission
- 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 sourcewholeMsg: Le message reçuwholeMsgLength: 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:
- Analyse le format du message
- Appelle le modèle de sécurité pour traiter la sécurité
- Extrait la scopedPDU
- Analyse la scopedPDU pour extraire contextEngineID, contextName et PDU
- Met en cache les informations d'état si le message nécessite une réponse
- 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'utilisationsecurityName: Le principal tentant l'accèssecurityLevel: Le niveau de sécurité du messageviewType: 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 messagemaxMessageSize: Taille maximale de message supportéesecurityModel: Le modèle de sécurité à utilisersecurityEngineID: L'ID du moteur autoritairesecurityName: Le principalsecurityLevel: Le niveau de sécurité souhaitéscopedPDU: La scoped PDU à sécurisersecurityParameters: (OUT) Paramètres spécifiques au modèle de sécuritéwholeMsg: (OUT) Le message sécurisé completwholeMsgLength: (OUT) La longueur du messagestatusInformation: (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éesecurityParameters: Paramètres spécifiques au modèle de sécurité du messagesecurityModel: Le modèle de sécurité indiqué dans le messagesecurityLevel: Le niveau de sécurité souhaitéwholeMsg: Le message reçuwholeMsgLength: La longueur du messagesecurityEngineID: (OUT) L'ID du moteur autoritairesecurityName: (OUT) Le principalscopedPDU: (OUT) La scoped PDU extraite et vérifiéemaxSizeResponseScopedPDU: (OUT) Taille maximale pour une réponsesecurityStateReference: (OUT) Référence à l'état de sécurité en cachestatusInformation: (OUT) Indication de succès ou d'erreur
Le modèle de sécurité:
- Vérifie que le message est authentique (si l'authentification est requise)
- Déchiffre le message (si la confidentialité est requise)
- Vérifie l'actualité du message (pour empêcher les attaques par rejeu)
- Extrait la scopedPDU
- Met en cache l'état de sécurité si une réponse peut être nécessaire
- 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.