跳到主要内容

2.4. SNMP Messages Using this Security Model (使用此安全模型的 SNMP 消息)

2.4. SNMP Messages Using this Security Model (使用此安全模型的 SNMP 消息)

本节描述使用基于用户的安全模型时 SNMP 消息的格式和结构。

SNMPv3 Message Format (SNMPv3 消息格式)

使用 USM 的 SNMPv3 消息具有以下结构:

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

Message Components (消息组件)

1. msgVersion (消息版本)

  • 类型 (Type): INTEGER
  • 值 (Value): 3 (对于 SNMPv3)
  • 目的 (Purpose): 标识 SNMP 版本

2. msgGlobalData (HeaderData) (全局消息数据)

包含全局消息头信息:

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

字段 (Fields):

  • msgID (消息 ID): 用于协调请求和响应消息的唯一标识符

    • 范围: 0 到 2147483647
    • 请求/响应模型使用它将响应与请求匹配
  • msgMaxSize (最大消息大小): 发送方可以接受的最大消息大小

    • 最小值: 484 字节
    • 用于消息大小协商
  • msgFlags (消息标志): 包含位标志的 1 字节 OCTET STRING

    • 位 0 (LSB): authFlag - 如果使用认证则为 1, 否则为 0
    • 位 1: privFlag - 如果使用隐私 (加密) 则为 1, 否则为 0
    • 位 2: reportableFlag - 如果出错时应发送报告-PDU 则为 1
    • 位 3-7: 保留, 必须为零
  • msgSecurityModel (消息安全模型): 标识正在使用的安全模型

    • 值: 基于用户的安全模型 (USM) 为 3

3. msgSecurityParameters (消息安全参数)

对于 USM, 这是包含 BER 编码的 UsmSecurityParameters 的 OCTET STRING:

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 (权威引擎 ID): 权威 SNMP 引擎的 snmpEngineID

    • 对于请求: 命令响应器的 engineID
    • 对于通知: 通知发起者的 engineID
    • 对于响应: 命令响应器的 engineID
    • 对于报告: 报告发送者的 engineID
  • msgAuthoritativeEngineBoots (权威引擎启动计数): 权威引擎的启动计数器

    • 范围: 0 到 2147483647
    • 引擎重新初始化时递增
    • 用于重放保护
  • msgAuthoritativeEngineTime (权威引擎时间): 自上次启动以来的秒数

    • 范围: 0 到 2147483647
    • 每秒递增
    • 用于重放保护和时间窗口验证
  • msgUserName (用户名): 代表其发送消息的用户 (主体)

    • 长度: 0 到 32 字节
    • 必须存在于权威引擎的 usmUserTable 中
    • 区分大小写
  • msgAuthenticationParameters (认证参数): 认证摘要

    • 长度取决于认证协议:
      • HMAC-MD5-96: 12 字节
      • HMAC-SHA-96: 12 字节
    • 如果无认证则为空 (零长度)
    • 在整个消息上计算 (此字段最初设置为零)
  • msgPrivacyParameters (隐私参数): 隐私协议参数

    • 对于 CBC-DES: 8 字节 (盐值)
    • 如果无隐私则为空 (零长度)
    • 用于确保不同的密码初始化向量

4. msgData (ScopedPduData) (消息数据)

消息有效负载, 可以是明文或加密的:

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

当不使用隐私时 (privFlag = 0):

  • msgData 包含 plaintext ScopedPDU (明文)

当使用隐私时 (privFlag = 1):

  • msgData 包含 encryptedPDU (OCTET STRING)
  • 加密数据是 BER 编码的 ScopedPDU

ScopedPDU Format (作用域 PDU 格式)

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

字段 (Fields):

  • contextEngineID (上下文引擎 ID): 上下文的 snmpEngineID

    • 对于非代理场景, 通常与 msgAuthoritativeEngineID 相同
    • 在代理场景中可能不同
  • contextName (上下文名称): 上下文名称

    • 与 contextEngineID 一起使用以标识管理信息
    • 允许单个引擎上有多个虚拟 SNMP 上下文
  • data (数据): 实际的 SNMP PDU

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

Security Level Combinations (安全级别组合)

msgFlags 确定三个安全级别:

  1. noAuthNoPriv (无认证无隐私): authFlag=0, privFlag=0

    • 无认证, 无隐私
    • msgAuthenticationParameters 为空
    • msgPrivacyParameters 为空
    • msgData 为明文
  2. authNoPriv (有认证无隐私): authFlag=1, privFlag=0

    • 有认证无隐私
    • msgAuthenticationParameters 包含摘要
    • msgPrivacyParameters 为空
    • msgData 为明文
  3. authPriv (有认证有隐私): authFlag=1, privFlag=1

    • 有认证和隐私
    • msgAuthenticationParameters 包含摘要
    • msgPrivacyParameters 包含隐私参数
    • msgData 已加密

注意: 不允许无认证有隐私 (authFlag=0, privFlag=1)。必须拒绝此类消息。

Message Flow Examples (消息流示例)

示例 1: noAuthNoPriv 发现请求

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

示例 2: 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 字节),
msgPrivacyParameters: 0x0000000012345678 (8 字节)
},
msgData: encryptedPDU (加密的 ScopedPDU)
}

Message Size Considerations (消息大小考虑)

实现必须支持的最小消息大小是 484 字节。这确保:

  1. 消息头有空间
  2. 至少有最小的 PDU 内容
  3. 包括认证摘要的安全参数

实现应支持更大的消息 (例如, IPv4 上 UDP 的 65507 字节) 以容纳:

  • 大型变量绑定
  • 包含许多项目的 GetBulk 响应
  • 具有填充开销的加密消息

Special Message Cases (特殊消息情况)

Report Messages (报告消息)

报告-PDU 是用于错误通知和信息交换 (发现、时间同步) 的特殊响应。它们:

  • 可以无需认证发送 (用于发现)
  • 可以使用认证发送 (用于其他错误)
  • 包含带有错误计数器 OID 的单个变量绑定
  • 使用导致报告的消息的 msgID

Notification Messages (通知消息)

对于 InformRequest 和 SNMPv2-Trap PDU:

  • 通知发起者 (notification originator) 是权威引擎
  • msgAuthoritativeEngineID 是发起者的 engineID
  • 通知接收器必须缓存发起者的时间值

这与命令响应器模型相反, 其中命令响应器是权威的。