Skip to main content

2.4. SNMP Messages Using this Security Model

2.4. SNMP Messages Using this Security Model

This section describes the format and structure of SNMP messages when using the User-based Security Model.

SNMPv3 Message Format

An SNMPv3 message using USM has the following structure:

SNMPv3Message ::= SEQUENCE {
msgVersion INTEGER (3),
msgGlobalData HeaderData,
msgSecurityParameters OCTET STRING,
msgData ScopedPduData
}

Message Components

1. msgVersion

  • Type: INTEGER
  • Value: 3 (for SNMPv3)
  • Purpose: Identifies the SNMP version

2. msgGlobalData (HeaderData)

Contains global message header information:

HeaderData ::= SEQUENCE {
msgID INTEGER (0..2147483647),
msgMaxSize INTEGER (484..2147483647),
msgFlags OCTET STRING (SIZE(1)),
msgSecurityModel INTEGER (1..2147483647)
}

Fields:

  • msgID: Unique identifier for coordinating request and response messages

    • Range: 0 to 2147483647
    • Used by request/response model to match responses to requests
  • msgMaxSize: Maximum message size the sender can accept

    • Minimum: 484 octets
    • Used for message size negotiation
  • msgFlags: OCTET STRING of 1 octet containing bit flags

    • Bit 0 (LSB): authFlag - 1 if authentication used, 0 otherwise
    • Bit 1: privFlag - 1 if privacy (encryption) used, 0 otherwise
    • Bit 2: reportableFlag - 1 if a Report-PDU should be sent on error
    • Bits 3-7: Reserved, must be zero
  • msgSecurityModel: Identifies the security model in use

    • Value: 3 for User-based Security Model (USM)

3. msgSecurityParameters

For USM, this is an OCTET STRING containing the BER-encoded UsmSecurityParameters:

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
}

Fields:

  • msgAuthoritativeEngineID: The snmpEngineID of the authoritative SNMP engine

    • For requests: The command responder's engineID
    • For notifications: The notification originator's engineID
    • For responses: The command responder's engineID
    • For reports: The report sender's engineID
  • msgAuthoritativeEngineBoots: Boot counter of the authoritative engine

    • Range: 0 to 2147483647
    • Incremented when engine reinitializes
    • Used for replay protection
  • msgAuthoritativeEngineTime: Number of seconds since last boot

    • Range: 0 to 2147483647
    • Incremented each second
    • Used for replay protection and time window verification
  • msgUserName: The user (principal) on whose behalf the message is sent

    • Length: 0 to 32 octets
    • Must exist in the authoritative engine's usmUserTable
    • Case-sensitive
  • msgAuthenticationParameters: Authentication digest

    • Length depends on authentication protocol:
      • HMAC-MD5-96: 12 octets
      • HMAC-SHA-96: 12 octets
    • Empty (zero-length) if no authentication
    • Calculated over the entire message (with this field initially set to zeros)
  • msgPrivacyParameters: Privacy protocol parameters

    • For CBC-DES: 8 octets (salt value)
    • Empty (zero-length) if no privacy
    • Used to ensure different cipher initialization vectors

4. msgData (ScopedPduData)

The message payload, which can be either plaintext or encrypted:

ScopedPduData ::= CHOICE {
plaintext ScopedPDU,
encryptedPDU OCTET STRING
}

When privacy is NOT used (privFlag = 0):

  • msgData contains plaintext ScopedPDU

When privacy IS used (privFlag = 1):

  • msgData contains encryptedPDU (OCTET STRING)
  • The encrypted data is the BER-encoded ScopedPDU

ScopedPDU Format

ScopedPDU ::= SEQUENCE {
contextEngineID OCTET STRING,
contextName OCTET STRING,
data ANY -- PDU from RFC 3416
}

Fields:

  • contextEngineID: The snmpEngineID for the context

    • Typically the same as msgAuthoritativeEngineID for non-proxy scenarios
    • May differ in proxy scenarios
  • contextName: The context name

    • Used with contextEngineID to identify the management information
    • Enables multiple virtual SNMP contexts on a single engine
  • data: The actual SNMP PDU

    • GetRequest, GetNextRequest, GetBulkRequest, SetRequest, InformRequest, SNMPv2-Trap, Response, or Report

Security Level Combinations

The msgFlags determine three security levels:

  1. noAuthNoPriv: authFlag=0, privFlag=0

    • No authentication, no privacy
    • msgAuthenticationParameters is empty
    • msgPrivacyParameters is empty
    • msgData is plaintext
  2. authNoPriv: authFlag=1, privFlag=0

    • Authentication without privacy
    • msgAuthenticationParameters contains digest
    • msgPrivacyParameters is empty
    • msgData is plaintext
  3. authPriv: authFlag=1, privFlag=1

    • Authentication and privacy
    • msgAuthenticationParameters contains digest
    • msgPrivacyParameters contains privacy parameters
    • msgData is encrypted

Note: Privacy without authentication (authFlag=0, privFlag=1) is not allowed. Such messages must be rejected.

Message Flow Examples

Example 1: noAuthNoPriv Discovery Request

SNMPv3Message {
msgVersion: 3,
msgGlobalData: {
msgID: 12345,
msgMaxSize: 65507,
msgFlags: 0x04 (reportableFlag set),
msgSecurityModel: 3
},
msgSecurityParameters: {
msgAuthoritativeEngineID: "",
msgAuthoritativeEngineBoots: 0,
msgAuthoritativeEngineTime: 0,
msgUserName: "",
msgAuthenticationParameters: "",
msgPrivacyParameters: ""
},
msgData: plaintext ScopedPDU {
contextEngineID: "",
contextName: "",
data: GetRequest-PDU
}
}

Example 2: authPriv Authenticated and Encrypted Request

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 (encrypted ScopedPDU)
}

Message Size Considerations

The minimum message size that implementations must support is 484 octets. This ensures:

  1. Room for message headers
  2. At least minimal PDU content
  3. Security parameters including authentication digest

Implementations should support larger messages (e.g., 65507 octets for UDP on IPv4) to accommodate:

  • Large variable bindings
  • GetBulk responses with many items
  • Encrypted messages with padding overhead

Special Message Cases

Report Messages

Report-PDUs are special responses used for error notification and information exchange (discovery, time synchronization). They:

  • May be sent without authentication (for discovery)
  • May be sent with authentication (for other errors)
  • Contain a single variable binding with an error counter OID
  • Use the msgID from the message that caused the report

Notification Messages

For InformRequest and SNMPv2-Trap PDUs:

  • The notification originator is the authoritative engine
  • msgAuthoritativeEngineID is the originator's engineID
  • The notification receiver must cache the originator's time values

This is the reverse of the command responder model, where the command responder is authoritative.