跳到主要内容

Appendix A. 模型设计者指南

Appendix A. 模型设计者指南 (Guidelines for Model Designers)​

本附录为 Security Models, Message Processing Models, Access Control Models 和 SNMP Applications 的设计者提供指南. 这些指南是资料性的, 旨在帮助实现者创建能在 SNMP 架构内正确工作的组件.

A.1. Security Model 设计要求​

Security Model 必须提供认证, 隐私和及时性检查机制. 本节描述 Security Models 的要求.

A.1.1. 威胁 (Threats)​

Security Models 必须处理以下威胁:

  1. Modification of Information: 未授权实体修改传输中的消息.

    • Security Model 必须提供数据完整性服务来检测此类修改.
  2. Masquerade: 未授权实体冒充授权实体.

    • Security Model 必须提供认证服务来验证身份.
  3. Message Stream Modification: 对消息重新排序, 延迟或重放.

    • Security Model 必须提供及时性检查来检测此类攻击.
  4. Disclosure: 将消息内容泄露给未授权实体.

    • Security Model 可以选择通过加密提供机密性服务.

A.1.2. 安全处理 (Security Processing)​

Security Model 必须实现以下抽象服务原语:

  1. generateRequestMsg: 对外发请求和通知消息应用安全处理.

    • 输入: scopedPDU, security parameters.
    • 输出: 可传输的受保护消息.
    • 处理:
      • 应用认证, 如果 security level 要求.
      • 应用加密, 如果 security level 要求.
      • 向消息添加 security parameters.
      • 确保消息按 securityLevel 受到保护.
  2. processIncomingMsg: 处理入站消息的安全性.

    • 输入: received message.
    • 输出: 提取出的 scopedPDU, security parameters.
    • 处理:
      • 验证认证, 如果消息声称已认证.
      • 解密消息, 如果消息已加密.
      • 检查及时性, 以防止重放攻击.
      • 提取 scopedPDU.
      • 如果可能需要响应, 缓存安全状态.
  3. generateResponseMsg: 对外发响应消息应用安全处理.

    • 输入: scopedPDU, cached security state.
    • 输出: 受保护的响应消息.
    • 处理:
      • 从缓存状态取回 security parameters.
      • 应用与请求相同的 security level.
      • 应用认证, 如果需要.
      • 应用加密, 如果需要.

A.1.3. 验证接收消息中的 security-stamp​

Security Model 必须验证:

  1. 认证有效 (Authentication is valid): 如果消息声称已认证, 验证认证码.

    • 使用适当的密码验证, 例如 HMAC verification.
    • 拒绝认证无效的消息.
  2. 消息及时 (Message is timely): 验证消息不是重放消息.

    • 检查消息时间参数.
    • 维护状态以检测重放.
    • 拒绝时间窗口之外的消息.
  3. 隐私正确应用 (Privacy is applied correctly): 如果消息已加密, 验证它可以被解密.

    • 使用适当密钥尝试解密.
    • 验证解密成功.
    • 拒绝无法解密的消息.
  4. 安全级别符合要求 (Security level matches requirements): 验证实际应用的安全性与请求的安全性匹配.

    • 检查 authNoPriv 消息已认证但未加密.
    • 检查 authPriv 消息既已认证又已加密.
    • 检查 noAuthNoPriv 消息既未认证也未加密.

A.1.4. Security MIBs​

Security Model 应定义一个 MIB 模块, 允许:

  1. 配置安全参数: users, keys, authentication protocols, privacy protocols.
  2. 监控安全性: authentication failures, decryption errors 等计数器.
  3. 远程配置: 用于远程配置安全性的安全机制.

User-based Security Model (USM) 为此定义了 SNMP-USER-BASED-SM-MIB.

A.1.5. 缓存安全数据 (Cached Security Data)​

处理可能需要响应的入站请求时, Security Model 必须缓存安全状态信息. 这些缓存数据允许使用与请求相同的 security parameters 来保护响应.

缓存的安全数据通常包括:

  • 请求中的 security parameters.
  • 用于认证和/或加密的密钥.
  • 时间参数.
  • 生成响应所需的任何其他状态.

Security Model 必须:

  1. 生成 securityStateReference: 缓存状态的唯一标识符.
  2. 向 Message Processing Model 返回 securityStateReference.
  3. 在调用 generateResponseMsg 时取回缓存状态.
  4. 在生成响应后或显式释放时释放缓存状态.

缓存状态可在以下情况下隐式释放:

  • 响应成功生成.
  • 发生错误且不会发送响应.
  • 发生超时.

可以使用 stateRelease 原语显式释放缓存状态.

