呂 濤 祿樂濱 陳 晨
摘 要:SNMPv3正成為網(wǎng)絡(luò)管理新的標(biāo)準(zhǔn),它通過基于用戶的安全模型引進(jìn)了認(rèn)證和加密機(jī)制,極大地提高了安全性。但由于安全機(jī)制的引入增加了SNMP的復(fù)雜性,業(yè)界有理由擔(dān)心增加的安全措施將降低網(wǎng)絡(luò)管理的性能,所以對SNMPv3的應(yīng)用還存在疑問。通過對請求響應(yīng)時間的測試分析SNMPv3安全機(jī)制對性能的影響,并就網(wǎng)絡(luò)管理開發(fā)方面的經(jīng)驗(yàn)給出SNMPv3安全機(jī)制在應(yīng)用中的改進(jìn)方法。
關(guān)鍵詞:SNMPv3;安全機(jī)制;網(wǎng)絡(luò)管理;性能分析
中圖分類號:TP393.07 文獻(xiàn)標(biāo)識碼: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作為新的網(wǎng)絡(luò)管理協(xié)議標(biāo)準(zhǔn)[1]。SNMPv3定義了基于用戶的安全模型(USM),為用戶提供認(rèn)證和加密等安全措施,大大提高了網(wǎng)絡(luò)管理的安全性。但是SNMPv3已經(jīng)不適合再被稱作“簡單”網(wǎng)絡(luò)管理協(xié)議了,因?yàn)镾NMPv3引入了安全機(jī)制,增加了協(xié)議的復(fù)雜性。
盡管很多網(wǎng)絡(luò)設(shè)備廠商的設(shè)備已經(jīng)支持SNMPv3,但是仍然有很多網(wǎng)絡(luò)管理人員擔(dān)心SNMPv3的復(fù)雜性會降低網(wǎng)絡(luò)管理的性能。為了了解SNMPv3的復(fù)雜性對網(wǎng)絡(luò)管理的實(shí)際影響程度,這里通過實(shí)驗(yàn)來比較請求響應(yīng)時間在不同版本下的差異,并通過分析得出導(dǎo)致這一差異的原因,最后給出通過在本地文件中保存EngineID來減少SNMPv3發(fā)現(xiàn)過程信息交換次
數(shù)的方法。
1 SNMPv3安全機(jī)制
SNMPv3采用了基于用戶的安全模型(USM)來提高協(xié)議的安全性。USM由RFC3414定義[2],實(shí)現(xiàn)了對SNMP消息的數(shù)據(jù)完整性認(rèn)證、數(shù)據(jù)源身份認(rèn)證、時序檢查以及數(shù)據(jù)加密解密等安全服務(wù)。
1.1 認(rèn)證
SNMP管理站和SNMP代理雙方在本地都保存了參與SNMP通信的用戶的認(rèn)證密鑰(為方便記憶,使用用戶口令通過某種機(jī)制生成)。發(fā)送方在發(fā)送SNMP報文之前,利用認(rèn)證密鑰和哈希函數(shù)為SNMP報文計算認(rèn)證碼,并將認(rèn)證碼插入到報文中。接收方收到報文時同樣使用認(rèn)證密鑰和哈希函數(shù)計算報文的認(rèn)證碼。如得到的認(rèn)證碼與收到報文的認(rèn)證碼相同,即可認(rèn)為該報文所聲明的用戶身份是真實(shí)的,并且報文在傳輸過程中未被修改。
1.2 時序檢查
SNMP引擎用snmpEngineID、snmpEngineBoots和snmpEngineTime這三個參數(shù)來實(shí)現(xiàn)時序檢查[3]。snmpEngineID是引擎的惟一標(biāo)識,包含在一個需要認(rèn)證的消息體內(nèi),用來防止從一個引擎發(fā)送到另一個引擎的消息被重發(fā)到不同的引擎上;snmpEngineBoots是一個計數(shù)器,標(biāo)識引擎從上次配置后重啟或重新初始化的次數(shù),snmpEngineTime表示重啟后過去的秒數(shù)。這兩個值包含在需要認(rèn)證的消息體中,用來防止消息的重發(fā)。當(dāng)一個權(quán)威引擎收到消息時,對這三個參數(shù)檢查,如果與本地snmpEngineID不一致或與本地時間差超過150 s,就認(rèn)為消息超出時間窗,通不過認(rèn)證。通過時序檢查,可以防止信息流的更改。
1.3 數(shù)據(jù)加密解密
為了防止信息的泄露,USM對報文進(jìn)行加密。標(biāo)準(zhǔn)協(xié)議建議使用CBC-DES加密算法,需要加密部分由上下文引擎標(biāo)識、上下文名和協(xié)議數(shù)據(jù)單元(PDU)組成。USM采用一種密鑰本地化的方法[4],這樣即使已知某個用戶對應(yīng)某個SNMP協(xié)議引擎的密鑰,也不能猜測出該用戶對應(yīng)其他SNMP協(xié)議引擎的密鑰。
2 性能測試及分析
實(shí)驗(yàn)的目的是通過在不同版本協(xié)議(SNMPv1,SNMPv2c和SNMPv3)下進(jìn)行g(shù)et操作來對比SNMPv3的安全性的引入對管理性能的影響,測試內(nèi)容是請求響應(yīng)時間。
測試中,SNMPv3用HMAC-MD5-96作為認(rèn)證算法、用56 b的CBC-DES作為加密算法。具體的實(shí)驗(yàn)環(huán)境如圖1所示。
管理站計算機(jī)通過10/100 Mb/s自適應(yīng)交換機(jī)相連,代理計算機(jī)和抓包計算機(jī)與10 Mb/s的Hub相連,最后通過交換機(jī)與Hub互聯(lián)。代理采用Mark Southwest SNMPv3 agent,管理站采用自己開發(fā)的網(wǎng)絡(luò)管理系統(tǒng),抓包計算機(jī)上運(yùn)行Ethereal軟件抓包[5]。
對請求響應(yīng)時間進(jìn)行測試,確定SNMPv3認(rèn)證和加密機(jī)制的影響。請求響應(yīng)時間是指從管理站發(fā)出一個Request到接收到相應(yīng)的Response的時間。在抓包機(jī)上運(yùn)行Ethereal對出入管理站的數(shù)據(jù)包抓包,通過數(shù)據(jù)包的時間戳就可以得到每個請求響應(yīng)時間[6]。
在實(shí)驗(yàn)中具體操作是:用getRequest操作從代理的MIB中獲取SNMPv2-MIB::sysORDescr.2(1.3.6.1.2.1.1.9.1.3.1)的值; getBulkRequest從代理的MIB中獲取標(biāo)準(zhǔn)MIB-Ⅱsystem組的7個值。每個步驟在不同的協(xié)議版本和安全級別下進(jìn)行20次,取得的平均請求響應(yīng)時間如表1所示。
從表1中可以看出,每個版本和安全級別的請求響應(yīng)時間差別很大。SNMPv2c比SNMPv1 get的請求響應(yīng)時間略有增加,SNMPv3的請求響應(yīng)時間是前兩個版本的數(shù)倍之多。同時隨著安全級別的提高,請求響應(yīng)時間還有一定的增加。從以上實(shí)驗(yàn)結(jié)果可以看出SNMPv3的安全機(jī)制大大增加了請求響應(yīng)時間,如果這個問題得不到合理解決就會對網(wǎng)絡(luò)管理性能造成很大的影響。
請求響應(yīng)時間為什么有這么的差別呢?以get操作為例分析消息交換的具體過程。因?yàn)镾NMPv1與SNMPv2c,SNMPv3AuthnoPriv與SNMPv3AuthPriv的消息交換過程相同,以SNMPv2c、SNMPv3noAuthno-Priv和SNMPv3AuthPriv的消息交換過程說明[3], 圖2~圖4是用Ethereal分別對不同安全級別下get操作抓包的結(jié)果。
從圖中可以看出每個協(xié)議版本和安全級別進(jìn)行g(shù)et操作消息交換的過程都不同。從圖2可以看出SNMPv2c的get操作需要一次消息交換,即發(fā)送get報文和接收response報文,這個過程需要762 μs。從圖3可以看出SNMPv3noAuthnoPriv的get操作需要兩次消息交換,比SNMPv2c多了一次get操作,而實(shí)際取得sysORDescr.2所需用的時間為614 μs。從圖4可以看出SNMPv3AuthPriv的get操作需要三次消息交換,比SNMPv2c多了兩次get操作獲取,而實(shí)際取得sysORDescr.2所需用的時間為606 μs。
從上面的分析可以知道消息交換次數(shù)的增加,是導(dǎo)致SNMPv3請求響應(yīng)時間性能變差的主要原因。所謂發(fā)現(xiàn)過程就是非權(quán)威引擎在通信之前學(xué)習(xí)權(quán)威引擎的snmpEngineID值。如果需要鑒別信息,非權(quán)威引擎還需要與權(quán)威引擎建立時間同步。整個發(fā)現(xiàn)過程需要進(jìn)行一次或兩次消息交換。
當(dāng)管理站重新啟動或失去同步時,管理站都需要重新發(fā)現(xiàn)權(quán)威引擎。在非認(rèn)證的情況下,SNMPv3發(fā)現(xiàn)過程需要進(jìn)行1次消息交換過程,產(chǎn)生2個消息。在認(rèn)證的情況下,SNMPv3發(fā)現(xiàn)過程需要進(jìn)行2次消息交換過程,產(chǎn)生4個消息。
3 SNMPv3安全機(jī)制在應(yīng)用中的改進(jìn)
從權(quán)威引擎發(fā)現(xiàn)機(jī)制的消息交換過程可知,發(fā)現(xiàn)機(jī)制額外的消息交換是為了取得權(quán)威引擎的snmpEngineID,snmpEngineBoots和snmpEngineTime。其中每個設(shè)備的snmpEngineID是不變的,snmpEngineBoots和snmpEngineTime是隨著SNMP代理啟動次數(shù)和系統(tǒng)時鐘變化的,在本地維護(hù)前一個變量比較容易,維護(hù)后兩個變量的機(jī)制比較復(fù)雜。
結(jié)合SNMP ++開發(fā)包設(shè)計了通過建立EngineID本地文件來減少發(fā)現(xiàn)過程頻率的機(jī)制。這樣,進(jìn)行SNMP操作時直接讀取本地文件,而不必進(jìn)行兩次數(shù)據(jù)交換來獲取這些信息。當(dāng)然這也帶來本地文件的安全問題,但這比重復(fù)的發(fā)現(xiàn)過程的開銷要小的多。
首先,分析SNMP ++是如何維護(hù)引擎信息的[7]。在SNMP ++開發(fā)包中,由V3MP類維護(hù)了有關(guān)的引擎信息。V3MP類是SNMPv3信息處理模型,負(fù)責(zé)處理v3信息的創(chuàng)建和解析。V3MP類定義了一個EngineIDTable類,這個類是用來保存包含引擎的EngineID信息、IP地址和端口信息的引擎表,并提供了向引擎表中添加引擎和獲得引擎信息的操作。
其次,由于在EngineIDTable沒有提供保存引擎表到本地文件和從本地文件中加載引擎信息的函數(shù),我們的任務(wù)就是要完成這兩個操作。當(dāng)然這些數(shù)據(jù)的保存在本地應(yīng)該進(jìn)行加密,用戶可以根據(jù)需要選擇適合的加密算法。在實(shí)現(xiàn)過程中利用SNMP ++中的encodeString( )和decodeString( )實(shí)現(xiàn)對引擎信息的加密,這是通過數(shù)據(jù)移位和一定變換實(shí)現(xiàn)加密算法。保存EngineID到本地文件和從本地文件中加載EngineID的操作用以下兩個函數(shù)實(shí)現(xiàn):
int v3MP::EngineIdTable::save_to_file(const char *name);
int v3MP::EngineIdTable::load_from_file(const char *name);
下面以save_to_file(const char *name)為例說明函數(shù)的具體實(shí)現(xiàn)過程:
int v3MP::EngineIdTable::save_to_file(const char *name)
{
……//定義加密解密用緩沖區(qū)、輸入輸出文件等
//保存引擎信息到本地文件前,先要判斷要保存的信息是否已在文件中
while (fgets((char*)line,MAX_LINE_LEN * 2,file_in))
{
……// 從文件中讀取engine_id,保存在vector中
}
……//關(guān)閉輸入文件打開輸出文件
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);
}//保存操作完成
調(diào)用這兩個函數(shù),就可以把EngineID信息保存在本地文件中。當(dāng)需要用這些信息時可以加載到程序中,減少了發(fā)現(xiàn)過程的一次信息交換。圖5是保存和加載EngineID信息后,SNMPv3AuthPriv的get操作消息交換過程,對比圖4可以發(fā)現(xiàn)只進(jìn)行了兩次消息交換,請求時間由原來的143 604 μs縮短為35 669 μs,只有原來時間的25%。
4 結(jié) 語
通過對SNMPv3性能的測試可以看出,新安全機(jī)制明顯增加請求響應(yīng)時間,其主要原因是權(quán)威引擎發(fā)現(xiàn)過程導(dǎo)致額外消息傳輸和處理。通過對SNMPv3權(quán)威引擎發(fā)現(xiàn)過程和SNMP ++開發(fā)包的分析,本文給出通過把權(quán)威引擎的EngineID信息加密保存在本地文件中來減少發(fā)現(xiàn)過程信息交換次數(shù)的方法。通過實(shí)驗(yàn)驗(yàn)證采用這種方法其請求響應(yīng)時間只有原來的25%,大大減輕了SNMPv3安全機(jī)制對管理性能的影響,使得SNMPv3在網(wǎng)絡(luò)管理中的應(yīng)用得到增強(qiáng)。
參考文獻(xiàn)
[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網(wǎng)絡(luò)安全管理研究[J].現(xiàn)代電子技術(shù),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的網(wǎng)絡(luò)系統(tǒng)的性能分析[J].計算機(jī)應(yīng)用,2004,24(7):102-104.
[7]SNMP ++ Documentation.http://www.agentpp.com/doc_snmp++3.x/index.html,available,2008.
作者簡介呂 濤 男,1982年出生,江蘇贛榆人,碩士研究生。主要研究方向?yàn)橛嬎銠C(jī)網(wǎng)絡(luò)及計算機(jī)安全。