SNMP

好久不见. 提交于 2021-02-07 04:19:53
背景知识
SNMP开发于九十年代早期,其目的是简化大型网络中设备的管理和数据的获取。许多与网络有关的 软件包,如HP的Open View和Nortel Networks的Optivity Network Management System,还有Multi Router Traffic Grapher(MRTG)之类的 免费软件,都用SNMP服务来简化网络的管理和维护。

概念

是一种在IP网络中管理网络节点(如服务器、工作站、路由器、交换机等)的标准协议

简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个应用层协议(application layer protocol)、数据库模型(database schema)和一组资源对象。

SNMP的目标是管理互联网Internet上众多厂家生产的软硬件平台

SNMP为应用层协议,是TCP/IP协议族的一部分。它通过用户数据报协议(UDP)来操作

由于SNMP的效果实在太好了,所以网络硬件厂商开始把SNMP加入到它们制造的每一台设备。今天,各种网络设备上都可以看到默认启用的SNMP服务,从 交换机路由器,从 防火墙网络打印机,无一例外。
仅仅是分布广泛还不足以造成威胁,问题是许多厂商安装的SNMP都采用了 默认的通信字符串(例如密码),这些 通信字符串是程序获取设备信息和修改配置必不可少的。采用 默认通信字符串的好处是网络上的软件可以直接访问设备,无需经过复杂的配置。
通信字符串主要包含两类命令:GET命令,SET命令。
GET命令从设备 读取 数据,这些数据通常是操作参数,例如连接状态、接口名称等。
SET命令允许设置设备的某些参数,这类功能一般有限制,例如关闭某个网络接口、修改路由器参数等功能。但很显然,GET、SET命令都可能被用于拒绝服务攻击DoS)和恶意修改网络参数。
最常见的默认通信字符串是public(只读)和private(读/写),除此之外还有许多厂商私有的默认通信字符串。几乎所有运行SNMP的网络设备上,都可以找到某种形式的默认通信字符串。
SNMP2.0和SNMP1.0的安全机制比较脆弱,通信不加密,所有通信字符串和数据都以明文形式发送。攻击者一旦捕获了 网络通信,就可以利用各种 嗅探工具直接获取通信字符串,即使用户改变了通信字符串的默认值也无济于事。
近几年才出现的SNMP3.0解决了一部分问题。为保护通信字符串,SNMP3.0使用DES(DataEncryptionStandard)算法加密数据通信;另外,SNMP3.0还能够用MD5和SHA(SecureHashAlgorithm)技术验证节点的 标识符,从而防止攻击者冒充管理节点的身份操作网络。
缺点:虽然SNMP3.0出现已经有一段时间了,但自从发布以来还没有广泛应用。如果设备是2012年以前的产品,很可能根本不支持SNMP3.0;甚至有些较新的设备也只有SNMP2.0或SNMP1.0。
即使设备已经支持SNMP3.0,许多厂商使用的还是标准的通信字符串,这些字符串对 黑客组织来说根本不是秘密。因此,虽然SNMP3.0比以前的版本提供了更多的安全特性,如果配置不当,其实际效果仍旧有限
禁用SNMP
要避免SNMP服务带来的安全风险,最彻底的办法是禁用SNMP。如果你没有用SNMP来管理网络,那就没有必要运行它;如果你不清楚是否有必要运行SNMP,很可能实际上不需要。即使你打算以后使用SNMP,只要现在没有用,也应该先禁用SNMP,直到确实需要使用SNMP时才启用它。

原理:

在典型的SNMP用法中,有许多系统被管理,而且是有一或多个系统在管理它们。-是一种在IP网络中管理网络节点(如服务器、工作站、路由器、交换机等)的标准协议
1.每一个被管理的系统上又运行一个叫做代理者(agent)的 软件元件,且通过SNMP对管理系统报告资讯。
2.基本上,SNMP代理者以 变量呈现管理资料。
3.管理系统透过GET,GETNEXT和GETBULK协定指令取回资讯,--被动
或是代理者在没有被询问的情况下,使用 TRAP或INFORM传送资料。
4.管理系统也可以 传送配置更新或控制的请求,透过 SET协定指令达到 主动管理系统的目的。
5.配置和控制指令只有当网络基本结构需要改变的时候使用,而 监控指令则通常是常态性的工作。
6.可透过 SNMP存取的变量以阶层的方式结合。这些分层和其他元数据(例如变量的类型和描述)以管理 信息库(MIBs)的方式描述。
作用:
SNMP能够使网络管理员提高网络管理效能,及时发现并解决网络问题以及规划网络的增长。网络管理员还可以通过 SNMP接收网络节点的通知消息以及告警事件报告等来获知 网络出现的问题
 
SNMP管理的网络主要由三部分组成:
  • 被管理的设备
  • SNMP代理
  • 网络管理系统(NMS)