A.2. Message Processing Model 设计要求​

Message Processing Model 定义消息格式以及处理该格式消息的过程. 本节描述 Message Processing Models 的要求.

A.2.1. 从网络接收 SNMP 消息​

从网络接收到消息时, Dispatcher 根据消息版本或格式确定应由哪个 Message Processing Model 处理它. Message Processing Model 必须实现 prepareDataElements 原语.

prepareDataElements 处理:

  1. 解析消息格式: 从消息中提取各个组件.

    • Message header.
    • Security parameters.
    • Scoped PDU 或 payload.
  2. 确定 security model: 识别使用了哪个 Security Model.

    • 通常在消息头部中指示.
  3. 调用 Security Model: 调用 processIncomingMsg 以:

    • 验证认证.
    • 解密消息.
    • 检查及时性.
    • 提取 scoped PDU.
  4. 解析 scoped PDU: 提取:

    • contextEngineID.
    • contextName.
    • PDU.
  5. 必要时缓存状态: 如果这是一个可能需要响应的请求:

    • 缓存生成响应所需的信息.
    • 生成 stateReference.
    • 将 stateReference 与缓存数据关联.
  6. 返回提取的数据元素: 向 Dispatcher 返回所有必要信息:

    • messageProcessingModel
    • securityModel
    • securityName
    • securityLevel
    • contextEngineID
    • contextName
    • pduVersion
    • PDU
    • pduType
    • maxSizeResponseScopedPDU
    • stateReference
    • statusInformation

错误处理:

如果任何步骤失败, 向 Dispatcher 返回适当的错误 statusInformation. 不要将格式错误或未经认证的消息传递给应用.

A.2.2. 向网络发送 SNMP 消息​

发送消息时, Dispatcher 调用 prepareOutgoingMessage (用于请求和通知) 或 prepareResponseMessage (用于响应). Message Processing Model 必须实现这些原语.

prepareOutgoingMessage 处理:

  1. 创建 scoped PDU: 合并 contextEngineID, contextName 和 PDU.

  2. 调用 Security Model: 调用 generateRequestMsg 以:

    • 应用认证, 如果需要.
    • 应用加密, 如果需要.
    • 添加 security parameters.
  3. 创建消息: 将受保护负载包装到适当消息格式中.

    • 添加 message header.
    • 添加 version 或 format identifier.
    • 添加任何消息特定字段.
  4. 返回完整消息: 返回格式化后可传输的消息:

    • outgoingMessage
    • outgoingMessageLength
    • statusInformation

prepareResponseMessage 处理:

类似于 prepareOutgoingMessage, 但:

  1. 取回缓存状态: 使用 stateReference 取回缓存信息.

  2. 创建 scoped PDU: 合并 contextEngineID, contextName 和 PDU (来自原始请求).

  3. 调用 Security Model: 使用以下参数调用 generateResponseMsg:

    • The scoped PDU
    • The securityStateReference (to use same security parameters as request)
  4. 创建响应消息: 将受保护负载包装到适当格式中.

  5. 释放缓存状态: 成功创建响应后, 释放缓存状态.

  6. 返回完整响应: 返回格式化后的响应消息.

错误处理:

如果任何步骤失败, 返回适当的错误 statusInformation. 如果无法生成响应, 确保释放缓存状态.

A.3. 应用设计要求 (Application Design Requirements)​

SNMP Applications 使用 SNMP engine 的服务执行管理功能. 本节描述应用设计的要求和指南.

A.3.1. 发起消息的应用​

发起消息的应用 (Command Generators, Notification Originators) 必须:

  1. 确定目标 (Determine destination): 识别目标 SNMP engine.

    • transportDomain
    • transportAddress
    • contextEngineID
  2. 确定安全参数 (Determine security parameters):

    • securityModel
    • securityName
    • securityLevel
  3. 创建 PDU: 使用所需操作和变量构建 protocol data unit.

  4. 调用 sendPdu: 使用以下参数调用 Dispatcher 的 sendPdu 原语:

    • Destination information
    • Security parameters
    • contextEngineID and contextName
    • PDU
    • expectResponse flag
    • sendPduHandle (to correlate later response)
  5. 处理响应: 如果 expectResponse 为 TRUE, 实现 processResponsePdu 来接收响应.

指南:

  • 配置目标: 使用配置机制 (例如 SNMP-TARGET-MIB) 管理目标信息.
  • 配置安全性: 使用配置机制 (例如 SNMP-USER-BASED-SM-MIB) 管理 security parameters.
  • 处理错误: 正确处理来自 sendPdu 的 statusInformation 错误.
  • 实现超时: 如果在合理时间内未收到响应, 处理超时.
  • 实现重试: 如果未收到响应, 考虑重传.

