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: 保留, 必须为零
- 位 0 (LSB):
-
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 确定三个安全级别:
-
noAuthNoPriv (无认证无隐私):
authFlag=0, privFlag=0- 无认证, 无隐私
- msgAuthenticationParameters 为空
- msgPrivacyParameters 为空
- msgData 为明文
-
authNoPriv (有认证无隐私):
authFlag=1, privFlag=0- 有认证无隐私
- msgAuthenticationParameters 包含摘要
- msgPrivacyParameters 为空
- msgData 为明文
-
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 字节。这确保:
- 消息头有空间
- 至少有最小的 PDU 内容
- 包括认证摘要的安全参数
实现应支持更大的消息 (例如, IPv4 上 UDP 的 65507 字节) 以容纳:
- 大型变量绑定
- 包含许多项目的 GetBulk 响应
- 具有填充开销的加密消息
Special Message Cases (特殊消息情况)
Report Messages (报告消息)
报告-PDU 是用于错误通知和信息交换 (发现、时间同步) 的特殊响应。它们:
- 可以无需认证发送 (用于发现)
- 可以使用认证发送 (用于其他错误)
- 包含带有错误计数器 OID 的单个变量绑定
- 使用导致报告的消息的 msgID
Notification Messages (通知消息)
对于 InformRequest 和 SNMPv2-Trap PDU:
- 通知发起者 (notification originator) 是权威引擎
- msgAuthoritativeEngineID 是发起者的 engineID
- 通知接收器必须缓存发起者的时间值
这与命令响应器模型相反, 其中命令响应器是权威的。