跳到主要内容

1. 介绍

描述互联网管理框架的架构 [RFC3411] 描述了 SNMP 引擎由以下部分组成:

  1. 调度器 (Dispatcher),
  2. 消息处理子系统 (Message Processing Subsystem),
  3. 安全子系统 (Security Subsystem),以及
  4. 访问控制子系统 (Access Control Subsystem)。

应用程序利用这些子系统的服务。

理解 SNMP 架构和架构术语对于理解本文档中描述的安全模型在架构中的位置以及与架构内其他子系统的交互至关重要。读者应已阅读并理解 [RFC3411] 中定义的 SNMP 架构描述。

本备忘录描述了在 SNMP 架构中使用的基于用户的安全模型。主要思想是我们使用传统的用户概念(由 userName 标识)来关联安全信息。

本备忘录描述了使用 HMAC-MD5-96 和 HMAC-SHA-96 作为认证协议,以及使用 CBC-DES 作为隐私协议。然而,基于用户的安全模型允许使用其他此类协议来替代这些协议或与这些协议并发使用。因此,HMAC-MD5-96、HMAC-SHA-96 和 CBC-DES 的描述位于单独的章节中,以反映它们的独立性质,并表明它们将来可以被替换或补充。

本文档中的关键词 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", 和 "OPTIONAL" 应按照 [RFC2119] 中的描述进行解释。

1.1. 威胁

网络协议的几种经典威胁适用于网络管理问题,因此也适用于任何 SNMP 安全模型。其他威胁则不适用于网络管理问题。本节讨论主要威胁、次要威胁以及不太重要的威胁。

此 SNMP 安全模型应提供保护的主要威胁包括:

  • 信息修改 (Modification of Information) 修改威胁是指某些未授权实体可能会更改代表授权主体生成的传输中 SNMP 消息,从而实施未授权的管理操作,包括伪造对象的值。

  • 伪装 (Masquerade) 伪装威胁是指未授权给某些用户的管理操作可能通过冒充具有适当授权的另一用户的身份来进行尝试。

还识别了两个次要威胁。本备忘录中定义的安全模型提供了针对以下威胁的有限保护:

  • 泄露 (Disclosure) 泄露威胁是指窃听受管代理和管理站之间的交换的危险。根据本地策略,可能需要针对此威胁进行保护。

  • 消息流修改 (Message Stream Modification) SNMP 协议通常基于无连接传输服务,该服务可以在任何子网服务上运行。消息的重新排序、延迟或重放可能并且确实会通过许多此类子网服务的自然操作而发生。消息流修改威胁是指消息可能被恶意重新排序、延迟或重放,其程度超过了子网服务自然操作可能发生的程度,以便实施未授权的管理操作。

至少有两个威胁是 SNMP 安全模型不需要防范的。本备忘录中定义的安全协议不提供针对以下方面的保护:

  • 拒绝服务 (Denial of Service) 此 SNMP 安全模型不试图解决各种攻击,这些攻击拒绝为授权用户提供服务。事实上,此类拒绝服务攻击在很多情况下与任何可行的网络管理协议必须应对的网络故障类型无法区分。

  • 流量分析 (Traffic Analysis) 此 SNMP 安全模型不试图解决流量分析攻击。事实上,许多流量模式是可预测的——设备可能由相对较少的管理应用程序定期管理——因此,针对流量分析进行保护并没有显著优势。

1.2. 目标和约束

基于前面对 SNMP 网络管理环境中威胁的描述,此 SNMP 安全模型的目标如下。

  1. 提供验证,确保每个接收到的 SNMP 消息在网络传输过程中未被修改。

  2. 提供验证,确认接收到的 SNMP 消息声称代表其生成的用户的身份。

  3. 提供检测,发现请求或包含管理信息的接收到的 SNMP 消息,其生成时间不是最近的。

  4. 在必要时提供保护,防止每个接收到的 SNMP 消息的内容被泄露。

除了支持安全网络管理的主要目标外,此 SNMP 安全模型的设计还受到以下约束的影响:

  1. 当网络压力时期的有效管理要求与安全要求不一致时,USM 的设计优先考虑前者。

  2. 安全协议及其底层安全机制均不应依赖于其他网络服务(例如,网络时间协议 (NTP) 或密钥管理协议)的即时可用性。

  3. 安全机制不应导致基本的 SNMP 网络管理理念发生变化。

1.3. 安全服务

