SNMP 協議

xinglove8113發表於2009-07-16

SNMP

Simple Network Management Protocol

簡單網路管理協議(SNMP)首先是由Internet工程任務組織(Internet Engineering Task Force)()的研究小組為了解決Internet上的路由器管理問題而提出的。它可以在IP,IPX,AppleTalk,OSI以及其他用到的傳輸協議上被使用。

Simple Network Management Protocol

SNMP事實上指一系列網路管理規範的集合,包括協議本身,資料結構的定義和一些相關概念。

簡單網路管理協議(SNMP)是最早提出的網路管理協議之一,它一推出就得到了廣泛的應用和支援,特別是很快得到了數百家廠商的支援,其中包括,,等大公司和廠商。目前SNMP已成為網路管理領域中事實上的工業標準,並被廣泛支援和應用,大多數網路管理系統和平臺都是基於SNMP的。

一、 SNMP概述

SNMP的前身是簡單閘道器監控協議(SGMP),用來對通訊線路進行管理。隨後,人們對SGMP進行了很大的修改,特別是加入了符合Internet定義的SMI和MIB:體系結構,改進後的協議就是著名的SNMP。SNMP的目標是管理網際網路Internet上眾多廠家生產的軟硬體平臺,因此SNMP受Internet標準網路管理框架的影響也很大。現在SNMP已經出到第三個版本的協議,其功能較以前已經大大地加強和改進了。

SNMP的體系結構是圍繞著以下四個概念和目標進行設計的:保持管理代理(agent)的軟體成本儘可能低;最大限度地保持遠端管理的功能,以便充分利用Internet的網路資源;體系結構必須有擴充的餘地;保持SNMP的獨立性,不依賴於具體的計算機、閘道器和網路傳輸協議。在最近的改進中,又加入了保證SNMP體系本身安全性的目標。

1.網路管理功能

      網路管理包括五大功能:故障管理、配置管理、計費管理、效能管理、安全管理。
(1) 故障管理是網路管理中最基本的功能之一。網路故障管理包括故障檢測、隔離故障和糾正故障三方面,包括以下典型功能:維護並檢查錯誤日誌、接受錯誤檢測報告並做出響應、跟蹤、辨認錯誤、執行診斷測試、糾正錯誤。
(2) 配置管理是最基本的網路管理功能,負責網路的建立、業務的展開以及配置資料的維護,包括資源清單管理、資源開通以及業務開通。
(3) 計費管理記錄網路資源的使用,目的是控制和監測網路操作的費用和代價。計費管理的目的是計算和收取使用者使用網路服務的費用,統計網路資源利用率和核算網路的成本效益。計費管理包括以下功能:計算網路建設及運營成本、統計網路及其所包含的資源的利用率、聯機收集計費資料、計算使用者應支付的網路服務費用、賬單管理。
(4) 效能管理的目的是維護網路服務質量(QoS)和網路運營效率。因此要提供效能監測功能、效能分析功能、效能管理控制功能、效能資料庫的維護功能。
(5) 安全管理採用資訊保安措施保護網路中的系統、資料以及業務。安全管理的目的是提供資訊的隱私、認證和完整性保護機制,使網路中的服務、資料以及系統免受侵擾和破壞。

    2.   SNMP中提供了四類管理操作
      (1)get操作用來提取特定的網路管理資訊;
      (2)get-next操作透過遍歷活動來提供強大的管理資訊提取能力;
      (3)set操作用來對管理資訊進行控制(修改、設定);
      (3)trap操作用來報告重要的事件。

二、 SNMF管理控制框架與實現

1.SNMP管理控制框架

SNMP定義了管理程式(manager)和管理代理(agent)之間的關係,這個關係稱為共同體(community)。描述共同體的語義是非常複雜的,但其句法卻很簡單。位於網路管理工作站(執行管理程式)上和各網路元素上利用SNMP相互通訊對網路進行管理的軟體統統稱為SNMP應用實體。若干個應用實體和SNMP組合起來形成一個共同體,不同的共同體之間用名字來區分,共同體的名字則必須符合Internet的層次結構命名規則,由無保留意義的字串組成。此外,一個SNMP應用實體可以加入多個共同體。

