呂 濤 祿樂濱 陳 晨
摘 要: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年出生,江蘇贛榆人,碩士研究生。主要研究方向為計算機網絡及計算機安全。