SNMP协议发展及v3版本安全机制介绍一SNMP协议1什么是SNMP协议SNMP(SimpleNetworkManagementProtocol)简单网络管理协议是用来管理网络上的节点,(包括工作站,路由器,交换机,集线器和其他的外围设备)。SNMP在OSI模型中是一个应用层协议,使用UDP封装进行传输。网络管理者可以使用SNMP进行检索、修改信息,寻找、诊断故障,管理网络性能,发现和解决网络问题,规划网络的增长。它采用轮询和中断机制,提供最基本的功能集。SNMP在TCP/IP协议族中的地位如下图:SNMPUDPIP链路层协议硬件2SNMP网络架构SNMP网络架构由三部分组成:NMS、Agent和MIB。NMS、Agent和MIB之间的关系如下图所示。NMSSNMPAGENTMIB网络管理系统被管对象AGENTMIB被管对象AGENTMIB被管对象SNMPSNMP2.1NMS(NetworkManagementStation)NMS的角色是网络中的管理者,是一个利用SNMP协议对网络设备进行管理和监视的系统。NMS可以向Agent发出请求,查询或修改一个或多个具体的参数值。同时,NMS可以接收Agent主动发送的Trap信息,以获知被管理设备当前的状态。2.2AgentAgent是网络设备中的一个应用模块。Agent接收到NMS的请求信息后,完成查询或修改操作,并把操作结果发送给NMS,完成响应。同时,当设备发生故障或者其他事件的时候,Agent会主动发送Trap信息给NMS,通知设备当前的状态变化。2.3MIB(ManagementInformationBasess)任何一个被管理的资源都可以表示成一个对象,MIB是被管理对象的集合。它定义了被管理对象的一系列属性:对象的名称、对象的访问权限和对象的数据类型等。每个Agent都有自己的MIB。MIB也可以看作是NMS和Agent之间的一个接口,通过这个接口,NMS可以对Agent中的每一个被管理对象进行读/写操作,从而达到管理和监控设备的目的。MIB是以树状结构进行存储的。树的节点表示被管理对象,它可以用从根开始的一条路径唯一地识别,这条路径就称为OID(ObjectIdentifier)。如下图所示。管理对象system可以用一串数字{1.3.6.1.2.1.1}唯一标识,这串数字就是system的OID。子树可以用该子树根节点的OID来标识。如以private为根节点的子树的OID为private的OID——{1.3.6.1.4}。3SNMP版本SNMP主要有SNMPv1、SNMPV2c、SNMPv3几种常用的版本。3.1SNMPv1SNMPv1是SNMP协议的最初版本,它的MIB比较简单,且存在较多安全缺陷。所以网络管理功能比较受限。SNMPv1采用团体名认证。团体名的作用类似于密码,用来限制NMS对Agent的访问。如果SNMP报文携带的团体名没有得到NMS/Agent的认可,该报文将被丢弃。3.2SNMPv2cSNMPv2c也采用团体名认证。在兼容SNMPv1的同时又扩充了SNMPv1的功能。它提供了更多的操作类型(GetBulk操作等),支持更多的数据类型(Counter32等),提供了更丰富的错误代码,能够更细致地区分错误。3.3SNMPv3SNMPv3主要在安全性方面进行了增强,它采用了USM和VACM技术。USM提供了认证和加密功能,VACM确定用户是否允许访问特定的MIB对象以及访问方式。本文第二节主要介绍USM安全模型。3.3.1USM(基于用户的安全模型)USM引入了用户名和组的概念,可以设置认证和加密功能。认证用于验证报文发送方的合法性,避免非法用户的访问。加密则是对NMS和Agent之间传输的报文进行加密,以免被窃听。通过有无认证和有无加密等功能组合,可以为NMS和Agent之间的通信提供更高的安全性。3.3.2VACM(基于视图的访问控制模型)VACM技术定义了组、安全等级、上下文、MIB视图、访问策略五个元素,这些元素同时决定用户是否具有访问的权限,只有具有了访问权限的用户才能管理操作对象。在同一个SNMP实体上可以定义不同的组,组与MIB视图绑定,组内又可以定义多个用户。当使用某个用户名进行访问的时候,只能访问对应的MIB视图定义的对象。4SNMP操作SNMP支持多种操作,主要为以下几种基本操作:Get操作:NMS使用该操作从Agent获取一个或多个参数值。GetNext操作:NMS使用该操作从Agent获取一个或多个参数的下一个参数值。Set操作:NMS使用该操作设置Agent一个或多个参数值。Response操作:Agent返回一个或多个参数值。该操作是前面三种操作的响应。Trap操作:Agent主动发出的操作,通知NMS有某些事情发生。执行前四种操作时设备使用UDP协议采用161端口发送报文,执行Trap操作时设备使用UDP协议采用162端口发送报文。5SNMP报文根据SNMP的不同版本和不同操作,报文格式也有所不同。5.1SNMPv1报文SNMPv1消息主要由版本号、团体名、协议数据单元几部分构成。其中,报文中的主要字段定义如下Version:SNMP版本。Community:团体名,用于Agent与NMS之间的认证。团体名有可读和可写两种,如果是执行Get、GetNext操作,则采用可读团体名进行认证;如果是执行Set操作,则采用可写团体名进行认证。RequestID:用于匹配请求和响应,SNMP给每个请求分配全局唯一的ID。Errorstatus:用于表示在处理请求时出现的状况,包括noError、tooBig、noSuchName、badValue、readOnly、genErr。Errorindex:差错索引。当出现异常情况时,提供变量绑定列表(Variablebindings)中导致异常的变量的信息。Variablebindings:变量绑定列表,由变量名和变量值对组成。enterprise:Trap源(生成Trap信息的设备)的类型。Agentaddr:Trap源的地址。Generictrap:通用Trap类型,包括coldStart、warmStart、linkDown、linkUp、authenticationFailure、egpNeighborLoss、enterpriseSpecific。Specifictrap:企业私有Trap信息。Timestamp:上次重新初始化网络实体和产生Trap之间所持续的时间,即sysUpTime对象的取值。5.2SNMPv2报文与SNMPv1比较而言,SNMPv2c新增了GetBulk操作报文。GetBulk操作所对应的基本操作类型是GetNext操作,通过对Nonrepeaters和Maxrepetitions参数的设定,高效率地从Agent获取大量管理对象数据。SNMPv2c修改了Trap报文格式,采用了SNMPv1Get/GetNext/SetPDU的格式,并将sysUpTime和snmpTrapOID作为Variablebindings中的变量来构造报文。5.3SNMPv3报文SecurityModelContextEngineIDSecurityParametersContextNameSNMPPDUVersionRequestIDFlagsMaxSizeSNMPv3修改了消息的格式,但是PDU部分的格式同SNMPv2c是保持一致的。其中,整个SNMPv3消息可以使用认证机制,并对EngineID、ContextName、PDU消息体部分进行加密。RequestID、MaxSize、Flags、SecurityModel、SecurityParameters构成SNMPv3消息头。报文中的主要字段定义如下:MaxSize:消息发送者所能够容纳的消息最大字节,同时也表明了发送者能够接收到的最大字节数。Flags:消息标识位,占一个字节,只有最低的三个比特位有效,比如0x0表示不认证不加密,0x1表示认证不加密,0x3表示认证加密。SecurityModel:消息的安全模型值,取值为0~3。0表示任何模型,1表示采用SNMPv1安全模型,2表示采用SNMPv2c安全模型,3表示采用SNMPv3安全模型。ContextEngineID:唯一识别一个SNMP实体。对于接收消息,该字段确定消息该如何处理;对于发送消息,该字段在发送一个消息请求时由应用提供。ContextName:唯一识别在相关联的上下文引擎范围内部特定的上下文。SecurityParameters在下面第二节中详细介绍。二SNMPv3协议的安全机制1USM(User-basedSecurityModel)网络管理面临的安全威胁有:消息篡改、伪装、消息流修改(延迟、重放、重定向)、泄密、拒绝服务和流量分析,其中前4种是SNMP需要防范的。SNMPv3中的安全子系统采用基于用户的安全模型(USM),为SNMP消息的传输提供如下服务:来源认证、完整性鉴别、消息流篡改鉴别和数据保密。安全性服务包括认证和加密。分为三个安全层次:既无认证又无保密(NoAuthNoPriv)有认证但无保密(AuthNoPriv)有认证又有保密(AuthPriv)为了提供更强有力的安全保障,SNMPv3的体系结构比以前版本更加复杂。下图是使用USM模型的SNMP消息格式,相关的安全域含义如下:SecurityParameters包括以下主要字段:AuthoritativeEngineID:消息交换中权威SNMP的snmpEngineID,用于SNMP实体的识别、认证和加密。该取值在Trap、Response、Report中是源端的snmpEngineID,对Get、GetNext、GetBulk、Set中是目的端的snmpEngineID。AuthoritativeEngineBoots:消息交换中权威SNMP的snmpEngineBoots。表示从初次配置时开始,SNMP引擎已经初始化或重新初始化的次数。AuthoritativeEngineTime:消息交换中权威SNMP的snmpEngineTime,用于时间窗判断。UserName:用户名,消息代表其正在交换。NMS和Agent配置的用户名必须保持一致。AuthenticationParameters:认证参数,认证运算时所需的密钥。如果没有使用认证则为空。PrivacyParameters:加密参数,加密运算时所用到的参数。如果没有使用加密则为空。VersionRequestIDMaxSizePrivacyParametersAuthenticationParametersUserNameAuthoritativeEngineTimeAuthoritativeEngineBootsSNMPPDUContextNameContextEngineIDAuthoritativeEngineIDSecurityModelFlagsUSM安全参数消息头加密的作用域USMSecurityParametersSyntaxDEFINITIONSIMPLICITTAGS::=BEGINUsmSecurityParameters::=SEQUENCE{--globalUser-basedsecurityparametersmsgAuthoritativeEngineIDOCTETSTRING,msgAuthoritativeEngineBootsINTEGER(0..2147483647),msgAuthoritativeEngineTimeINTEGER(0..2147483647),msgUserNameOCTETSTRING(SIZE(0..32)),--authenticationprotocolspecificparametersmsgAuthenticationParametersOCTETSTRING,--pr