背景
简单网络管理协议SNMP(Simple Network Management Protocol)用于网络设备的管理。网络设备种类多种多样,不同设备厂商提供的管理接口(如命令行接口)各不相同,这使得网络管理变得愈发复杂。为解决这一问题,SNMP应运而生。SNMP作为广泛应用于TCP/IP网络的网络管理标准协议,提供了统一的接口,从而实现了不同种类和厂商的网络设备之间的统一管理。
SNMP协议分为三个版本:SNMPv1、SNMPv2c和SNMPv3。
协议 | 安全性 | 其他差异 |
---|---|---|
SNMPv1 | 基于团体名认证,安全性较差 | 初始化版本 |
SNMPv2c | 基于团体名认证,安全性较差 | 在SNMPv1版本的基础上引入了GetBulk和Inform操作,支持更多的标准错误码信息,支持更多的数据类型(Counter64、Counter32)。 |
SNMPv3 | 模块化方法,允许调整安全性。 常见的认证方式: 基于USM(User Security Module)的认证加密, 基于VACM(View-based Access Control Model)的访问控制. 具体见安全性章节 | 支持的操作同SNMPv2c相同 |
架构
SNMP系统由以下四部分组成:
名称 | 说明 |
---|---|
NMS(Network Management System) | 网络中的管理者,是一个采用SNMP协议对网络设备进行管理/监视的系统,运行在NMS服务器上。 |
SNMP Agent | 被管理设备中的一个代理进程,用于维护被管理设备的信息数据并响应来自NMS的请求,把管理数据汇报给发送请求的NMS。 |
MIB(Management Information Base) | 一个数据库,指明了被管理设备所维护的变量。MIB在数据库中定义了被管理设备的一系列属性:对象的名称、对象的状态、对象的访问权限和对象的数据类型等。 |
Management object | 被管理对象。每一个设备可能包含多个被管理对象,被管理对象可以是设备中的某个硬件,也可以是在硬件、软件(如路由选择协议)上配置的参数集合。 |
MIB 设计
MIB是以树状结构进行存储的。树的节点表示被管理对象,它可以用从根开始的一条路径唯一地识别,这条路径就称为OID。
比如:system的OID为1.3.6.1.2.1.1
用户可以配置MIB视图来限制NMS能够访问的MIB对象。MIB视图是MIB的子集合,用户可以将MIB视图内的对象配置为exclude或include。exclude表示当前视图不包含该MIB子树的所有节点;include表示当前视图包含该MIB子树的所有节点。
SNMP端口号
SNMP报文是普通的UDP报文,协议中规定有两个默认端口号:
端口号 | 说明 |
---|---|
161 | NMS发送Get、GetNext、GetBulk和Set操作请求以及SNMP Agent响应这些请求操作时,使用该端口号。 |
162 | SNMP Agent向NMS发送Trap或Inform时,使用该端口号。 该端口号支持用户配置,但是需要保证SNMP Agent发送Trap或Inform的端口号与NMS监听Trap或Inform的端口号要一致。 |
工作原理
方式 | 说明 |
---|---|
GET | 从网络节点检索数据 |
GETNEXT | 从网络节点检索下一个元素 |
SET | 向网络节点发送配置或控制命令 |
TRAP | 网络节点主动向管理站发送警报通知 |
INFORM | 已确认收到TRAP(如果没有收到确认,网络节点可以尝试再次发送) |
安全性
SNMPv1 , SNMPv2c: 团体名认证(community strings)
SNMP在最初开发时采用团体名(使用了明文)进行认证,因此安全性较差,使用net-snmp中的工具snmpget可以查看到这些明文。
$ snmpget -d -v 2c -c
demopublic
test.net-snmp.org sysContact.0
Sending 47 bytes to UDP: [157.185.82.8]:161->[0.0.0.0]:0
0000: 30 2D 02 01 01 04 0A 64 65 6D 6F 70 75 62 6C 69 0-…demopubli
0016: 63 A0 1C 02 04 78 8E 32 C9 02 01 00 02 01 00 30c
…x.2…0
0032: 0E 30 0C 06 08 2B 06 01 02 01 01 04 00 05 00 .0…+…
Received 102 byte packet from UDP: [157.185.82.8]:161->[0.0.0.0]:47960
0000: 30 64 02 01 01 04 0A 64 65 6D 6F 70 75 62 6C 69 0d…demopubli
0016: 63 A2 53 02 04 78 8E 32 C9 02 01 00 02 01 00 30c
.S…x.2…0
0032: 45 30 43 06 08 2B 06 01 02 01 01 04 00 04 37 4E E0C…+…7N
0048: 65 74 2D 53 4E 4D 50 20 43 6F 64 65 72 73 20 3C et-SNMP Coders <
0064: 6E 65 74 2D 73 6E 6D 70 2D 63 6F 64 65 72 73 40 net-snmp-coders@
0080: 6C 69 73 74 73 2E 73 6F 75 72 63 65 66 6F 72 67 lists.sourceforg
0096: 65 2E 6E 65 74 3E e.net>
SNMPv2-MIB::sysContact.0 = STRING: Net-SNMP Coders net-snmp-coders@lists.sourceforge.net
SNMPv3: 动态模块化方法(modular approach)
RFCS 3410-3419针对SNMPv3定义了SNMPv3的模块化方法。这种模块化方法很重要,因为它被设计为允许协议在未来需要或首选其他类型的安全性时进行调整。
认证方式
协议+认证方式 | 说明 |
---|---|
SNMPv1 、 SNMPv2c | 无安全性可言。 |
SNMPv3+USM | 最初的SNMPv3安全模型。大多数设备都支持。 |
SNMPv3+TLS(或DTLS) | 通过TLS和DTLS隧道传输SNMP。希望很快得到大多数设备的支持。 |
SNMPv3+SSH | 通过SSH隧道传输SNMP(在Net-SNMP中并非100%支持) |
SNMP+Kerberos | 使用Kerberos保护SNMP(很少支持这种方式) |
如果完全使用Net-SNMP产品或支持TLS的产品,推荐使用SNMPv3 over(D)TLS
如果与旧版SNMPv3设备通信,需要使用 SNMPv3/USM
设备不能仅支持SNMPv1/SNMPv2c(没有安全性)
SNMPv3 + USM
最初的SNMPv3规范包括一个基于USM(User Security Module)的认证的安全模型,该模型通过允许管理员定义具有各种安全凭据的“用户”来保护协议。这对保护协议有很大帮助(尽管正如Wes Hardaker(Net SNMP的创始人)在一篇博客文章中所记录的那样,SNMPv3/USM仍然存在一些问题)。运营商还发现,保护SNMPv3/USM需要“另一个”密码数据库来维护,这在操作上是繁重的。
但SNMPv3/USM实现得相当广泛,大多数现代设备都会支持它。
有关将SNMPv3/USM与Net SNMP工具包一起使用的详细信息,请参阅SNMPv3/USM教程。
SNMPv3+TLS(或DTLS)
IETF关于SNMP安全性的最新活动已在SNMP集成安全模型(ISMS)工作组中完成。USM是创建了一个新的安全系统,但用户更愿意通过隧道传输SNMP。
相关RFC:
RFC | 说明 |
---|---|
RFC5590 | 简单网络管理协议的传输子系统 |
RFC5591 | 简单网络管理协议(SNMP)的传输安全模型 |
RFC5592 | 简单网络管理协议(SNMP)的安全外壳传输模型 |
RFC5608 | 简单网络管理协议(SNMP)传输模型的远程身份验证拨入用户服务(RADIUS)用法。 |
RFC5953 | 简单网络管理协议(SNMP)的传输层安全性(TLS)传输模型 |
这些RFC提供了通过SSH、TLS和DTLS对SNMPv3数据包进行隧道传输的框架。SSH协议使用现有的SSH身份验证和加密方法(如SSH密钥和/或用户名和密码)来保护其流量。TLS和DTLS协议使用X.509证书来保护其流量。
Net SNMP 5.6
包含对通过TLS和DTLS使用SNMP的强大支持。有关通过TLS和DTLS设置和使用SNMP的详细信息,请参阅TLS教程。Net SNMP 5.6还包含对通过SSH使用SNMP的最低支持,但由于缺乏可用的SSH服务器端库,支持受到限制,并且在连接到OpenSSH sshd服务器时通过专门的shell“破解”实现。
有关使用SSH对性能影响的信息,参考Performance Analysis of SNMP over SSH(Pdf)和Performance Analysis of SNMP over SSH(PPT)。
Kerberos SNMPv3
Wes Hardaker和Ken Horstein开始在IETF中为SNMPv3实现kerberos安全模型。尽管Net SNMP包含了这方面的原型实现,但这项工作从未在IETF中完成,也从未在Net SNMP实现中完成,而且还没有准备好在现实中使用。
参考
什么是SNMP