SNMP学习——v3 VACM
目录:
☆ SNMPv3视图访问控制模型
☆ SNMPv3报文格式
☆ VACM参数
☆ Context Table
☆ Security To Group Table
☆ Access Table
☆ View Tree Family Table
☆ Overall Picture
☆ 小结
☆ 参考资源
--------------------------------------------------------------------------
☆ SNMPv3视图访问控制模型
本文是介绍SNMPv3新安全特性的第二篇。前面我们介绍了基于用户的安全模型USM以
及如何完成SNMPv3报文的鉴别、加密、解密。这次我们介绍基于视图的访问控制模型
VACM(View-based Access Control Model),RFC 2575定义了VACM,它提供对MIB的访
问控制。
一个SNMP实体的访问控制子系统负责检查对指定MIB的某种类型的访问是否被允许。
你将会看到,VACM引入的概念相当复杂、混乱。SNMPv1和SNMPv2c采用community
string来划分MIB范围、确定访问权限等等。而VACM允许更加严谨的动态的访问控制
模型,易于管理员配置。
☆ SNMPv3报文格式
SNMPv3的报文格式变得适合使用USM这样的安全模型以及VACM这样的访问控制模型。
msgVersion
报文的SNMP版本号,比如1、2或3
msgID
msgID用于在manager和agent之间对应请求和响应消息。响应报文中的msgID必须
与请求报文中的msgID一致。
msgMaxSize
msgMaxSize指明了"发送者"所能接收的来自其它SNMP engine的最大消息长度。
msgFlags
msgFlags就一个字节,指明如何处理消息。比如,msgFlags中有两个bits用于指
明报文是否需要验证、加密。
msgSecurityModel
SNMPv3被设计成多种安全模型并存。msgSecurityModel指明该消息使用的安全模
型。这样接收实体就知道该采用哪种安全模型。
msgSecurityParameters
这是一个字节数组,对应安全模型相关数据。这些数据仅由msgSecurityModel指
定的安全模型定义、使用。介绍USM时,已经看到如何利用这个域对SNMPv3报文
进行鉴别、加密、解密。
scopedPDU
scopedPDU包含常规PDU以及一些鉴别信息,这些鉴别信息指明处理PDU时的唯一
上下文,上下文是可配置的。
☆ VACM参数
VACM在进行访问控制时会用到msgFlags、msgSecurityModel以及scopedPDU域。
msgFlags用于确定消息的安全级别,比如noAuthNoPriv、authNoPriv或authPriv。
msgSecurityModel指明消息所用安全模型。scopedPDU包含上下文以及被管理对象的
OIDs,具体有如下域:
contextEngineID
contextEngineID唯一标识一个SNMP实体,该实体在特定上下文内可以访问一个
被管理对象的实例。
contextName
PDU数据所属上下文的唯一名字,这个是可配置的。
PDU(数据)
SNMP协议数据单元。参看RFC 1905了解SNMP PDUs更多信息。
这三个参数被传递给isAccessAllowed()函数,该函数是VACM的唯一入口点,在此决
定访问是否被允许。PDU中每一个变量都要接受检查,如果其中一个变量不可访问,
就向主调者返回错误,处理将终止。VACM定义了四个表,每个表负责不同方面的访问
控制,它们均可通过VACM MIB远程修改。
☆ Context Table
这里所谓的上下文实际定义了一个SNMP实体所能访问的被管理对象集合。换言之,用
一个名字代表被管理对象子集。可能一个对象位于多个上下文中,可能一个SNMP实体
被允许访问多个上下文。vacmContextTable用于存放所有本地可访问上下文,其关键
字为contextName,每个表项含有:
vacmContextName
一个唯一的可读字符串,用于命名一个上下文。会在vacmContextTable中搜索
scopedPDU里的contextName。如未找到匹配,拒绝访问并返回noSuchContext。
反之继续访问控制检查。
☆ Security To Group Table ----user和group的关系
groupName针对一组principals定义一种访问控制策略。principal是对SNMP实体的细
化,代表来自SNMP实体的一个具体用户操作。组中可有零个或多个元素(principal)。
securityName与msgSecurityModel构成复合关键字,至多确定一个组。于是,一个通
信受特定securityModel保护的特定principal只能属于一个组。
vacmSecurityToGroupTable用于存放组信息,其复合关键字为securityModel和
securityName,每个表项含有:
vacmSecurityModel
指定SNMPv3安全模型,比如USM
vacmSecurityName
代表一个principal的名字,格式与安全模型无关。对于USM,securityName就是
userName。
vacmGroupName
一个可读字符串,标识该表项所属组。
首先根据msgSecurityModel对SNMPv3报文进行鉴别、解密,获取securityName。然后
securityName与msgSecurityModel构成复合关键字,在表中匹配搜索。如果没有找到
匹配表项,拒绝访问并返回noSuchGroupName。否则返回相应的groupName,继续访问
控制检查。
☆ Access Table ------group和view的关系
vacmAccessTable存放各组的访问权限。为了确定是否允许访问,必须从表中选取表
项,根据其中相应的viewName进行后续访问控制检查。一个组可能对应着多种访问权
限,最终只选取最大安全化的那个表项。就是说,最高安全、最长contextPrefix匹
配的表项被选中。参看vacmAccessTable MIB描述了解更多信息。该表靠groupName、
contextPrefix、securityModel以及securityLevel进行索引,每个表项含有:
vacmGroupName
组名,有访问权限对应之。
vacmAccessContextMatch
如果设置为exact,contextName必须与vacmAccessContextPrefix精确匹配。如
果设置为prefix,contextName只需与vacmAccessContextPrefix前面几个字符匹
配即可。
vacmAccessContextPrefix
contextName将与之做比较
vacmAccessSecurityModel
为了获取这种访问权限而必须使用的securityModel
vacmAccessSecurityLevel
为了获取这种访问权限而必须使用的最小securityLevel。安全级别的顺序是
noAuthNoPriv < authNoPriv < authPriv
vacmAccessReadViewName
读访问所用的权威MIB viewName。如果该值为空串,表示没有任何活动视图被配
置成可读的。
vacmAccessWriteViewName
写访问所用的权威MIB viewName。如果该值为空串,表示没有任何活动视图被配
置成可写的。
vacmAccessNotifyViewName
notify访问所用的权威MIB viewName。如果该值为空串,表示没有任何活动视图
被配置成允许notify访问的。
检查该表时所用contextName是通过vacmContextTable检查的有效contextName。所用
groupName来自检查vacmSecurityToGroupTable时的返回值。securityModel来自消息
中的msgSecurityModel,securityLevel来自msgFlags。如果最终未匹配出一个访问
权限,则拒绝访问并返回noAccessEntry。
一旦匹配出一个访问权限,与之对应的适当的viewName将被选取出来,使用哪个
viewName根据PDU中SNMP操作决定。GET和NEXT操作使用vacmAccessReadViewName,
SET操作使用vacmAccessWriteViewName。TRAP操作使用vacmAccessNotifyViewName。
如果相应viewName未被配置,拒绝访问并返回noSuchView。
最后,如果匹配出一个访问权限也选取了适当的viewName,访问控制检查继续进行。
☆ View Tree Family Table ---view表
vacmViewTreeFamilyTable存放MIB views。一个MIB view由一颗OID子树和一个掩码
共同定义。
对于每个给定OID,当下列两点同时满足时,被认为属于一个特定MIB view:
1) OID至少与OID子树一样长
2) OID & 掩码 == OID子树 & 掩码
掩码是可配置的,如果它在测试中比OID或OID子树短,隐式认为不足部分为均为1。
所以,如果一个view subtree family的掩码为空(长度为零),意味着这个掩码为全
1,对应一颗单一的OID子树。
例如,假设定义了如下一些MIB视图
(A) subtree: 1.3.6.1.2.1
mask: 1 1 1 1 1 1
(B) subtree: 1.3.6.1.2.1.1.1
mask: 1 1 1
(C) subtree: 1.3.6.1.2.1.2
mask: none
(D) subtree: 1.3.6.1.2.1.1
mask: 1 1 0 1 0 1 1
(E) subtree: 1.3.6.1.2.1.2
mask: 1 1 0 1 0
(F) subtree: 1.3.6.1.2.1
mask: 1 1 0 1 0 1
根据如上MIB view检查来自如下一些OID,以确定这些OID是否是否属于某个MIB视图。
由于掩码的存在,一个OID可能位于多个MIB视图,也可能不属于任何视图。
1.3.6.1.2.1 belongs to: A, F
1.2.6.1.2.1.1 belongs to: none of them
1.3.6.1.3.1 belongs to: F
1.3.4.1.4.1.2 belongs to: E, F
1.3.6.1.2.1.1.1.0 belongs to: A, B, D, F
1.3.6.1.2 belongs to: none of them
所有的MIB views都保存在vacmViewTreeFamilyTable中,该表靠viewName和OID子树
索引。注意,VACM MIB定义了一个旋锁vacmViewSpinLock,当多个SNMP Manager通过
VACM MIB修改该表时,就会用到vacmViewSpinLock。其用法与usmUserSpinLock的用
法是一样的,参看<<SNMP/MIB系列(12)--SNMPv3用户安全模型>>。该表中每个表项包
含:
vacmViewTreeFamilyViewName
一个字符串,MIB视图名
vacmViewTreeFamilySubtree
一颗OID子树,与vacmViewTreeFamilyMask一道定义一颗或多颗MIB视图子树
vacmViewTreeFamilyMask
掩码,与vacmViewTreeFamilySubtree一道定义一颗或多颗MIB视图子树
vacmViewTreeFamilyType
指明vacmViewTreeFamilySubtree与vacmViewTreeFamilyMask一道定义的MIB视图
子树是包含在MIB view内,还是排除在MIB view外。
这里用来索引vacmViewTreeFamilyTable的viewName来自vacmAccessTable中的权威视
图名。根据MIB view检查来自PDU的OID。如果OID不属于任何MIB view,拒绝访问并
返回notInView。反之,允许访问并返回accessAllowed。
☆ Overall Picture
VACM定义的访问控制算法稍微有点复杂、难于理解。下面这张流程图演示了前述四张
表各自的输入输出。securityModel与securityName决定who,contextName决定where,
securityModel与securityLevel决定how,viewType(比如read、write或notify)决定
why。被管理对象的OID决定what,被管理对象实例决定which。
--------------------------------------------------------------------------
☆ 小结
VACM概览使你理解如何针对SNMPv3报文进行访问控制管理。
配置每个VACM表时应该特别小心。一点微小的错误配置可能导致一个巨大的安全漏洞,
比如潜在允许对敏感数据进行非法访问。应该先在一个测试用网络环境中测试你的配
置,确认无误后再应用到实际网络环境中去。
SNMPv3框架确保了安全子系统和访问控制子系统的模块化,虽然目前USM与VACM分别
被用做安全模块以及访问控制模块,但你可以实现自己的安全模块以及访问控制模块。
将来IETF可能会更新这些模块。无论如何,SNMPv3框架确保新旧模块之间可以平滑过
渡。
SNMP学习——v3 VACM的更多相关文章
- Centos 6.5下一个SNMP简单配置(snmp protocol v3,监控宝)
Centos 6.5下一个SNMP简单配置(snmp protocol v3.监控宝) jom_ch@2014/7/25 1,安装 >yum -y install net-snmp net-sn ...
- SNMP学习笔记之SNMP报文以及不同版本(SNMPv1、v2c、v3)的区别
本篇文章将重点分析SNMP报文,并对不同版本(SNMPv1.v2c.v3)进行区别! 四.SNMP协议数据单元 在SNMP管理中,管理站(NMS)和代理(Agent)之间交换的管理信息构成了SNMP报 ...
- SNMP学习笔记之SNMP 原理与实战详解
原文地址:http://freeloda.blog.51cto.com/2033581/1306743 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...
- Snmp学习总结(一)——Snmp的基本概念
一.SNMP简单概述 1.1.什么是Snmp SNMP是英文"Simple Network Management Protocol"的缩写,中文意思是"简单网络管理协议& ...
- Snmp学习总结(七)——SNMP4J介绍
一.SNMP4J介绍 SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应.SNMP4J是纯面向对象设计与SNMP++(用C++实现SNMP ...
- Snmp学习总结系列——开篇
进入公司以来,一直参与到公司的产品研发工作当中去,在产品研发中有一个监控远程服务器CPU使用率,内存使用情况,硬盘的需求,技术总监提出了使用Snmp协议作为远程监控的技术解决方案,头一次听说Snmp这 ...
- SNMP学习笔记之SNMPv3的配置和认证以及TroubleShooting
0x00 增加snmp v3用户 增加用户的时候,必须要停止SNMP服务. # service snmpd stop # net-snmp-config --create-snmpv3-user -r ...
- SNMP学习笔记之SNMP TRAP简介、流程以及使用Python实现接受Trap信息
0x00 SNMP TRAP简介 SNMP(Simple Network Management Protocol) trap是一种很有用,但是也容易让人难以理解的协议. 虽然名字叫做简单网络管理协议, ...
- SNMP学习笔记之SNMP4J介绍(Java)
0x00 SNMP4J介绍 SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应.SNMP4J是纯面向对象设计与SNMP++(用C++实现S ...
随机推荐
- SQLServer无法删除登录名'***',因为该用户当前正处于登录状态解决方法
问题描述: sqlserver在删除登录名的时候提示删除失败 标题: Microsoft SQL Server Management Studio -------------------------- ...
- Win10 Service'MongoDB Server' failed to start. Verify that you have sufficient privileges to start system services【简记】
最近工作中有需要用到 MongoDB数据库,以前用的3.*的版本,这次用的是较新4.0.6的版本,然后去官网下载安装. 安装到一半,就弹出如下提示,说是"MongoDB Server&quo ...
- .NET MVC全局异常处理(一)
目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关的配置,但没有实际做过,以为改下设定就 ...
- flex布局justify-content属性和align-items属性设置
前言: flex最常用的就是justify-content和align-items了,这里把这两个属性介绍下,大家更多关于flex布局可以查看阮一峰的日志,写的非常清楚! 阮一峰flex布局的日志:h ...
- idea怎么配置spring
前提基础: 1.idea软件并JDK成功能用 2.有tacate,并会导入. 3.了解jsp和mvc基本结构 详细介绍: https://www.cnblogs.com/wormday/p/84356 ...
- Python距离放弃又近了Day02
今天,来时大概复习了上一天讲过的一些计算机基础和简单数据类型和if语句,第二天就来了循环,还是个while的死循环,突然想到还是电脑好,不管循环多少次,只要电脑不崩溃,就能一直精准的算下去,这就和人不 ...
- MySQL之视图、触发器、事务、存储过程、函数
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- Linux内存管理 (4)分配物理页面
专题:Linux内存管理专题 关键词:分配掩码.伙伴系统.水位(watermark).空闲伙伴块合并. 我们知道Linux内存管理是以页为单位进行的,对内存的管理是通过伙伴系统进行. 从Linux内存 ...
- Java内存模型知识点小结---《深入理解Java内存模型》(程晓明)读书总结
一.Java内存模型介绍 内存模型的作用范围: 在Java中,所有实例域.静态域和数组元素存放在堆内存中,线程之间共享,下文称之为“共享变量”.局部变量.方法参数.异常处理器等不会在线程之间共享,不存 ...
- 【原创】新说Mysql事务隔离级别
引言 大家在面试中一定碰到过 说说事务的隔离级别吧? 老实说,事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!因为他们对可重复读 ...