SNMP的應用實體對Internet管理資訊庫中的管理物件進行操作。一個SNMP應用實體可操作的管理物件子集稱為SNMP MIB授權範圍。SNMP應用實體對授權範圍內管理物件的訪問仍然還有進一步的訪問控制限制,比如只讀、可讀寫等。SNMP體系結構中要求對每個共同體都規定其授權範圍及其對每個物件的訪問方式。記錄這些定義的檔案稱為“共同體定義檔案”。

SNMP的報文總是源自每個應用實體,報文中包括該應用實體所在的共同體的名字。這種報文在SNMP中稱為“有身份標誌的報文”,共同體名字是在管理程式和管理代理之間交換管理資訊報文時使用的。管理資訊報文中包括以下兩部分內容:

(1)共同體名,加上傳送方的一些標識資訊(附加資訊),用以驗證傳送方確實是共同體中的成員,共同體實際上就是用來實現管理應用實體之間身份鑑別的;

(2)資料,這是兩個管理應用實體之間真正需要交換的資訊。

在第三版本前的SNMP中只是實現了簡單的身份鑑別,接收方僅憑共同體名來判定收發雙方是否在同一個共同體中,而前面提到的附加倍息尚未應用。接收方在驗明傳送報文的管理代理或管理程式的身份後要對其訪問許可權進行檢查。訪問許可權檢查涉及到以下因素:

(1)一個共同體內各成員可以對哪些物件進行讀寫等管理操作,這些可讀寫物件稱為該共同體的“授權物件”(在授權範圍內);

(2)共同體成員對授權範圍內每個物件定義了訪問模式:只讀或可讀寫;

(3)規定授權範圍內每個管理物件(類)可進行的操作(包括get,get-next,set和trap);

(4)管理資訊庫(MIB)對每個物件的訪問方式限制(如MIB中可以規定哪些物件只能讀而不能寫等)。

管理代理透過上述預先定義的訪問模式和許可權來決定共同體中其他成員要求的管理物件訪問(操作)是否允許。共同體概念同樣適用於轉換代理(Proxy agent),只不過轉換代理中包含的物件主要是其他裝置的內容。

2.SNMP實現方式為了提供遍歷管理資訊庫的手段,SNMP在其MIB中採用了樹狀命名方法對每個管理物件例項命名。每個物件例項的名字都由物件類名字加上一個字尾構成。物件類的名字是不會相互重複的,因而不同物件類的物件例項之間也少有重名的危險。

在共同體的定義中一般要規定該共同體授權的管理物件範圍,相應地也就規定了哪些物件例項是該共同體的“管轄範圍”,據此,共同體的定義可以想象為一個多叉樹,以詞典序提供了遍歷所有管理物件例項的手段。有了這個手段,SNMP就可以使用get-next運算子,順序地從一個物件找到下一個物件。get-next(object-instance)操作返回的結果是一個物件例項識別符號及其相關資訊,該物件例項在上面的多叉樹中緊排在指定識別符號;bject-instance物件的後面。這種手段的優點在於,即使不知道管理物件例項的具體名字,管理系統也能逐個地找到它,並提取到它的有關資訊。遍歷所有管理物件的過程可以從第一個物件例項開始(這個例項一定要給出),然後逐次使用get-next,直到返回一個差錯(表示不存在的管理物件例項)結束(完成遍歷)。

由於資訊是以表格形式(一種資料結構)存放的,在SNMP的管理概念中,把所有表格都視為子樹,其中一張表格(及其名字)是相應子樹的根節點,每個列是根下面的子節點,一列中的每個行則是該列節點下面的子節點,並且是子樹的葉節點,如下圖所示。因此,按照前面的子樹遍歷思路,對錶格的遍歷是先訪問第一列的所有元素,再訪問第二列的所有元素……,直到最後一個元素。若試圖得到最後一個元素的“下一個”元素,則返回差錯標記。

SNMP樹形表格結構示意圖

SNMP中各種管理資訊大多以表格形式存在,一個表格對應一個物件類,每個元素對應於該類的一個物件例項。那麼,管理資訊表物件中單個元素(物件例項)的操作可以用前面提到的get-next方法,也可以用後面將介紹的get/set等操作。下面主要介紹表格內一行資訊的整體操作。

(1)增加一行:透過SNMP只用一次set操作就可在一個表格中增加一行。操作中的每個變數都對應於待增加行中的一個列元素,包括物件例項識別符號。如果一個表格中有8列,則set操作中必須給出8個運算元,分別對應8個列中的相應元素。