A.3.2. 接收响应的应用​

接收响应的应用必须实现 processResponsePdu 原语.

processResponsePdu 实现:

  1. 关联响应: 使用 sendPduHandle 将响应匹配到原始请求.

  2. 检查 statusInformation: 验证消息处理成功.

  3. 处理 PDU: 提取并处理响应数据.

    • 检查 error-status 和 error-index.
    • 提取 variable bindings.
    • 执行应用特定处理.

指南:

  • 处理错误: 检查 SNMP 错误, 例如 noSuchName, tooBig, genErr.
  • 处理异常: 检查异常值, 例如 noSuchObject, noSuchInstance, endOfMibView.
  • 处理安全错误: 准备处理认证或隐私失败.
  • 清理状态: 释放与请求关联的任何资源.

A.3.3. 接收异步消息的应用​

接收异步消息的应用 (Command Responders, Notification Receivers) 必须:

  1. 向 Dispatcher 注册: 调用 registerContextEngineID 注册:

    • 特定 contextEngineID 值.
    • 特定 PDU 类型.
  2. 实现 processPdu: 接收并处理入站 PDUs.

    • 验证 contextEngineID 和 contextName.
    • 根据应用语义处理 PDU.
    • 生成响应, 如果需要.

processPdu 实现:

  1. 验证上下文: 确保该应用负责 contextEngineID 和 contextName.

  2. 检查访问控制 (如果适用): 对 PDU 中的每个变量调用 isAccessAllowed.

  3. 处理请求: 执行请求的操作.

    • 对于 GET: 取回变量值.
    • 对于 SET: 修改变量值.
    • 对于 GETNEXT: 查找按字典序排列的下一个变量.
    • 对于 GETBULK: 高效取回多个变量.
  4. 构建响应 PDU (如果需要): 创建包含结果的响应 PDU.

  5. 调用 returnResponsePdu (如果需要): 将响应发回请求方.

指南:

  • 验证输入: 仔细验证所有输入以防止安全漏洞.
  • 实现访问控制: 对所有操作应用适当访问控制.
  • 优雅处理错误: 对无效请求返回适当错误响应.
  • 遵守 maxSizeResponseScopedPDU: 确保响应不超过大小限制.
  • 使用 stateReference: 将 processPdu 中的 stateReference 原样传递给 returnResponsePdu.

A.3.4. 发送响应的应用​

发送响应的应用必须使用 returnResponsePdu 原语.

returnResponsePdu 使用:

  1. 使用 processPdu 中的参数: 透传:

    • messageProcessingModel
    • securityModel
    • securityName
    • securityLevel
    • contextEngineID
    • contextName
    • pduVersion
    • maxSizeResponseScopedPDU
    • stateReference
  2. 创建响应 PDU: 构建包含结果的 PDU.

  3. 调用 returnResponsePdu: 调用 Dispatcher 的 returnResponsePdu 原语.

指南:

  • 不要修改安全参数: 使用与请求相同的 security parameters.
  • 遵守大小限制: 确保响应适合 maxSizeResponseScopedPDU.
  • 处理错误: 如果响应无法发送, 适当处理错误.
  • 释放状态: 发送响应后, stateReference 将由 Dispatcher 释放.

A.4. Access Control Model 设计要求​

Access Control Model 决定是否应允许访问托管对象. 本节描述 Access Control Models 的要求.

Access Control Model 必须实现 isAccessAllowed 原语.

isAccessAllowed 实现:

  1. 确定主体 (Determine the principal): 识别谁正尝试访问.

    • 使用 securityModel 和 securityName.
  2. 确定访问类型 (Determine the access type): 识别请求的是哪种访问.

    • read: GET, GETNEXT, GETBULK
    • write: SET
    • notify: TRAP, INFORM
  3. 确定目标 (Determine the target): 识别正在访问的对象.

    • variableName (OID)
    • contextName
  4. 应用访问控制策略: 根据已配置策略确定是否应允许访问.

  5. 返回结果: 返回 allowed 或 denied.

指南:

  • 定义 MIB: 定义用于配置访问控制策略的 MIB 模块.
  • 支持远程配置: 允许通过 SNMP 配置策略.
  • 默认拒绝: 如果没有显式策略允许访问, 默认拒绝.
  • 高效实现: 每个请求可能多次调用访问控制, 因此应高效实现.
  • 策略一致: 确保策略一致应用.

RFC 3415 定义的 View-based Access Control Model (VACM) 是一个示例实现.