SNMP的概念(包括v3)

SNMP协议

  • 目的 。 SNMP是一种协议,用于获取路由器,交换机甚至服务器等计算设备的状态(例如,CPU负载,可用内存,网络负载)。
  • 对象描述符,托管对象 。 客户端可以提供全局唯一名称,例如cpmCPUTotal5secRev(过去5秒钟Cisco设备的平均CPU负载)来指示所需的信息,然后服务器应返回此类信息。 这样的文本名称被称为“对象描述符”。 术语“对象”或“托管对象”是指CPU负载的概念。 设备中的实际CPU负载称为“对象实例”。
  • 对象标识符(OID) 。 为了确保每个对象描述符都是唯一的,实际上是使用整数列表(例如1.3.6.1.4.1.9.9.109.1.1.1.1.6)定义的。 每个整数就像Java中的一个包。 例如,1.3.6.1.4.1.9中的整数表示iso(1),org(3),dod,即国防部(6),互联网(1),私有(4),企业(1),思科(9)。 这使Internet权限可以将名称空间的管理层次化:分别委托给私有企业和思科,思科可以进一步委托给它的各个部门或产品类别。 这样的整数列表称为“对象标识符”。 这是被管理对象的最终标识。
    • 即使对象描述符应该是唯一的,但查看层次结构还是很有用的。 因此,通常会显示对象描述符的完整列表,例如iso.org.dod.internet.private.enterprises.cisco…cpmCPUTotal5secRev。
    • 为什么使用整数而不是符号名称? 可能允许实施SNMP的网络设备(具有很少的RAM或CPU能力)节省处理空间。 人们可以在命令中使用诸如对象描述符之类的符号名称,但是在协议的操作中,它是使用对象标识符来完成的。
    • 原则上,设备上的对象abcd和对象abcde没有容纳关系。 也就是说,它们不像包含子对象的Java对象。 实际上,SNMP中每个对象的值基本上都是一个简单的值(标量),例如整数或字符串。 他们之间的唯一关系是他们的名字。
  • 标识实例 。 现在出现了SNMP中最复杂的概念。 考虑一下路由器上的网络接口已接收的字节数的概念。 这个概念是一个对象。 由于路由器应具有多个接口,因此该对象必须有多个实例。 然后,SNMP客户端如何向SNMP服务器指示它对哪个实例感兴趣? 解决方案或多或少是一个难题:允许abcd的实例代表一个表(一个化合物,结构值),该表包含由abcde表示的行(也包括化合物,结构值)每行包含一个子对象实例(仅限标量值)。 每个子对象称为“列对象”。 例如,每一行可能包含三个对象实例:abcdef,abcdeg和abcdeidx。 如果要在特定行中引用abcdef实例,则将编写abcdef <index>。 索引的含义由abcde(行)定义。 例如,可以定义为在表中找到包含值等于<index>的列对象abcdeidx的行,然后返回列对象abcdef作为结果。
    • 请注意,这是对象的值可以是结构并且SNMP中存在对象包含关系的唯一情况。
    • 令人困惑的是,abcdef既用作对象标识符又用作查找键,以在行中查找子实例。 与其他对象标识符不同,该标识符现在表示对象包含关系,因此它必须具有abcde作为前缀,否则服务器将不知道要查找哪个表以及索引的定义。
    • 完整的标识符abcdef <index>称为实例标识符。
    • 这是一个具体示例:考虑iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry.ifInOctets.1。 iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry的定义是,要查找表中的行,应搜索包含子对象iso.org.dod.internet的行。 .mgmt.mib-2.interfaces.ifTable.ifEntry.ifIndex的值为1(指定的索引),则它将返回子对象iso.org.dod.internet.mgmt.mib-2.interfaces的值。行中的ifTable.ifEntry.ifInOctets。 当然,要使其正常工作,必须在每行iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry.ifIndex子对象中分配顺序值1、2,...等。 (确实是这样)。
    • 最后,一个简单的情况是根本没有表。 例如,要查找设备的正常运行时间,请使用对象标识符iso.org.dod.internet.mgmt.mib-2.host.hrSystem.hrSystemUptime并附加.0作为索引,因此实例标识符为iso .org.dod.internet.mgmt.mib-2.host.hrSystem.hrSystemUptime.0。 顺便说一句,“ hr”代表“主机资源”。
  • MIB(管理信息库) 。 MIB只是管理对象(而不是实例)的集合。 有标准的MIB,设备制造商可以实施,用户可以找到要使用的正确对象标识符。 也有专有的MIB,例如思科设计的MIB,仅提供其设备上可用的信息。
  • 查找受支持的OID 。 如何找到设备支持的MIB或对象标识符? 仅“遍历MIB树”会更容易:显示树或子树中的所有实例。 在Linux上,此操作如下进行。 您指定服务器的IP或主机名,还可以选择指定一个节点,以便仅显示该子树(对象标识符以点开头,否则将假定它相对于iso.org.dod.internet.mgmt.mib -2):