(2)刪除一行:刪除一行也可以透過SNMP呼叫一次set操作完成,並且比增加一行還簡單。刪除一行只需要用set操作將該行中的任意一個元素(物件例項)設定成“非法”即可。但該操作有一個例外:地址翻譯組物件中有一個特殊的表(地址變換表),該表中未定義一個元素的“非法”條件。因此,SNMP中採用的辦法是將該表中的地址設定成空串,而空字串將被視為非法元素。

至於刪除一行時,表中的一行元素是否真的在表中消失,則與每個裝置(管理代理)的具體實現有關。因此,網路管理操作中,執行管理程式可能從管理代理中得到“非法”資料,即已經刪除的不再使用的元素的內容,因此管理程式必須能透過各資料欄位的內容來判斷資料的合法性。

  三、背景知識  

  SNMP開發於九十年代早期,其目的是簡化大型網路中裝置的管理和資料的獲取。許多與網路有關的軟體包,如HP的OpenView和Nortel Networks的Optivity Network Management System,還有Multi Router Traffic Grapher(MRTG)之類的免費軟體,都用SNMP服務來簡化網路的管理和維護。  

  由於SNMP的效果實在太好了,所以網路硬體廠商開始把SNMP加入到它們製造的每一臺裝置。今天,各種網路裝置上都可以看到預設啟用的SNMP服務,從交換機到路由器,從防火牆到網路印表機,無一例外。  

  僅僅是分佈廣泛還不足以造成威脅,問題是許多廠商安裝的SNMP都採用了預設的通訊字串(例如密碼),這些通訊字串是程式獲取裝置資訊和修改配置必不可少的。採用預設通訊字串的好處是網路上的軟體可以直接訪問裝置,無需經過複雜的配置。  

  通訊字串主要包含兩類命令:GET命令,SET命令。GET命令從裝置讀取資料,這些資料通常是操作引數,例如連線狀態、介面名稱等。SET命令允許設定裝置的某些引數,這類功能一般有限制,例如關閉某個 緗湧凇⑿薷穆酚善韃問 裙δ堋5 芟勻唬珿ET、SET命令都可能被用於拒絕服務攻擊(DoS)和惡意修改網路引數。  

  最常見的預設通訊字串是public(只讀)和private(讀/寫),除此之外還有許多廠商私有的預設通訊字串。幾乎所有執行SNMP的網路裝置上,都可以找到某種形式的預設通訊字串。  

  SNMP 2.0和SNMP 1.0的安全機制比較脆弱,通訊不加密,所有通訊字串和資料都以明文形式傳送。攻擊者一旦捕獲了網路通訊,就可以利用各種嗅探工具直接獲取通訊字串,即使使用者改變了通訊字串的預設值也無濟於事。  

  近幾年才出現的SNMP 3.0解決了一部分問題。為保護通訊字串,SNMP 3.0使用DES(Data Encryption Standard)演算法加密資料通訊;另外,SNMP 3.0還能夠用MD5和SHA(Secure Hash Algorithm)技術驗證節點的識別符號,從而防止攻擊者冒充管理節點的身份操作網路。有關SNMP 3.0的詳細說明,請參見。  

  雖然SNMP 3.0出現已經有一段時間了,但目前還沒有廣泛應用。如果裝置是2、3年前的產品,很可能根本不支援SNMP 3.0;甚至有些較新的裝置也只有SNMP 2.0或SNMP 1.0。  

  即使裝置已經支援SNMP 3.0,許多廠商使用的還是標準的通訊字串,這些字串對駭客組織來說根本不是秘密。因此,雖然SNMP 3.0比以前的版本提供了更多的安全特性,如果配置不當,其實際效果仍舊有限。  

  四、禁用SNMP  

  要避免SNMP服務帶來的安全風險,最徹底的辦法是禁用SNMP。如果你沒有用SNMP來管理網路,那就沒有必要執行它;如果你不清楚是否有必要執行SNMP,很可能實際上不需要。即使你打算以後使用SNMP,只要現在沒有用,也應該先禁用SNMP,直到確實需要使用SNMP時才啟用它。  

  下面列出瞭如何在常見的平臺上禁用SNMP服務。  

  ■ Windows XP和Windows 2000  

  在XP和Win 2K中,右擊“我的電腦”,選擇“管理”。展開“服務和應用程式”、“服務”,從服務的清單中選擇SNMP服務,停止該服務。然後開啟服務的“屬性”對話方塊,將啟動型別該為“禁用”(按照微軟的預設設定,Win 2K/XP預設不安裝SNMP服務,但許多軟體會自動安裝該服務)。  
  ■ Windows NT 4.0  

  選擇“開始”→“設定”,開啟服務設定程式,在服務清單中選擇SNMP服務,停止該服務,然後將它的啟動型別該為禁用。  

  ■ Windows 9x  

  開啟控制皮膚的網路設定程式,在“配置”頁中,從已安裝的元件清單中選擇“Microsoft SNMP代理”,點選“刪除”。檢查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices和HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows\CurrentVersion\Run註冊鍵,確認不存在snmp.exe。  

  ■ Cisco Systems硬體  

  對於Cisco的網路硬體,執行“no SNMP-server”命令禁用SNMP服務。如果要檢查SNMP是否關閉,可執行“show SNMP”命令。這些命令只適用於執行Cisco IOS的平臺;對於非IOS的Cisco裝置,請參考隨機文件。  

  ■ HP硬體  

  對於所有使用JetDirect卡(絕大部分HP網路印表機都使用它)的HP網路裝置,用telnet連線到JetDirect卡的IP地址,然後執行下面的命令:  

