跳到主要内容

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) 是一个示例实现.