支持此 SNMP 安全模型目标所需的安全服务如下:

  • 数据完整性 (Data Integrity) 是指数据的属性未被以未授权的方式更改或破坏,且数据序列未被更改至超过非恶意可能发生的程度。

  • 数据源认证 (Data Origin Authentication) 是指证实接收到的数据所声称代表的用户的身份的属性。

  • 数据机密性 (Data Confidentiality) 是指信息不被提供或泄露给未授权的个人、实体或过程的属性。

  • 消息及时性和有限的重放保护 (Message timeliness and limited replay protection) 是指生成时间在指定时间窗口之外的消息不被接受的属性。请注意,消息重新排序未予处理,并且在正常情况下也可能发生。

对于本备忘录中指定的协议,不可能确定接收到的 SNMP 消息的具体原始发送者;而是对代表其生成消息的用户进行认证。

对于这些协议,没有数据源认证就不可能获得数据完整性,没有数据完整性也不可能获得数据源认证。此外,如果没有数据完整性和数据源认证,就没有数据机密性的规定。

本备忘录中使用的安全协议在编写时被认为是可接受的安全的。然而,如果将来有需要,程序允许指定新的认证和隐私方法。

1.4. 模块组织

本备忘录中定义的安全协议分为三个不同的模块,每个模块都有其特定的职责,它们共同实现了上述目标和安全服务:

  • 认证模块 MUST 提供:

    • 数据完整性,
    • 数据源认证。
  • 及时性模块 MUST 提供:

    • 防止消息延迟或重放(程度超过正常操作可能发生的程度)。
  • 隐私模块 MUST 提供:

    • 防止消息有效载荷泄露。

及时性模块对于基于用户的安全模型是固定的,而允许多个认证和/或隐私模块,每个模块分别实现特定的认证或隐私协议。

1.4.1. 及时性模块

第 3 节(过程要素)使用 SNMP 消息中的及时性值来进行及时性检查。只有在对消息应用认证时才执行及时性检查。由于对完整消息进行了完整性检查,我们可以假设通过认证模块的消息中的及时性值是可信的。

1.4.2. 认证协议

第 6 节描述了 HMAC-MD5-96 认证协议,这是基于用户的安全模型 MUST 支持的第一个认证协议。第 7 节描述了 HMAC-SHA-96 认证协议,这是基于用户的安全模型 SHOULD 支持的另一个认证协议。将来,随着新需求的出现,可能会定义其他或替代的认证协议。

基于用户的安全模型规定,如果使用认证,则在认证模块中检查完整消息的完整性。

对于要认证的消息,它需要通过认证模块的认证检查以及作为此基于用户的安全模型固定部分的及时性检查。

1.4.3. 隐私协议

第 8 节描述了 CBC-DES 对称加密协议,这是与基于用户的安全模型一起使用的第一个隐私协议。将来,随着新需求的出现,可能会定义其他或替代的隐私协议。

基于用户的安全模型规定,当使用隐私发送消息时,scopedPDU 受到保护以防泄露。

基于用户的安全模型还规定,如果使用隐私,则消息需要进行认证。

1.5. 防止消息重放、延迟和重定向

1.5.1. 权威 SNMP 引擎

为了防止消息重放、延迟和重定向,每次通信中涉及的 SNMP 引擎之一被指定为权威 SNMP 引擎。当 SNMP 消息包含期望响应的有效载荷(包含已确认类 PDU [RFC3411] 的那些消息)时,此类消息的接收者是权威的。当 SNMP 消息包含不期望响应的有效载荷(包含未确认类 PDU [RFC3411] 的那些消息)时,此类消息的发送者是权威的。

1.5.2. 机制