SNMP-config: 0
quit  


  這些命令將關閉裝置的SNMP服務。但必須注意的是,禁用SNMP服務會影響服務的發現操作以及利用SNMP獲取裝置狀態的埠監視機制。  

  ■ Red Hat Linux  

  對於Red Hat Linux,可以用Linuxconf工具從自動啟動的服務清單中刪除SNMP,或者直接從/etc/services檔案刪除啟動SNMP的行。對於其他Linux系統,操作方法應該也相似。

  五、保障SNMP的安全  

  如果某些裝置確實有必要執行SNMP,則必須保障這些裝置的安全。首先要做的是確定哪些裝置正在執行SNMP服務。除非定期對整個網路進行埠掃描,全面掌握各臺機器、裝置上執行的服務,否則的話,很有可能遺漏一、二個SNMP服務。特別需要注意的是,網路交換機、印表機之類的裝置同樣也會執行SNMP服務。確定SNMP服務的執行情況後,再採取下面的措施保障服務安全。  

  ■ 載入SNMP服務的補丁  

  安裝SNMP服務的補丁,將SNMP服務升級到2.0或更高的版本。聯絡裝置的製造商,瞭解有關安全漏洞和升級補丁的情況。  

  ■ 保護SNMP通訊字串  

  一個很重要的保護措施是修改所有預設的通訊字串。根據裝置文件的說明,逐一檢查、修改各個標準的、非標準的通訊字串,不要遺漏任何一項,必要時可以聯絡製造商獲取詳細的說明。  

  ■ 過濾SNMP  

  另一個可以採用的保護措施是在網路邊界上過濾SNMP通訊和請求,即在防火牆或邊界路由器上,阻塞SNMP請求使用的埠。標準的SNMP服務使用161和162埠,廠商私有的實現一般使用199、391、705和1993埠。禁用這些埠通訊後,外部網路訪問內部網路的能力就受到了限制;另外,在內部網路的路由器上,應該編寫一個ACL,只允許某個特定的可信任的SNMP管理系統操作SNMP。例如,下面的ACL只允許來自(或者走向)SNMP管理系統的SNMP通訊,限制網路上的所有其他SNMP通訊:  

access-list 100 permit ip host w.x.y any
access-list 100 deny udp any any eq snmp
access-list 100 deny udp any any eq snmptrap  
access-list 100 permit ip any any  


  這個ACL的第一行定義了可信任管理系統(w.x.y)。利用下面的命令可以將上述ACL應用到所有網路介面:  

interface serial 0
ip access-group 100 in  


  總之,SNMP的發明代表著網路管理的一大進步,現在它仍是高效管理大型網路的有力工具。然而,SNMP的早期版本天生缺乏安全性,即使最新的版本同樣也存在問題。就象網路上執行的其他服務一樣,SNMP服務的安全性也是不可忽視的。不要盲目地肯定網路上沒有執行SNMP服務,也許它就躲藏在某個裝置上。那些必不可少的網路服務已經有太多讓人擔憂的安全問題,所以最好關閉SNMP之類並非必需的服務——至少儘量設法保障其安全。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21807038/viewspace-609359/,如需轉載,請註明出處,否則將追究法律責任。

相關文章