3.1. Generating an Outgoing SNMP Message (Génération d'un message SNMP sortant)
3.1. Generating an Outgoing SNMP Message (Génération d'un message SNMP sortant)
Cette section décrit la procédure suivie par un moteur SNMP chaque fois qu'il génère un message contenant une opération de gestion (comme une requête, une réponse, une notification ou un rapport) au nom d'un utilisateur, avec un securityLevel particulier.
Étape 1: Déterminer les informations utilisateur (Determine User Information)
1a) Message de réponse ou de rapport (Response or Report Message)
Si une securityStateReference est passée (message de réponse ou de rapport), alors les informations concernant l'utilisateur sont extraites des cachedSecurityData. Les cachedSecurityData peuvent maintenant être jetées.
- Le securityEngineID est défini sur le snmpEngineID local
- Le securityLevel est défini sur la valeur spécifiée par le module appelant
1b) Message de requête ou de notification (Request or Notification Message)
Sinon, en fonction du securityName, les informations concernant l'utilisateur au snmpEngineID de destination, spécifié par le securityEngineID, sont extraites du magasin de données de configuration local (LCD, usmUserTable).
Si les informations sur l'utilisateur sont absentes du LCD, alors une indication d'erreur (unknownSecurityName) est renvoyée au module appelant.
Étape 2: Vérifier le support de la confidentialité (Check Privacy Support)
Si le securityLevel spécifie que le message doit être protégé contre la divulgation, mais que l'utilisateur ne prend pas en charge à la fois un protocole d'authentification et un protocole de confidentialité, alors le message ne peut pas être envoyé.
Une indication d'erreur (unsupportedSecurityLevel) est renvoyée au module appelant.
Note: La confidentialité (chiffrement) nécessite l'authentification. La combinaison noAuth + privacy n'est pas autorisée.
Étape 3: Vérifier le support d'authentification (Check Authentication Support)
Si le securityLevel spécifie que le message doit être authentifié, mais que l'utilisateur ne prend pas en charge un protocole d'authentification, alors le message ne peut pas être envoyé.
Une indication d'erreur (unsupportedSecurityLevel) est renvoyée au module appelant.
Étape 4: Chiffrer le message (si nécessaire) (Encrypt the Message)
4a) Avec confidentialité (authPriv)
Si le securityLevel spécifie que le message doit être protégé contre la divulgation, alors la séquence d'octets représentant le scopedPDU sérialisé est chiffrée selon le protocole de confidentialité de l'utilisateur.
Pour ce faire, un appel est effectué au module de confidentialité qui implémente le protocole de confidentialité de l'utilisateur selon la primitive abstraite:
statusInformation = -- succès ou échec
encryptData(
IN encryptKey -- privKey localisée de l'utilisateur
IN dataToEncrypt -- scopedPDU sérialisé
OUT encryptedData -- encryptedPDU sérialisé
OUT privParameters -- paramètres de confidentialité sérialisés
)
Paramètres (Parameters):
-
statusInformation: Indique si le processus de chiffrement a réussi ou non
-
encryptKey: La privKey privée localisée de l'utilisateur est la clé secrète qui peut être utilisée par l'algorithme de chiffrement
-
dataToEncrypt: Le scopedPDU sérialisé sont les données à chiffrer
-
encryptedData: L'encryptedPDU représente le scopedPDU chiffré, encodé comme un OCTET STRING
-
privParameters: Les paramètres de confidentialité, encodés comme un OCTET STRING
Gestion des erreurs (Error Handling):
Si le module de confidentialité renvoie un échec, alors le message ne peut pas être envoyé et une indication d'erreur (encryptionError) est renvoyée au module appelant.
Si le module de confidentialité renvoie un succès, alors:
- Les privParameters renvoyés sont placés dans le champ msgPrivacyParameters des securityParameters
- L'encryptedPDU sert de charge utile du message en cours de préparation
4b) Sans confidentialité (noAuthNoPriv ou authNoPriv)
Si le securityLevel spécifie que le message ne doit pas être protégé contre la divulgation, alors:
- Un OCTET STRING de longueur nulle est encodé dans le champ msgPrivacyParameters des securityParameters
- Le scopedPDU en texte clair sert de charge utile du message en cours de préparation
Étape 5: Définir msgAuthoritativeEngineID
Le securityEngineID est encodé comme un OCTET STRING dans le champ msgAuthoritativeEngineID des securityParameters.
Note: Un securityEngineID vide (longueur nulle) est acceptable pour un message de requête, car cela entraînera le moteur SNMP distant (autorisé) à renvoyer un Report PDU avec le securityEngineID approprié inclus dans le msgAuthoritativeEngineID dans les securityParameters de ce Report PDU renvoyé. Cela fait partie du mécanisme de découverte.
Étape 6: Définir snmpEngineBoots et snmpEngineTime
6a) Message authentifié (Authenticated Message)
Si le securityLevel spécifie que le message doit être authentifié, alors les valeurs actuelles de snmpEngineBoots et snmpEngineTime correspondant au securityEngineID du LCD sont utilisées.
6b) Message de réponse ou de rapport (non authentifié) (Response or Report Message - unauthenticated)
Sinon, s'il s'agit d'un message de réponse ou de rapport, alors la valeur actuelle de snmpEngineBoots et snmpEngineTime correspondant au snmpEngineID local du LCD est utilisée.
6c) Autres messages non authentifiés (Other Unauthenticated Messages)
Sinon (il s'agit d'une requête ou d'une notification non authentifiée), snmpEngineBoots et snmpEngineTime sont tous deux définis sur zéro.
Étape 7: Encoder les valeurs temporelles (Encode Time Values)
Les valeurs de msgAuthoritativeEngineBoots et msgAuthoritativeEngineTime sont définies sur les valeurs déterminées à l'étape 6 et sont encodées en tant que valeurs INTEGER dans les securityParameters.
Étape 8: Définir msgUserName
Le champ msgUserName est défini sur le securityName et est encodé comme un OCTET STRING dans les securityParameters.
Étape 9: Authentifier le message (si nécessaire) (Authenticate the Message)
9a) Avec authentification (authNoPriv ou authPriv)
Si le securityLevel spécifie que le message doit être authentifié, alors le message est authentifié selon le protocole d'authentification de l'utilisateur.
Le champ msgAuthenticationParameters est défini sur la sérialisation selon les règles du protocole d'authentification de:
authenticationInformation =
authenticationAlgorithm(
IN authKey -- authKey localisée de l'utilisateur
IN wholeMsg -- message non authentifié
)
Processus (Process):
-
Le champ msgAuthenticationParameters est temporairement rempli avec une valeur déterminée par le protocole d'authentification (généralement 12 octets zéro pour HMAC-MD5-96 et HMAC-SHA-96)
-
L'algorithme d'authentification est exécuté sur l'ensemble du message sérialisé (wholeMsg)
-
La sortie de l'algorithme d'authentification (le MAC/résumé) remplace la valeur temporaire dans msgAuthenticationParameters
Paramètres (Parameters):
-
authKey: L'authKey privée localisée de l'utilisateur est la clé secrète utilisée par l'algorithme d'authentification
-
wholeMsg: Le message non authentifié (avec msgAuthenticationParameters temporairement défini sur des zéros)
-
authenticationInformation: Le résumé/MAC d'authentification calculé
Le résumé d'authentification calculé est placé dans le champ msgAuthenticationParameters.
9b) Sans authentification (noAuthNoPriv)
Si le securityLevel spécifie que le message ne doit pas être authentifié, alors un OCTET STRING de longueur nulle est encodé dans le champ msgAuthenticationParameters.
Étape 10: Finaliser et renvoyer (Finalize and Return)
Le wholeMsg complet est renvoyé au module appelant avec statusInformation indiquant le succès.
Message Generation Flow Summary (Résumé du flux de génération de messages)
1. Rechercher les informations utilisateur (depuis le cache ou LCD)
2. Valider le support du niveau de sécurité
3. Vérifier le support d'authentification
4. Chiffrer scopedPDU (si authPriv)
└─> Définir msgPrivacyParameters
5. Définir msgAuthoritativeEngineID
6. Déterminer les valeurs temporelles (boots/time)
7. Encoder les valeurs temporelles
8. Définir msgUserName
9. Authentifier le message (si authNoPriv ou authPriv)
└─> Calculer MAC/résumé
└─> Définir msgAuthenticationParameters
10. Renvoyer wholeMsg complet
Special Cases (Cas spéciaux)
Discovery Messages (Messages de découverte)
Pour les messages de découverte:
- securityEngineID est vide (longueur nulle)
- securityLevel est noAuthNoPriv
- msgAuthoritativeEngineID est vide
- msgAuthoritativeEngineBoots et msgAuthoritativeEngineTime sont zéro
- msgUserName est vide
- msgAuthenticationParameters est vide
- msgPrivacyParameters est vide
Notification Messages (Messages de notification)
Pour les messages de notification (Trap, Inform):
- L'initiateur de notification (notification originator) est le moteur autorisé
- securityEngineID est le snmpEngineID local
- Utiliser les valeurs locales snmpEngineBoots et snmpEngineTime
Error Conditions (Conditions d'erreur)
Les indications d'erreur suivantes peuvent être renvoyées:
| Erreur (Error) | Condition |
|---|---|
| unknownSecurityName | Utilisateur non trouvé dans LCD |
| unsupportedSecurityLevel | L'utilisateur manque de protocole d'authentification ou de confidentialité requis |
| encryptionError | Le module de confidentialité n'a pas réussi à chiffrer les données |
Implementation Notes (Notes d'implémentation)
-
Données de sécurité mises en cache (Cached Security Data): Pour les messages de réponse et de rapport, les informations de sécurité sont récupérées à partir des données mises en cache enregistrées lors du traitement du message de requête original
-
Synchronisation temporelle (Time Synchronization): Les messages authentifiés utilisent les valeurs temporelles du LCD pour le moteur autorisé cible. Ces valeurs doivent rester synchronisées (voir Section 4 sur la découverte)
-
Utilisation des clés (Key Usage): Les authKey et privKey localisées pour le securityEngineID spécifique doivent être utilisées
-
Taille du message (Message Size): L'implémentation doit s'assurer que le message généré ne dépasse pas le maxMessageSize négocié avec le moteur distant