2.4. SNMP Messages Using this Security Model (Messages SNMP utilisant ce modèle de sécurité)
2.4. SNMP Messages Using this Security Model (Messages SNMP utilisant ce modèle de sécurité)
Cette section décrit le format et la structure des messages SNMP lors de l'utilisation du modèle de sécurité basé sur l'utilisateur.
SNMPv3 Message Format (Format de message SNMPv3)
Un message SNMPv3 utilisant l'USM a la structure suivante:
SNMPv3Message ::= SEQUENCE {
msgVersion INTEGER (3),
msgGlobalData HeaderData,
msgSecurityParameters OCTET STRING,
msgData ScopedPduData
}
Message Components (Composants du message)
1. msgVersion (Version du message)
- Type: INTEGER
- Valeur (Value): 3 (pour SNMPv3)
- Objectif (Purpose): Identifie la version SNMP
2. msgGlobalData (HeaderData) (Données de message global)
Contient des informations d'en-tête de message global:
HeaderData ::= SEQUENCE {
msgID INTEGER (0..2147483647),
msgMaxSize INTEGER (484..2147483647),
msgFlags OCTET STRING (SIZE(1)),
msgSecurityModel INTEGER (1..2147483647)
}
Champs (Fields):
-
msgID (ID de message): Identifiant unique pour coordonner les messages de requête et de réponse
- Plage: 0 à 2147483647
- Utilisé par le modèle requête/réponse pour faire correspondre les réponses aux requêtes
-
msgMaxSize (Taille maximale du message): Taille maximale de message que l'expéditeur peut accepter
- Minimum: 484 octets
- Utilisé pour la négociation de la taille des messages
-
msgFlags (Indicateurs de message): OCTET STRING de 1 octet contenant des indicateurs de bits
- Bit 0 (LSB):
authFlag- 1 si l'authentification est utilisée, 0 sinon - Bit 1:
privFlag- 1 si la confidentialité (chiffrement) est utilisée, 0 sinon - Bit 2:
reportableFlag- 1 si un Report-PDU doit être envoyé en cas d'erreur - Bits 3-7: Réservés, doivent être zéro
- Bit 0 (LSB):
-
msgSecurityModel (Modèle de sécurité du message): Identifie le modèle de sécurité utilisé
- Valeur: 3 pour le modèle de sécurité basé sur l'utilisateur (USM)
3. msgSecurityParameters (Paramètres de sécurité du message)
Pour l'USM, il s'agit d'un OCTET STRING contenant les UsmSecurityParameters codés en BER:
UsmSecurityParameters ::= SEQUENCE {
msgAuthoritativeEngineID OCTET STRING,
msgAuthoritativeEngineBoots INTEGER (0..2147483647),
msgAuthoritativeEngineTime INTEGER (0..2147483647),
msgUserName OCTET STRING (SIZE(0..32)),
msgAuthenticationParameters OCTET STRING,
msgPrivacyParameters OCTET STRING
}
Champs (Fields):
-
msgAuthoritativeEngineID (ID du moteur autorisé): Le snmpEngineID du moteur SNMP autorisé
- Pour les requêtes: L'engineID du répondeur de commandes
- Pour les notifications: L'engineID de l'initiateur de notification
- Pour les réponses: L'engineID du répondeur de commandes
- Pour les rapports: L'engineID de l'expéditeur du rapport
-
msgAuthoritativeEngineBoots (Démarrages du moteur autorisé): Compteur de démarrage du moteur autorisé
- Plage: 0 à 2147483647
- Incrémenté lorsque le moteur se réinitialise
- Utilisé pour la protection contre la relecture
-
msgAuthoritativeEngineTime (Temps du moteur autorisé): Nombre de secondes depuis le dernier démarrage
- Plage: 0 à 2147483647
- Incrémenté chaque seconde
- Utilisé pour la protection contre la relecture et la vérification de la fenêtre temporelle
-
msgUserName (Nom d'utilisateur): L'utilisateur (principal) au nom duquel le message est envoyé
- Longueur: 0 à 32 octets
- Doit exister dans la usmUserTable du moteur autorisé
- Sensible à la casse
-
msgAuthenticationParameters (Paramètres d'authentification): Résumé d'authentification
- La longueur dépend du protocole d'authentification:
- HMAC-MD5-96: 12 octets
- HMAC-SHA-96: 12 octets
- Vide (longueur nulle) si pas d'authentification
- Calculé sur le message entier (avec ce champ initialement défini à zéro)
- La longueur dépend du protocole d'authentification:
-
msgPrivacyParameters (Paramètres de confidentialité): Paramètres du protocole de confidentialité
- Pour CBC-DES: 8 octets (valeur de sel)
- Vide (longueur nulle) si pas de confidentialité
- Utilisé pour assurer des vecteurs d'initialisation de chiffrement différents
4. msgData (ScopedPduData) (Données du message)
La charge utile du message, qui peut être en texte clair ou chiffrée:
ScopedPduData ::= CHOICE {
plaintext ScopedPDU,
encryptedPDU OCTET STRING
}
Lorsque la confidentialité n'est PAS utilisée (privFlag = 0):
- msgData contient
plaintext ScopedPDU(texte clair)
Lorsque la confidentialité EST utilisée (privFlag = 1):
- msgData contient
encryptedPDU(OCTET STRING) - Les données chiffrées sont le ScopedPDU codé en BER
ScopedPDU Format (Format ScopedPDU)
ScopedPDU ::= SEQUENCE {
contextEngineID OCTET STRING,
contextName OCTET STRING,
data ANY -- PDU from RFC 3416
}
Champs (Fields):
-
contextEngineID (ID du moteur de contexte): Le snmpEngineID pour le contexte
- Généralement le même que msgAuthoritativeEngineID pour les scénarios non-proxy
- Peut différer dans les scénarios proxy
-
contextName (Nom du contexte): Le nom du contexte
- Utilisé avec contextEngineID pour identifier les informations de gestion
- Permet plusieurs contextes SNMP virtuels sur un seul moteur
-
data (données): Le PDU SNMP réel
- GetRequest, GetNextRequest, GetBulkRequest, SetRequest, InformRequest, SNMPv2-Trap, Response, ou Report
Security Level Combinations (Combinaisons de niveaux de sécurité)
Les msgFlags déterminent trois niveaux de sécurité:
-
noAuthNoPriv (pas d'authentification ni de confidentialité):
authFlag=0, privFlag=0- Pas d'authentification, pas de confidentialité
- msgAuthenticationParameters est vide
- msgPrivacyParameters est vide
- msgData est en texte clair
-
authNoPriv (authentification sans confidentialité):
authFlag=1, privFlag=0- Authentification sans confidentialité
- msgAuthenticationParameters contient le résumé
- msgPrivacyParameters est vide
- msgData est en texte clair
-
authPriv (authentification avec confidentialité):
authFlag=1, privFlag=1- Authentification et confidentialité
- msgAuthenticationParameters contient le résumé
- msgPrivacyParameters contient les paramètres de confidentialité
- msgData est chiffré
Note: La confidentialité sans authentification (authFlag=0, privFlag=1) n'est pas autorisée. Ces messages doivent être rejetés.
Message Flow Examples (Exemples de flux de messages)
Exemple 1: Requête de découverte noAuthNoPriv
SNMPv3Message {
msgVersion: 3,
msgGlobalData: {
msgID: 12345,
msgMaxSize: 65507,
msgFlags: 0x04 (reportableFlag défini),
msgSecurityModel: 3
},
msgSecurityParameters: {
msgAuthoritativeEngineID: "",
msgAuthoritativeEngineBoots: 0,
msgAuthoritativeEngineTime: 0,
msgUserName: "",
msgAuthenticationParameters: "",
msgPrivacyParameters: ""
},
msgData: plaintext ScopedPDU {
contextEngineID: "",
contextName: "",
data: GetRequest-PDU
}
}
Exemple 2: Requête authentifiée et chiffrée authPriv
SNMPv3Message {
msgVersion: 3,
msgGlobalData: {
msgID: 12346,
msgMaxSize: 65507,
msgFlags: 0x07 (authFlag, privFlag, reportableFlag),
msgSecurityModel: 3
},
msgSecurityParameters: {
msgAuthoritativeEngineID: 0x80001F8880...,
msgAuthoritativeEngineBoots: 15,
msgAuthoritativeEngineTime: 3045678,
msgUserName: "admin",
msgAuthenticationParameters: 0x9F3B7A2E... (12 octets),
msgPrivacyParameters: 0x0000000012345678 (8 octets)
},
msgData: encryptedPDU (ScopedPDU chiffré)
}
Message Size Considerations (Considérations sur la taille des messages)
La taille minimale de message que les implémentations doivent prendre en charge est 484 octets. Cela garantit:
- De l'espace pour les en-têtes de message
- Au moins un contenu PDU minimal
- Des paramètres de sécurité incluant le résumé d'authentification
Les implémentations devraient prendre en charge des messages plus grands (par exemple, 65507 octets pour UDP sur IPv4) pour accommoder:
- Les grandes liaisons de variables
- Les réponses GetBulk avec de nombreux éléments
- Les messages chiffrés avec surcharge de remplissage
Special Message Cases (Cas de messages spéciaux)
Report Messages (Messages de rapport)
Les Report-PDU sont des réponses spéciales utilisées pour la notification d'erreur et l'échange d'informations (découverte, synchronisation temporelle). Ils:
- Peuvent être envoyés sans authentification (pour la découverte)
- Peuvent être envoyés avec authentification (pour d'autres erreurs)
- Contiennent une seule liaison de variable avec un OID de compteur d'erreurs
- Utilisent le msgID du message qui a causé le rapport
Notification Messages (Messages de notification)
Pour les PDU InformRequest et SNMPv2-Trap:
- L'initiateur de notification (notification originator) est le moteur autorisé
- msgAuthoritativeEngineID est l'engineID de l'initiateur
- Le récepteur de notification doit mettre en cache les valeurs temporelles de l'initiateur
C'est l'inverse du modèle de répondeur de commandes, où le répondeur de commandes est autorisé.