跳到主要内容

1.6. Abstract Service Interfaces (抽象服务接口)

1.6. Abstract Service Interfaces (抽象服务接口)

基于用户的安全模型被设计为通过定义良好的抽象服务接口与 SNMPv3 架构集成。这些接口允许 USM 独立于其他子系统工作, 同时提供必要的安全服务。

Security Model Interface (安全模型接口)

USM 实现了 RFC 3411 中定义的安全模型接口。该接口由两个主要原语组成:

1. generateRequestMsg (生成请求消息)

目的 (Purpose): 通过添加与安全相关的信息来处理传出的 SNMP 消息。

输入 (Inputs):

  • messageProcessingModel: SNMP 版本 (SNMPv3 为 3)
  • globalData: 全局消息头信息
  • maxMessageSize: 支持的最大消息大小
  • securityModel: 安全模型标识符 (USM 为 3)
  • securityEngineID: 权威 SNMP 引擎的标识符
  • securityName: 代表其生成消息的主体
  • securityLevel: 所需的安全级别 (noAuthNoPriv, authNoPriv, 或 authPriv)
  • scopedPDU: 要保护的消息有效负载

输出 (Outputs):

  • securityParameters: USM 特定的安全参数 (engineID, engineBoots, engineTime, userName, 认证参数, 隐私参数)
  • wholeMsg: 准备传输的完整安全消息
  • statusInformation: 成功或错误指示

处理 (Processing):

  1. 验证输入
  2. 检索用户的认证和隐私密钥
  3. 递增并包含 engineBoots 和 engineTime
  4. 如果 securityLevel 包含隐私, 则应用隐私协议
  5. 如果 securityLevel 包含认证, 则计算认证摘要
  6. 组装完整消息

2. processIncomingMsg (处理传入消息)

目的 (Purpose): 通过验证与安全相关的信息来处理传入的 SNMP 消息。

输入 (Inputs):

  • messageProcessingModel: SNMP 版本
  • maxMessageSize: 支持的最大消息大小
  • securityParameters: 接收到的 USM 安全参数
  • securityModel: 安全模型标识符
  • securityLevel: 期望的安全级别
  • wholeMsg: 接收到的完整消息
  • securityEngineID: 权威引擎的标识符 (来自消息)

输出 (Outputs):

  • securityName: 已认证的主体
  • scopedPDU: 解密和验证的消息有效负载
  • maxSizeResponseScopedPDU: 响应的最大大小
  • securityStateReference: 用于生成响应的引用
  • statusInformation: 成功或错误指示

处理 (Processing):

  1. 解析 securityParameters
  2. 验证 msgAuthoritativeEngineID 与本地引擎匹配 (对于命令响应器)
  3. 验证 userName 存在于 usmUserTable 中
  4. 检查时间窗口 (engineBoots 和 engineTime)
  5. 如果应用了隐私, 则解密消息
  6. 如果应用了认证, 则验证认证摘要
  7. 提取并返回 scopedPDU

Integration with Message Processing Subsystem (与消息处理子系统的集成)

消息处理子系统在消息处理的特定点通过这些接口调用 USM:

对于传出消息 (For Outgoing Messages):

应用 → 分发器 → 消息处理 → 安全模型 (USM) → 传输

对于传入消息 (For Incoming Messages):

传输 → 分发器 → 消息处理 → 安全模型 (USM) → 应用

Interaction with Access Control (与访问控制的交互)

USM 向访问控制子系统 (VACM) 提供已认证的 securityName, VACM 使用它来确定授权:

  1. USM 认证用户并提供 securityName
  2. VACM 使用 securityNamesecurityModelsecurityLevel 来确定访问权限
  3. VACM 根据配置的策略授予或拒绝访问

这种分离确保:

  • USM 专注于: "你是谁?" (认证) 和 "消息是否完整?" (完整性)
  • VACM 专注于: "你被允许做什么?" (授权)

Error Handling and Reports (错误处理和报告)

当 USM 检测到安全错误时, 它可能生成报告-PDU:

常见错误场景 (Common Error Scenarios):

  1. 未知引擎 ID (Unknown Engine ID): usmStatsUnknownEngineIDs 计数器递增

    • 在发现过程中使用
    • 报告包含本地引擎的 engineID
  2. 时间窗口违规 (Time Window Violation): usmStatsNotInTimeWindows 计数器递增

    • 在时间同步期间使用
    • 报告包含当前的 engineBoots 和 engineTime
  3. 认证失败 (Authentication Failure): usmStatsWrongDigests 计数器递增

    • 指示密码/密钥不正确或消息被篡改
    • 以与接收消息相同的安全级别发送报告
  4. 解密失败 (Decryption Failure): usmStatsDecryptionErrors 计数器递增

    • 指示隐私密钥不正确或消息损坏
    • 以与接收消息相同的安全级别发送报告
  5. 未知用户 (Unknown User): usmStatsUnknownUserNames 计数器递增

    • 指示 userName 不在 usmUserTable 中
    • 无需认证即发送报告

Service Primitive Sequences (服务原语序列)

Discovery Sequence (发现序列)

1. 应用发送带有空 engineID 的请求
2. USM 以 securityLevel = noAuthNoPriv 生成消息
3. 权威引擎接收消息
4. USM 检测到未知的 engineID
5. USM 生成带有 usmStatsUnknownEngineIDs 的报告
6. 应用接收报告, 学习 engineID

Time Synchronization Sequence (时间同步序列)

1. 应用发送带有缓存的 engineID 和零 engineBoots/Time 的请求
2. USM 生成已认证的消息
3. 权威引擎接收消息
4. USM 检测到时间窗口违规
5. USM 生成带有 usmStatsNotInTimeWindows 和当前时间值的报告
6. 应用接收报告, 更新缓存的时间值
7. 应用使用同步的时间重试原始请求

Authenticated Communication Sequence (已认证通信序列)

1. 应用发送请求
2. USM 生成带有当前 engineBoots/Time 的已认证消息
3. USM 计算认证摘要
4. 权威引擎接收消息
5. USM 验证时间窗口
6. USM 验证认证摘要
7. USM 提取 scopedPDU
8. 应用处理请求
9. 应用生成响应
10. USM 生成已认证的响应消息
11. 非权威引擎接收响应
12. USM 验证认证摘要
13. USM 提取 scopedPDU
14. 应用处理响应

Asynchronous vs. Synchronous Operation (异步与同步操作)

抽象服务接口被设计为支持:

同步操作 (Synchronous Operation):

  • 应用等待响应
  • 命令生成器/响应器模型的典型情况

异步操作 (Asynchronous Operation):

  • 应用不等待
  • 通知发起者/接收器模型的典型情况

USM 不规定操作模型; 它只是提供安全服务, 无论应用选择如何操作。