什么是简单网络管理协议(SNMP)
SNMP(Simple Network Management Protocol,简单网络管理协议)的前身是简单网关监控协议(SGMP),用来对通信线路进行管理。随后,人们对SGMP进行了很大的修改,特别是加入了符合Internet定义的SMI和MIB:体系结构,改进后的协议就是著名的SNMP。SNMP的目标是管理互联网Internet上众多厂家生产的软硬件平台,因此SNMP受Internet标准网络管理框架的影响也很大。现在SNMP已经出到第三个版本的协议,其功能较以前已经大大地加强和改进了。
简单网络管理协议(SNMP)首先是由Internet工程任务组织(Internet Engineering Task Force)(IETF)的研究小组为了解决Internet上的路由器管理问题而提出的。许多人认为 SNMP在IP上运行的原因是Internet运行的是TCP/IP协议,然而事实并不是这样。
SNMP被设计成与协议无关,所以它可以在IP,IPX,AppleTalk,OSI以及其他用到的传输协议上被使用。
SNMP是一系列协议组和规范(见下表),它们提供了一种从网络上的设备中收集网络管理信息的方法。SNMP也为设备向网络管理工作站报告问题和错误提供了一种方法。
从被管理设备中收集数据有两种方法:一种是只轮询(polling-only)的方法,另一种是基于中断(interrupt-based)的方法。
如果你只使用只轮询的方法,那么网络管理工作站总是在控制之下。而这种方法的缺陷在于信息的实时性,尤其是错误的实时性。你多久轮询一次,并且在轮询时按照什么样的设备顺序呢?如果轮询间隔太小,那么将产生太多不必要的通信量。如果轮询间隔太大,并且在轮询时顺序不对,那么关于一些大的灾难性的事件的通知又会太馒。这就违背了积极主动的网络管理目的。
当有异常事件发生时,基于中断的方法可以立即通知网络管理工作站(在这里假设该设备还没有崩溃,并且在被管理设备和管理工作站之间仍有一条可用的通信途径)。然而,这种方法也不是没有他的缺陷的,首先,产生错误或自陷需要系统资源。如果自陷必须转发大量的信息,那么被管理设备可能不得不消耗更多的时间和系统资源来产生自陷,从而影响了它执行主要的功能(违背了网络管理的原则2)。
而且,如果几个同类型的自陷事件接连发生,那么大量网络带宽可能将被相同的信息所占用(违背了网络管理的原则1)。尤其是如果自陷是关于网络拥挤问题的时候,事情就会变得特别糟糕。克服这一缺陷的一种方法就是对于被管理设备来说,应当设置关于什么时候报告问题的阈值(threshold)。但不幸的是这种方法可能再一次违背了网络管理的原则2,因为设备必须消耗更多的时间和系统资源,来决定一个自陷是否应该被产生。
结果,以上两种方法的结合:面向自陷的轮询方法(trap-directed polling)可能是执行网络管理最为有效的方法了。一般来说,网络管理工作站轮询在被管理设备中的代理来收集数据,并且在控制台上用数字或图形的表示方式来显示这些数据。这就允许网络管理员分析和管理设备以及网络通信量了。
被管理设备中的代理可以在任何时候向网络管理工作站报告错误情况,例如预制定阈值越界程度等等。代理并不需要等到管理工作站为获得这些错误情况而轮询他的时候才会报告。这些错误情况就是众所周知的SNMP自陷(trap)。
在这种结合的方法中,当一个设备产生了一个自陷时,你可以使用网络管理工作站来查询该设备(假设它仍然是可到达的),以获得更多的信息。
简单网络管理协议允许网络管理工作站软件与被管理设备中的代理进行通信。这种通信可以包括来自管理工作站的询问消息、来自代理的应答消息或者来自代理给管理工作站的自陷消息。为了保证因网络管理而带来的通信量是最小的(网络管理原则1),SNMP使用了一种异步客户机/服务器方法。这意味着一个SNMP实体(管理工作站或被管理设备)在发出一条消息后不需要等待一个应答;然而,除了自陷的情况以外应答都是要被产生的。如果需要的话该实体可以发送另一条消息,或者也可以继续它预先被定义的功能。SNMPv1实现起来很简单并且对资源占用不多,它只有5个请求/响应原语:
get-request
set-request
get-next-request
get-reponse
trap
网络管理工作站可以把感兴趣的变量值提取到其应用程序中,只要发出get-request或get-next-request报文即可。前者是指定对象的读操作,后者则提供了一个树遍历操作符,便于确定一个代理进程支持哪些对象。网络管理工作站可以修改代理进程中的变量值,只要发出set-request报文即可。
如果没有发生错误,代理进程可以用get-reponse原语回答这些请求。另外,利用trap原语,代理进程可以异步地发送告警给网络管理工作站,告诉它发生了某个满足预设条件的事件。
SNMP结构图
实现中的经验和设计过程中的不断完善给SNMPv2带来了协议改进意见,即给网络管理工作站增加一个成块读操作get-bulk-request报文。当需要用一个请求原语提取大量数据(如读取某个表的内容)时就可以调用它以提高效率。SNMPv2也引进管理进程和管理进程之间的通信进行状况报告,为此增加了一条原语inform-request,并把get-response简化成更加合理的名称reponse。trap报文则已改为snmpv2-trap,并与所有的协议报文具有同样的格式。
接入Internet的网络面临许多风险,Web服务器可能面临攻击,邮件服务器的安全也令人担忧。但除 此之外,网络上可能还存在一些隐性的漏洞。大多数网络总有一些设备运行着SNMP服务,许多时候这些SNMP服务是不必要的,但却没有引起网络管理员的重视。
根据SANS协会的报告,对于接入Internet的主机,SNMP是威胁安全的十大首要因素之一;同时,SNMP还是Internet主机上最常见的服务之一。特别地,SNMP服务通常在位于网络边缘的设备(防火墙保护圈之外的设备)上运行,进一步加剧了SNMP带来的风险。这一切听起来出人意料,但其实事情不应该是这样的。
〖一、背景知识〗
SNMP开发于九十年代早期,其目的是简化大型网络中设备的管理和数据的获取。许多与网络有关的软件包,如HP的OpenView和Nortel Networks的Optivity Network Management System,还有Multi Router Traffic Grapher(MRTG)之类的免费软件,都用SNMP服务来简化网络的管理和维护。
由于SNMP的效果实在太好了,所以网络硬件厂商开始把SNMP加入到它们制造的每一台设备。今天,各种网络设备上都可以看到默认启用的SNMP服务,从交换机到路由器,从防火墙到网络打印机,无一例外。
仅仅是分布广泛还不足以造成威胁,问题是许多厂商安装的SNMP都采用了默认的通信字符串(例如密码),这些通信字符串是程序获取设备信息和修改配置必不可少的。采用默认通信字符串的好处是网络上的软件可以直接访问设备,无需经过复杂的配置。
通信字符串主要包含两类命令:GET命令,SET命令。GET命令从设备读取数据,这些数据通常是操作参数,例如连接状态、接口名称等。SET命令允许设置设备的某些参数,这类功能一般有限制,例如关闭某个网络接口、修改路由器参数等功能。但很显然,GET、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出现已经有一段时间了,但目前还没有广泛应用。如果设备是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之类并非必需的服务——至少尽量设法保障其安全。