跳到主要内容

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
  • 通知接收器必须缓存发起者的时间值

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