它们之间的关系如右图所示。

 

  • 网络中被管理的每一个设备都存在一个管理信息库(MIB)用于收集并储存管理信息。通过SNMP协议,NMS能获取这些信息。被管理设备,又称为网络单元或网络节点,可以是支持SNMP协议的路由器、交换机、服务器或者主机等等。
  • SNMP代理是被管理设备上的一个网络管理软件模块,拥有本地设备的相关管理信息,并用于将它们转换成与SNMP兼容的格式,传递给NMS。
  • NMS运行应用程序来实现监控被管理设备的功能。另外,NMS还为网络管理提供大量的处理程序及必须的储存资源。

风险

接入Internet的网络面临许多风险,Web 服务器可能面临攻击, 邮件服务器的安全也令人担忧。但除此之外,网络上可能还存在一些隐性的漏洞。大多数网络总有一些设备运行着SNMP服务,许多时候这些SNMP服务是不必要的,但却没有引起 网络管理员的重视。
对于接入Internet的 主机,SNMP是威胁安全的十大首要因素之一
SNMP服务通常在位于 网络边缘的设备( 防火墙保护圈之外的设备)上运行,进一步加剧了SNMP带来的风险。这一切听起来出人意料,但其实事情不应该是这样的
 

    MIB

Management Information Base,管理信息库):是一个类似DNS的倒状的树状结构的映射关系,如下图:

wKiom1Vpja-xw21dAAD0FSDoQgE951.jpg

由上图可见,MIB是以树状结构来组织数据的,每一个节点表示一个被管理的对象,每一个对象都可以从根开始找出一条唯一的路径,这个路径就是OID,如图中的system的OID就是(.1.3.6.1.2.1.1)。

 

MIBManagement Information Base: 管理信息库,由 网络管理协议访问的管理对象数据库,它包括SNMP可以通过网络设备的SNMP管理代理进行设置的变量。 SMI,Structure of Management Information:管理信息结构,用于定义通过 网络管理协议可访问的对象的规则。SMI定义在MIB中使用的数据类型及 网络资源在MIB中的名称或表示。
使用SNMP进行 网络管理需要下面几个重要部分: 管理基站,管理代理,管理信息库和网络管理工具(MIB)
管理基站通常是一个独立的设备,它用作 网络管理者进行网络管理的 用户接口。基站上必须装备有管理 软件管理员可以使用的用户接口和从MIB取得信息的数据库,同时为了进行 网络管理它应该具备将管理命令发出基站的能力。
管理代理是一种 网络设备,如主机, 网桥路由器集线器等,这些设备都必须能够接收管理基站发来的信息,它们的状态也必须可以由管理基站监视。管理代理响应基站的请求进行相应的操作,也可以在没有请求的情况下向基站发送信息。
MIB是对象的集合,它代表 网络中可以管理的资源和设备。每个 对象基本上是一 个数据变量,它代表被 管理的对象的一方面的信息。
 
最后一个方面是管理协议,也就是SNMP,SNMP的基本功能是:取得,设置和接收代理发送的意外信息。
取得指的是基站发送请求,代理根据这个请求回送相应的数据,
设置是基站设置管理对象(也就是代理)的值,接收代理发送的意外信息是指代理可以在基站未请求的状态下向基站报告发生的意外情况。
 
SNMP为 应用层协议,是TCP/IP协议族的一部分。它通过 用户数据报协议(UDP)来操作。在分立的管理站中,管理者进程对位于管理站中心的MIB的访问进行控制,并提供 网络管理员接口。管理者进程通过SNMP完成 网络管理。SNMP在UDP、IP及有关的特殊 网络协议(如,Ethernet, FDDI, X.25)之上实现。

SNMP协议命令:

这里只讨论在类linux上的实现,在linux上SNMP协议的实现是通过安装相应的软件包实现的,可以采用源码安装方式,也可以采用rpm包的安装方式,在Yum源中一个是net-snmp,另一个是net-snmp-utils,Agent只安装net-snmp包,NMS只安装net-snmp-utils包即可,如果NMS也要被监控,那net-snmp也需要安装。Agent端监听在UDP的161端口,NMS监听在UDP的162(如果要接受trap操作)。

    我这里的实验环境:两台linux主机,nod0(192.168.0.200)为NMS,nod1(192.168.0.201)为Agent,系统都为CentOS 6.4 x86_64。

Agent--即各个网络设备(如路由器,防火墙,主机)可以去查看一下配置文件“/etc/snmp/snmpd.conf”此配置文件多数是注释掉的,作为一个被监控端通常会被配置到的信息如下,

关于访问控制的,即哪个主机或网段可以从Agent上获取到信息:

1
2
3
# First, map the community name "public" into a "security name"
#       sec.name  source          community
com2sec notConfigUser  default       public
 
 
 

默认是以community为public来验证NMS发起的信息获取是不是以community为public发起的,如果是,则把要收集的信息获取后发送给NMS,如果不是,则拒绝响应。这里的community表示“社区、团体”,在此处就把它看成一个当作验证的密码。“source”默认为default,为了安全应该把“community”和"source"的两个值都做修改,如:

# First, map the community name "public" into a "security name"
#       sec.name  source          community
com2sec notConfigUser  192.168.0.0 /24        testpublic
关于MIB访问控制的:
# Make at least  snmpwalk -v 1 localhost -c public system fast again.
#       name           incl/excl     subtree         mask(optional)
view    systemview    included   .1.3.6.1.2.1.1
view    systemview    included   .1.3.6.1.2.1.25.1.1

这部分是定义哪些MIB节点是可以访问的

incl 表示包含

excl 表示排除

mask 表示掩码

关于snmp的命令有许多,此处只挑选几个做说明:

[root@nod0 ~] # snmp
snmpbulkget    snmpd          snmpget        snmpnetstat    snmptable      snmptrap       snmpvacm
snmpbulkwalk   snmpdelta      snmpgetnext    snmpset        snmptest       snmptrapd      snmpwalk
snmpconf       snmpdf         snmpinform     snmpstatus     snmptranslate  snmpusm
snmpget命令:用snmp get操作向网络实体发起一个获取请求,此命令最后必须跟上至少一个OID
snmpget [COMMON OPTIONS] [-Cf] OID [OID]...
- v  1|2c|3       specifies SNMP version to use
-c COMMUNITY 指定community
举例:
[root@nod0 ~] # snmpget -v 2c -c testpublic 192.168.0.201 SNMPv2-MIB::sysName.0
SNMPv2-MIB::sysName.0 = STRING: nod1    #获取到192.168.0.201的主机名
snmpwalk命令:用snmp getnext请求指定MIB的子树
- v  1|2c|3       specifies SNMP version to use
-c COMMUNITY 指定community
举例:
[root@nod0 ~] # snmpwalk -v 2c -c testpublic 192.168.0.201 interfaces  #获取远程主机MIB中interfaces子树的全部信息
IF-MIB::ifNumber.0 = INTEGER: 2
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifType.1 = INTEGER: softwareLoopback(24)
IF-MIB::ifType.2 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifMtu.1 = INTEGER: 16436
IF-MIB::ifMtu.2 = INTEGER: 1500
IF-MIB::ifSpeed.1 = Gauge32: 10000000
IF-MIB::ifSpeed.2 = Gauge32: 0
IF-MIB::ifPhysAddress.1 = STRING:
IF-MIB::ifPhysAddress.2 = STRING: 0:c:29:c6:f7:7a
IF-MIB::ifAdminStatus.1 = INTEGER: up(1)
IF-MIB::ifAdminStatus.2 = INTEGER: up(1)
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
IF-MIB::ifOperStatus.2 = INTEGER: up(1)
IF-MIB::ifLastChange.1 = Timeticks: (0) 0:00:00.00
IF-MIB::ifLastChange.2 = Timeticks: (0) 0:00:00.00
IF-MIB::ifInOctets.1 = Counter32: 0
IF-MIB::ifInOctets.2 = Counter32: 7789122
IF-MIB::ifInUcastPkts.1 = Counter32: 0
IF-MIB::ifInUcastPkts.2 = Counter32: 7687
IF-MIB::ifInNUcastPkts.1 = Counter32: 0
IF-MIB::ifInNUcastPkts.2 = Counter32: 0
IF-MIB::ifInDiscards.1 = Counter32: 0
IF-MIB::ifInDiscards.2 = Counter32: 0
IF-MIB::ifInErrors.1 = Counter32: 0
IF-MIB::ifInErrors.2 = Counter32: 0
IF-MIB::ifInUnknownProtos.1 = Counter32: 0
IF-MIB::ifInUnknownProtos.2 = Counter32: 0
IF-MIB::ifOutOctets.1 = Counter32: 0
IF-MIB::ifOutOctets.2 = Counter32: 484581
IF-MIB::ifOutUcastPkts.1 = Counter32: 0
IF-MIB::ifOutUcastPkts.2 = Counter32: 5040
IF-MIB::ifOutNUcastPkts.1 = Counter32: 0
IF-MIB::ifOutNUcastPkts.2 = Counter32: 0
IF-MIB::ifOutDiscards.1 = Counter32: 0
IF-MIB::ifOutDiscards.2 = Counter32: 0
IF-MIB::ifOutErrors.1 = Counter32: 0
IF-MIB::ifOutErrors.2 = Counter32: 0
IF-MIB::ifOutQLen.1 = Gauge32: 0
IF-MIB::ifOutQLen.2 = Gauge32: 0
IF-MIB::ifSpecific.1 = OID: SNMPv2-SMI::zeroDotZero
IF-MIB::ifSpecific.2 = OID: SNMPv2-SMI::zeroDotZero

snmpbulkwalk命令:用snmp getbulk对指定对象的MIB上的树进行查询,用法与snmpwalk一样。

snmptranslate命令:这个命令可以让名称性的OID转换为数字型

举例:
[root@nod0 ~] # snmptranslate -On -IR system   (-On表示以数字格式输出,-IR表示随机访问MIB)
.1.3.6.1.2.1.1
[root@nod0 ~] # snmptranslate -Onf -IR system  (-f表示列出名称型的OID)
.iso.org.dod.internet.mgmt.mib-2.system
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!