使用以下机制:

  1. 为了防止消息延迟或重放的威胁(程度超过正常操作可能发生的程度),每个生成的消息中都包含一组及时性指示器(针对权威 SNMP 引擎)。SNMP 引擎评估及时性指示器以确定接收到的消息是否即时。SNMP 引擎可以评估及时性指示器,以确保接收到的消息至少与它从同一源接收到的最后一条消息一样新。非权威 SNMP 引擎使用接收到的真实消息来推进其对远程权威源及时性指示器的概念。

    SNMP 引擎还 MUST 使用一种机制将传入的响应与未完成的请求相匹配,并且它 MUST 丢弃任何与未完成请求不匹配的响应。例如,可以在每条消息中插入 msgID 以满足此功能。

    这些机制提供了对生成时间非最近的已认证消息的检测。

    这种针对消息延迟或重放威胁的保护并不暗示也不提供任何针对未授权删除或抑制消息的保护。此外,如果涉及的所有消息都在时间窗口间隔内发送,SNMP 引擎可能无法检测到消息重新排序。独立于安全协议定义的其他机制也可以用于检测包含 Set 操作的消息的重新排序重放、删除或抑制(例如,MIB 变量 snmpSetSerialNo [RFC3418])。

  2. 验证发送到/来自一个权威 SNMP 引擎的消息不能被重放给/冒充为来自另一个权威 SNMP 引擎。

    每个消息中都包含一个对于与消息发送者或预定接收者关联的权威 SNMP 引擎唯一的标识符。

    权威 SNMP 引擎发送给一个非权威 SNMP 引擎的包含未确认类 PDU 的消息可能会被重放到另一个非权威 SNMP 引擎。后一个非权威 SNMP 引擎可能(如果它知道权威 SNMP 引擎上的相同用户名和相同秘密)因此更新其对权威 SNMP 引擎及时性指示器的概念,但这不被视为威胁。在这种情况下,报告或响应消息将被消息处理模型丢弃,因为不应该有未完成的请求消息。Trap 可能会被接受。同样,这不被视为威胁,因为通信经过认证且及时。这就好像权威 SNMP 引擎被配置为开始向第二个 SNMP 引擎发送 Trap,这在第二个 SNMP 引擎不知情的情况下理论上是可以发生的。无论如何,第二个 SNMP 引擎可能不期望收到此 Trap,但允许查看其中包含的管理信息。

  3. 检测非最近生成的消息。

    消息中包含一组时间指示器,指示生成时间。没有最近时间指示器的消息不被视为真实的。此外,SNMP 引擎 MUST 丢弃任何与未完成请求不匹配的响应。但这属于消息处理模型的责任。

本备忘录允许在多个 SNMP 引擎上定义同一用户。每个 SNMP 引擎维护一个值 snmpEngineID,该值唯一标识 SNMP 引擎。当消息发送到/来自权威的 SNMP 引擎时(参见 1.5.1 节),此值包含在每条消息中。收到消息后,权威 SNMP 引擎检查该值以确保它是预定的接收者,非权威 SNMP 引擎使用该值确保使用可能正确的状态信息处理消息。

每个 SNMP 引擎维护两个值,snmpEngineBoots 和 snmpEngineTime,它们共同提供该 SNMP 引擎的时间指示。这两个值都包含在发送到/接收自该 SNMP 引擎的已认证消息中。收到后,检查这些值以确指出的及时性值在当前时间的时间窗口内。时间窗口代表协议消息可接受的传输延迟的管理上限。

为了使 SNMP 引擎生成权威 SNMP 引擎将接受为真实的消息,并验证从该权威 SNMP 引擎接收的消息是真实的,该 SNMP 引擎必须首先与权威 SNMP 引擎实现及时性同步。参见 2.3 节。

1.6. 抽象服务接口

已定义抽象服务接口来描述 SNMP 实体内各子系统之间的概念接口。同样,在基于用户的安全模型 (USM) 中定义了一组抽象服务接口,以描述通用 USM 服务与自包含的认证和隐私服务之间的概念接口。

这些抽象服务接口由一组原语定义,这些原语定义了提供的服务以及调用服务时必须传递的抽象数据元素。本节列出了为基于用户的安全模型定义的原语。

1.6.1. 基于用户的安全模型的认证原语

基于用户的安全模型提供以下内部原语,以便在安全模型本身与认证服务之间来回传递数据:

statusInformation =
authenticateOutgoingMsg(
IN authKey -- secret key for authentication (认证密钥)
IN wholeMsg -- unauthenticated complete message (未认证的完整消息)
OUT authenticatedWholeMsg -- complete authenticated message (完成的认证消息)
)

statusInformation =
authenticateIncomingMsg(
IN authKey -- secret key for authentication (认证密钥)
IN authParameters -- as received on the wire (线路上接收到的参数)
IN wholeMsg -- as received on the wire (线路上接收到的消息)
OUT authenticatedWholeMsg -- complete authenticated message (完成的认证消息)
)

1.6.2. 基于用户的安全模型的隐私原语

基于用户的安全模型提供以下内部原语,以便在安全模型本身与隐私服务之间来回传递数据:

statusInformation =
encryptData(
IN encryptKey -- secret key for encryption (加密密钥)
IN dataToEncrypt -- data to encrypt (scopedPDU) (要加密的数据)
OUT encryptedData -- encrypted data (encryptedPDU) (加密后的数据)
OUT privParameters -- filled in by service provider (由服务提供者填充)
)

statusInformation =
decryptData(
IN decryptKey -- secret key for decrypting (解密密钥)
IN privParameters -- as received on the wire (线路上接收到的参数)
IN encryptedData -- encrypted data (encryptedPDU) (加密数据)
OUT decryptedData -- decrypted data (scopedPDU) (解密后的数据)
)