# snmpwalk <some args> localhost
# snmpwalk <some args> localhost .iso.org.dod.internet.mgmt.mib-2.system
# snmpwalk <some args> localhost system
  • 获取实例 。 只需指定实例标识符:
# snmpget <some args> localhost .iso.org.dod.internet.mgmt.mib-2.host.hrSystem.hrSystemUptime.0
# snmpget <some args> localhost host.hrSystem.hrSystemUptime.0
  • SNMP实体,引擎和应用程序 。 SNMP是对等协议。 没有服务器和客户端的概念(为简化起见,在此使用这些术语)。 相反,两个对等方都具有相同的核心功能,例如发送或接收SNMP消息,执行安全处理(请参阅下文),集成v1,v2c和v3处理(调度)等。此部分称为SNMP引擎。 在引擎之上,有不同的“应用程序”:一个应用程序可能仅响应对对象实例的请求(在v1和v2中称为SNMP代理),另一个应用程序可以探测其他对象(在v1和v2中称为SNMP管理器),而另一个可能转发SNMP消息(SNMP代理)。 整个服务器或客户端称为“ SNMP实体”。
  • 语境 。 在某些设备上,一个完整的MIB子树有多个副本。 例如,物理路由器可以支持虚拟路由器的概念。 每个这样的虚拟路由器将具有实例的完整MIB子树。 在这种情况下,每个虚拟路由器都可以在SNMP服务器中指示为“上下文”。 上下文由名称标识。 例如,可以将虚拟路由器标识为“ vr1”上下文。 有一个默认上下文,其名称为空字符串(“”)。 客户端发送查询时,可以指定上下文名称。 如果不是,它将查询默认上下文。
  • 通知(陷阱) 。 发生某些情况时,SNMP服务器可能会主动向客户端发送通知。 这非常像没有请求的响应。 否则,一切都是相似的。 在服务器上配置条件(例如,实例值的更改或超出范围),目标,使用的凭据(请参阅下面的安全性部分)等。
  • 运输约束力 。 通常,SNMP在UDP端口161上运行。

SNMP安全

  • SNMP v1和v2c安全性 。 在SNMP v1和v2c(未广泛使用v2)中,几乎没有安全性。 唯一的安全性是“社区字符串”。 即,服务器被配置为位于由字符串标识的社区中,例如“ foo”,“ public”(通常使用,许多设备的默认值表示无保护)或“ private”。 如果客户可以引用社区strnig,则允许其访问。 由于社区字符串作为纯文本包含在SNMP数据包中,因此它实际上不提供安全性。 因此,在v1和v2c中,要访问SNMP服务器,您将执行以下操作:
# snmpwalk -v 2c -c public localhost
# snmpget -v 2c -c public localhost <INSTANCE ID>
  • SNMP v3安全性 。 在SNMP v3中,存在基于用户的安全性。 即,可能要求客户端使用密码(认证密码)将发自用户的消息认证为服务器。 另外,可能进一步要求客户端使用另一个密码(隐私密码)来加密消息。 此安全要求称为“安全级别”(不需要身份验证,身份验证但没有隐私,具有隐私的身份验证)。 因此,在v3中,您将以如下方式访问服务器:
# snmpwalk -v 3 -l noAuthNoPriv localhost
# snmpwalk -v 3 -l authNoPriv -u kent -A "my auth passwd" localhost
# snmpwalk -v 3 -l authPriv -u kent -A "my auth passwd" -X "my priv passwd" localhost
    • 客户端配置文件 。 为了避免每次都键入这些内容,您可以将这些参数作为默认值存储到snmp.conf文件中。
    • 安全限制 。 在命令行上指定密码是一个坏主意,因为本地用户可以使用“ ps”显示密码。 将其存储到配置文件中更好。 但是,该文件仅允许使用一个身份验证密码和一个隐私密码,不足以处理对不同服务器使用不同密码的情况。
  • 证券名称 。 安全名称只是一个用户名。 不多不少。 这是RFC中使用的术语(也许将来可能会是其他东西?)
  • 算法 。 此外,存在用于认证(使用MD5或SHA的HMAC)和用于隐私(使用DES或AES进行加密)的不同算法。 因此,您需要指定要使用的算法:
# snmpwalk -v 3 -l noAuthNoPriv localhost
# snmpwalk -v 3 -l authNoPriv -u kent -a MD5 -A "my auth passwd" localhost
# snmpwalk -v 3 -l authPriv -u kent -a MD5 -A "my auth passwd" -x DES -X "my priv passwd" localhost
    • 确保算法匹配 。 由于SNMP使用UDP,并且每个查询和响应可能只使用一个UDP数据包,因此在“连接阶段”根本没有算法协商。 实际上,大概是为了简化实施,消息中甚至没有指示所使用的算法,因此客户端必须使用服务器上用户帐户中配置的商定算法,否则服务器将无法通过身份验证或解密消息。
  • 本地化密钥 。 用户帐户的身份验证密码和隐私密码不能直接使用。 这个想法是,很可能您将对站点上所有设备上的所有用户帐户使用相同的密码。 如果直接使用它,则控制一个设备的黑客将能够找到该密码并将其用于访问所有其他设备。 因此,在创建用户帐户时,您可以指定密码,但是Linux SNMP服务器会将其与为设备生成的唯一ID(称为“引擎ID”)结合使用(例如MAC或IP和/或随机数)生成并存储在安装程序中),对其进行哈希处理并将结果用作密码(“本地化密钥”)。 这样,即使黑客可以找到此本地化密钥,他仍将无法找到原始密码。
    • 但是客户端如何生成相同的密钥?
  • 用户帐户创建 。 由于需要生成本地化密钥,因此在Linux上创建用户帐户的方法很奇怪。 您停止服务器,在文件中指定用户帐户的名称和密码,然后启动服务器。 它将读取密码,将其转换为本地化密钥并覆盖文件。 此文件在Linux上为/var/lib/snmp/snmpd.conf:
createUser kent MD5 "my auth password" DES "my privacy password"
createUser paul SHA "my auth password, no encryption needed"
  • 访问控制 。 访问控制可以指定用户帐户,所需的最低安全级别,访问MIB树的哪一部分(可以使用OID标识子树),访问类型(读或写),以便授予访问权限。 以下是Linux上的一些示例设置(尽管使用了人类用户名,但实际上它们应代表设备):
rouser john noauth .iso.org.dod.internet.mgmt.mib-2.system
rouser kent priv .iso.org.dod.internet.mgmt.mib-2.system
rouser kent auth .iso.org.dod.internet.mgmt.mib-2
rwuser paul priv
  • 查看 。 如何在访问控制规则中指定几个子树? 您可以定义一个视图。 视图具有名称,并定义为包括一些子树,但不包括某些子树。 然后,您可以在访问控制中按名称引用它:
view myview included .iso.org.dod.internet.mgmt.mib-2.system
view myview included .iso.org.dod.internet.mgmt.mib-2.host
view myview excluded .iso.org.dod.internet.mgmt.mib-2.host.hrStorage

rwuser paul priv -V myview
  • v1和v2c的访问控制 。 对于v1和v2c,访问控制可以指定社区字符串,客户端的IP范围(“源”),子树(OID)或视图:
rocommunity public 192.168.1.0/24 .iso.org.dod.internet.mgmt.mib-2.system
rwcommunity private localhost -V myview
  • 最灵活的访问控制模型 。 上面的访问控制模型称为“传统模型”。 新的,最灵活的访问控制模型称为“基于视图的访问控制模型(VACM)”,即使前者也可以使用视图。 称其为基于组的访问控制可能更合适,因为它在规则中使用用户组(尚无确切语法!):
group g1 kent
group g1 paul
#access <group> <context> <min sec level> <exact context?> <view for read> <view for write> <view for notify>
access g1 "" auth exact myview1 myview2 myview3
  • 将社区字符串映射到用户名 。 使用VACM时,需要将v1和v2c合并到基于用户的访问控制处理中,而不是授予对社区字符串的访问权限。 为此,可以将社区字符串和源字符串映射到用户名(映射的用户名不必存在):
com2sec user1 192.168.1.0/24 public
# "default" source means any
com2sec user2 default private
  • 安全模型 。 即使在不同的SNMP版本中将不同类型的身份统一表示为用户名,它们的可信度仍然存在很大差异。 因此,在指定组成员身份和访问控制规则时,需要指定“安全模型”(v1,v2c或v3中的用户安全模型),并且这是正确的语法:
group g1 usm kent
group g1 usm paul
group g2 v2c user1
group g2 v1 user1
group g2 v1 user2
access g1 "" usm auth exact myview1 myview2 myview3
access g2 "" any noauth exact myview4 myview5 myview6


翻译自: https://www.javacodegeeks.com/2013/04/concepts-of-snmp-including-v3.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值