吕 涛 禄乐滨 陈 晨
摘 要:SNMPv3正成为网络管理新的标准,它通过基于用户的安全模型引进了认证和加密机制,极大地提高了安全性。但由于安全机制的引入增加了SNMP的复杂性,业界有理由担心增加的安全措施将降低网络管理的性能,所以对SNMPv3的应用还存在疑问。通过对请求响应时间的测试分析SNMPv3安全机制对性能的影响,并就网络管理开发方面的经验给出SNMPv3安全机制在应用中的改进方法。
关键词:SNMPv3;安全机制;网络管理;性能分析
中图分类号:TP393.07 文献标识码:A
文章编号:1004-373X(2009)01-081-03
Improvement of SNMPv3 Security Mechanism in Application
LV Tao,LU Lebin,CHEN Chen
(Air Force Engineering University,Xi′an,710077,China)
Abstract:SNMPv3 has become the standard of network management.Authentication and privacy are included in SNMPv3 and performed by user-based security model.Because of SNMPv3 security services cause consistent performance degradation,its implementation in trouble.Measurement of response time analyses the real impact of performance due to security services.Finally this paper suggests a way to improve the performance in the application.
Keywords:SNMPv3;security mechanism;network management;performance analysis
0 引 言
2002年,IESG(Internet Engineering Steering Group)提出第三版SNMPv3作为新的网络管理协议标准[1]。SNMPv3定义了基于用户的安全模型(USM),为用户提供认证和加密等安全措施,大大提高了网络管理的安全性。但是SNMPv3已经不适合再被称作“简单”网络管理协议了,因为SNMPv3引入了安全机制,增加了协议的复杂性。
尽管很多网络设备厂商的设备已经支持SNMPv3,但是仍然有很多网络管理人员担心SNMPv3的复杂性会降低网络管理的性能。为了了解SNMPv3的复杂性对网络管理的实际影响程度,这里通过实验来比较请求响应时间在不同版本下的差异,并通过分析得出导致这一差异的原因,最后给出通过在本地文件中保存EngineID来减少SNMPv3发现过程信息交换次
数的方法。
1 SNMPv3安全机制
SNMPv3采用了基于用户的安全模型(USM)来提高协议的安全性。USM由RFC3414定义[2],实现了对SNMP消息的数据完整性认证、数据源身份认证、时序检查以及数据加密解密等安全服务。
1.1 认证
SNMP管理站和SNMP代理双方在本地都保存了参与SNMP通信的用户的认证密钥(为方便记忆,使用用户口令通过某种机制生成)。发送方在发送SNMP报文之前,利用认证密钥和哈希函数为SNMP报文计算认证码,并将认证码插入到报文中。接收方收到报文时同样使用认证密钥和哈希函数计算报文的认证码。如得到的认证码与收到报文的认证码相同,即可认为该报文所声明的用户身份是真实的,并且报文在传输过程中未被修改。
1.2 时序检查
SNMP引擎用snmpEngineID、snmpEngineBoots和snmpEngineTime这三个参数来实现时序检查[3]。snmpEngineID是引擎的惟一标识,包含在一个需要认证的消息体内,用来防止从一个引擎发送到另一个引擎的消息被重发到不同的引擎上;snmpEngineBoots是一个计数器,标识引擎从上次配置后重启或重新初始化的次数,snmpEngineTime表示重启后过去的秒数。这两个值包含在需要认证的消息体中,用来防止消息的重发。当一个权威引擎收到消息时,对这三个参数检查,如果与本地snmpEngineID不一致或与本地时间差超过150 s,就认为消息超出时间窗,通不过认证。通过时序检查,可以防止信息流的更改。
1.3 数据加密解密
为了防止信息的泄露,USM对报文进行加密。标准协议建议使用CBC-DES加密算法,需要加密部分由上下文引擎标识、上下文名和协议数据单元(PDU)组成。USM采用一种密钥本地化的方法[4],这样即使已知某个用户对应某个SNMP协议引擎的密钥,也不能猜测出该用户对应其他SNMP协议引擎的密钥。
2 性能测试及分析
实验的目的是通过在不同版本协议(SNMPv1,SNMPv2c和SNMPv3)下进行get操作来对比SNMPv3的安全性的引入对管理性能的影响,测试内容是请求响应时间。
测试中,SNMPv3用HMAC-MD5-96作为认证算法、用56 b的CBC-DES作为加密算法。具体的实验环境如图1所示。
管理站计算机通过10/100 Mb/s自适应交换机相连,代理计算机和抓包计算机与10 Mb/s的Hub相连,最后通过交换机与Hub互联。代理采用Mark Southwest SNMPv3 agent,管理站采用自己开发的网络管理系统,抓包计算机上运行Ethereal软件抓包[5]。
对请求响应时间进行测试,确定SNMPv3认证和加密机制的影响。请求响应时间是指从管理站发出一个Request到接收到相应的Response的时间。在抓包机上运行Ethereal对出入管理站的数据包抓包,通过数据包的时间戳就可以得到每个请求响应时间[6]。
在实验中具体操作是:用getRequest操作从代理的MIB中获取SNMPv2-MIB::sysORDescr.2(1.3.6.1.2.1.1.9.1.3.1)的值; getBulkRequest从代理的MIB中获取标准MIB-Ⅱsystem组的7个值。每个步骤在不同的协议版本和安全级别下进行20次,取得的平均请求响应时间如表1所示。
从表1中可以看出,每个版本和安全级别的请求响应时间差别很大。SNMPv2c比SNMPv1 get的请求响应时间略有增加,SNMPv3的请求响应时间是前两个版本的数倍之多。同时随着安全级别的提高,请求响应时间还有一定的增加。从以上实验结果可以看出SNMPv3的安全机制大大增加了请求响应时间,如果这个问题得不到合理解决就会对网络管理性能造成很大的影响。
请求响应时间为什么有这么的差别呢?以get操作为例分析消息交换的具体过程。因为SNMPv1与SNMPv2c,SNMPv3AuthnoPriv与SNMPv3AuthPriv的消息交换过程相同,以SNMPv2c、SNMPv3noAuthno-Priv和SNMPv3AuthPriv的消息交换过程说明[3], 图2~图4是用Ethereal分别对不同安全级别下get操作抓包的结果。
从图中可以看出每个协议版本和安全级别进行get操作消息交换的过程都不同。从图2可以看出SNMPv2c的get操作需要一次消息交换,即发送get报文和接收response报文,这个过程需要762 μs。从图3可以看出SNMPv3noAuthnoPriv的get操作需要两次消息交换,比SNMPv2c多了一次get操作,而实际取得sysORDescr.2所需用的时间为614 μs。从图4可以看出SNMPv3AuthPriv的get操作需要三次消息交换,比SNMPv2c多了两次get操作获取,而实际取得sysORDescr.2所需用的时间为606 μs。
从上面的分析可以知道消息交换次数的增加,是导致SNMPv3请求响应时间性能变差的主要原因。所谓发现过程就是非权威引擎在通信之前学习权威引擎的snmpEngineID值。如果需要鉴别信息,非权威引擎还需要与权威引擎建立时间同步。整个发现过程需要进行一次或两次消息交换。
当管理站重新启动或失去同步时,管理站都需要重新发现权威引擎。在非认证的情况下,SNMPv3发现过程需要进行1次消息交换过程,产生2个消息。在认证的情况下,SNMPv3发现过程需要进行2次消息交换过程,产生4个消息。
3 SNMPv3安全机制在应用中的改进
从权威引擎发现机制的消息交换过程可知,发现机制额外的消息交换是为了取得权威引擎的snmpEngineID,snmpEngineBoots和snmpEngineTime。其中每个设备的snmpEngineID是不变的,snmpEngineBoots和snmpEngineTime是随着SNMP代理启动次数和系统时钟变化的,在本地维护前一个变量比较容易,维护后两个变量的机制比较复杂。
结合SNMP ++开发包设计了通过建立EngineID本地文件来减少发现过程频率的机制。这样,进行SNMP操作时直接读取本地文件,而不必进行两次数据交换来获取这些信息。当然这也带来本地文件的安全问题,但这比重复的发现过程的开销要小的多。
首先,分析SNMP ++是如何维护引擎信息的[7]。在SNMP ++开发包中,由V3MP类维护了有关的引擎信息。V3MP类是SNMPv3信息处理模型,负责处理v3信息的创建和解析。V3MP类定义了一个EngineIDTable类,这个类是用来保存包含引擎的EngineID信息、IP地址和端口信息的引擎表,并提供了向引擎表中添加引擎和获得引擎信息的操作。
其次,由于在EngineIDTable没有提供保存引擎表到本地文件和从本地文件中加载引擎信息的函数,我们的任务就是要完成这两个操作。当然这些数据的保存在本地应该进行加密,用户可以根据需要选择适合的加密算法。在实现过程中利用SNMP ++中的encodeString( )和decodeString( )实现对引擎信息的加密,这是通过数据移位和一定变换实现加密算法。保存EngineID到本地文件和从本地文件中加载EngineID的操作用以下两个函数实现:
int v3MP::EngineIdTable::save_to_file(const char *name);
int v3MP::EngineIdTable::load_from_file(const char *name);
下面以save_to_file(const char *name)为例说明函数的具体实现过程:
int v3MP::EngineIdTable::save_to_file(const char *name)
{
……//定义加密解密用缓冲区、输入输出文件等
//保存引擎信息到本地文件前,先要判断要保存的信息是否已在文件中
while (fgets((char*)line,MAX_LINE_LEN * 2,file_in))
{
……// 从文件中读取engine_id,保存在vector中
}
……//关闭输入文件打开输出文件
for (int i=0; i < entries; ++i)
{
……//判断要保存的引擎信息是否已在文件中存在
if(inout==true) break;//如果在本地文件中存在则不保存
encodeString(table[i].engine_id.data(),table[i].engine_id.len(),encoded);
//保存engine_id
encoded[2 * table[i].engine_id.len()] = ′\n′;
if (fwrite(encoded,2 * table[i].engine_id.len() + 1,1,file_out) != 1)
{ failed = true; break; }
……//保存host,port
}
fclose(file_out);
}//保存操作完成
调用这两个函数,就可以把EngineID信息保存在本地文件中。当需要用这些信息时可以加载到程序中,减少了发现过程的一次信息交换。图5是保存和加载EngineID信息后,SNMPv3AuthPriv的get操作消息交换过程,对比图4可以发现只进行了两次消息交换,请求时间由原来的143 604 μs缩短为35 669 μs,只有原来时间的25%。
4 结 语
通过对SNMPv3性能的测试可以看出,新安全机制明显增加请求响应时间,其主要原因是权威引擎发现过程导致额外消息传输和处理。通过对SNMPv3权威引擎发现过程和SNMP ++开发包的分析,本文给出通过把权威引擎的EngineID信息加密保存在本地文件中来减少发现过程信息交换次数的方法。通过实验验证采用这种方法其请求响应时间只有原来的25%,大大减轻了SNMPv3安全机制对管理性能的影响,使得SNMPv3在网络管理中的应用得到增强。
参考文献
[1]Willam Stallings.SNMPv3:A Security Enhancement for SNMP[J].IEEE Communications Surveys,1998.
[2]Blumenthal U,Wiinen B.User-based Security Model (USM) for Version 3 of the Simple Network Management Protocol (SNMPv3) [S].RFC3414,2002.
[3]Harrington D,Presuhn R,Wijnen B.An Architecture for Describing Simple Network Management Protocol (SNMP) Management Frameworks [S].RFC3411,2002.
[4]路艳丽,雷英杰.SNMPv3网络安全管理研究[J].现代电子技术,2004,27(9):98-100.
[5]Corrente A,Tura L Cefriel.Security Performance Analysis of SNMPv3 with Respect to SNMPv2c[J].IEEE,2004, 729-742.
[6]金鹏.采用SNMPv3的网络系统的性能分析[J].计算机应用,2004,24(7):102-104.
[7]SNMP ++ Documentation.http://www.agentpp.com/doc_snmp++3.x/index.html,available,2008.
作者简介吕 涛 男,1982年出生,江苏赣榆人,硕士研究生。主要研究方向为计算机网络及计算机安全。