SNMPV3的实现原理

2023-05-16

在snmp发展到V3版本后,把snmp的安全性提升到一个新高度,这同时也带来了实现上的复杂性。在02年,03年我都曾经想进一步的了解它的实现,但都没什么进展。

这次在实现Csnmp的过程中,又一次的接触到V3的底层实现机理。现把我们在实现Csnmp中的V3模块的时候,对V3的一些实现细节做一总结,希望能缩短一些朋友掌握SNMPV3的时间和难度。(本文针对的朋友是对snmpV3有个接触的,故对v3术语不做解释)

我们先把加密和HMAC部分先放一下,等我们先讲几个别的问题后,再来看加密和HMAC这部分的时候,就会非常清晰了。

现在先把读写控制权限这部分(VACM)做一分析。VACM这部分在Csnmp中实现的时候有如下三个Vector每个分别装如下一个类:SecuToGroupTableItem、VacmAccessTableItem、ViewTreeFamiTableItem它们分别代表VacmSecurityToGroupTable、VacmAccessTable、VacmViewTreeFamilyTable这三张V3协议中的表。这三张表是配合起来一起完成对读写Mib信息的权限控制的。首先,用securityName和securityModel从SecuToGroupVector取出其对应的groupName, 其次用刚才取到的groupName加上SecurityModel、SecurityLevel以及是读、还是写操作这四个参数从VacmAccessVector取出其相应的viewName。最后一步是VACM的关键,通过刚才上一步取到的ViewName,再加上request OID进行如下权限判断:对于ViewNameVector中的每一条记录首先判断其ViewName是否和我们取出来的ViewName相同,相同的话,看request OID是否是以该条记录中的subtree为开头的,如果是的话,再判断该条记录的familyType是included(1)还是excluded(2),如果是“included(1)“的话则继续判断按同样的步骤判断下一条记录,直到没有符合ViewName相同的记录。如果是“excluded(2)”的话,则退出,并向Manager(管理端)发出AuthError的错误Response。

    也许上面的文档写的不怎么清楚,但请各位稍微仔细掠一下的,就会发现VACM这部分其实较为简单,因为在我们实现的过程中这一块真正核心的代码估计不超过100行。

下面我会花较大篇幅把各位关心的V3的加密和HMAC部分做一分析。首先讲解一下Key Localization也就是密钥的具体化,即该管理端下的每个Agent都有一个不同于其他Agent的Key。之所以要key Localization,这主要是V3协议考虑到一个管理端要管理多个Agent,如果管理端对每个Agent的密钥都要取记住的话,这将是非常不方便的,第二个原因是即使有一个Agent的key被attacker取到了,他也无法知道其他的Agent的key。在实现Key Localization的时候,为满足上面的一般都这么做:先用用户的password,通过(MD5)处理得到对应的User key0,然后把刚才的User key0+你要通讯的Agent的EngineID,再一次通过MD5处理,这就获得了你所需要的Localized Key。

这个Localized Key在接下来的加密和认证过程中都要用到(这是因为管理者可以只用一个password来产生加密的Key和认证的Key, 也就是加密的Key == 认证的key,但出于更好的安全性考虑的话,建议用两个不同的password来分别产生加密Key和认证Key)。

好,现在先就V3的Authentication的处理做一分析: 首先按SNMPV3 PDU的要求把所有部分都加上,但把USM部分中的msgAuthenticationParameters部分用连续的12个(byte)0x00填充。等所有部分都填充好后,用刚才讲到的认证Key+这个Request PDU一起,送入MD5,产生出一个12个byte的msgAuthenticationParameters,并用这个替换掉开始放入的12个空白byte,其实我们可以把msgAuthenticationParameters看作一个MAC它起到一个电子指纹的作用,这样一个V3版本的Request PDU就可以发给某一Agent了。

   V3的加密处理过程如下:用DES算法进行加密。这就首先要得到一个8个byte的salt,实现的时候一般都是通过方法产生的,由那个你要通讯的Agent的snmpEngineBoots(重启次数)+管理端产生的一个系统随机数一起构造出8byte的salt。

在得到salt后,加上开始得到的加密Key,它们一起通过DES算法把byte[]形式化了的contextEngineID、contextName、PDU加密成密文。在Agent端的解密处理如下:加密Key的产生如管理端一样,salt就是Request PDU的msgPrivacyParameters。它们一起解密DES密文,得到加密前的东西。

水平有限只能写的这么清楚了,如有费解的地方请参考相关V3的部分。其实V3的实现,还有一些需要注意的,但这里没法一一讲清楚,我就再拣一个地方稍稍讲解一下。

V3版本的Agent和管理端的第一次通讯过程如下:1)管理端发起通讯请求,因为是第一次通讯故管理端它没有这个Agent的EngineID,于是msgAuthoritativeEngineID这一域置为NULL,并且User Name这一域为Initial,把这一Request PDU1发给Agent端,Agent收到这样一个Request PDU,它发现msgAuthoritativeEngineID为NULL,于是报错并向管理端发送report1,这个报文中包括了该Agent的EngineID以及snmpEngineBoots等域。 2)管理端在收到这个report1后,把这个Agent的EngineID存储下来。接下来如果管理端再向这个代理端发送Request PDU2,这个PDU的msgAuthoritativeEngineID字段就有值了。但这次还是会收到从Agent端来的错误报告,这次是报”notInTimeWindows)这是因为还没进行Agent和管理端的时间同步问题。这次Agent端返回给管理端的错误报告中包括了当前Agent的运行时间。管理端在收到这个report2后,又保存一下这个Agent的最新系统时间,供下次使用。在通过这样两次“握手“后,管理端和Agent才可以真正开始SNMP交互。

仅以此文献给所有那些执着追求的朋友们。

                                   ―――netcomm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SNMPV3的实现原理 的相关文章

  • Git Submodule管理项目子模块

    使用场景 当项目越来越庞大之后 xff0c 不可避免的要拆分成多个子模块 xff0c 我们希望各个子模块有独立的版本管理 xff0c 并且由专门的人去维护 xff0c 这时候我们就要用到git的submodule功能 常用命令 git cl
  • Spring Boot结合easyExcel实现自增序号

    有些业务功能要求能导出序号 xff0c 现在提供两种实现方式 通过mysql查询实现 xff1b 实现RowWriteHandler接口 xff0c 自定义拦截器 xff1b 一 通过mysql查询实现 通过自定义变量实现每行数据 43 1
  • Spring Boot 实体里的List集合参数验证

    Spring Boot 实体里的List集合参数验证 Spring Boot 通过Hibernate Validator 加验证大家都知道 不知道的话可以参考这篇文章SpringBoot里参数校验 参数验证 今天讲一下Spring Boot
  • 树形结构工具类,如:菜单、部门等

    1 树节点 span class token keyword package span span class token namespace com span class token punctuation span zjson span
  • EasyPoiUtil导出工具

    span class token keyword package span span class token namespace com span class token punctuation span zjson span class
  • sap上传excel文档字符限制处理

    abap中有多个函数处理上传的excel文档中的数据 xff0c 记录数据的信息 xff08 行 列 值 xff09 如 xff0c 函数KCD EXCEL OLE TO INT CONVERT xff1a data lt data in
  • ffmpeg部署和springboot使用

    视频存储部署 一 环境安装 1 1 yasm安装 在编译ffmpeg时 xff0c 执行 configure xff0c 报出了如下错误 xff1a nasm yasm not found or too old Use disable x8
  • 【docker】安装clickhouse

    一 联网安装clickhouse 1 为了方便安装 xff0c 将clickhouse的工作目录和数据目录都在同一个目录下 xff0c 在home下创建目录 mkdir clickhouse cd clickhouse 创建日志 配置文件
  • springboot整合mybatis-plus、clickhouse、mysql多数据源

    springboot的多数据源有多种方式 xff0c 本文按照指定不同dao mapper xml的方式来实现访问不同的数据源 这样的好处是不用注解去切换数据源 1 引入驱动 span class token generics span c
  • linux中的oracle启动和关闭

    一 启动数据库实例 span class token number 1 span 切换到oracle用户 su span class token operator span oracle span class token number 2
  • BigDecimal计算工具类

    方便以后大家使用 span class token keyword import span span class token namespace java span class token punctuation span math spa
  • 安装、使用mongodb踩过的坑

    轻松一下 没用分布式架构之前 xff0c 你只有一个问题 xff1a 并发性能不足 用了分布式架构 xff0c 多出了一堆问题 xff1a 数据如何同步 主键如何产生 如何熔断 分布式事务如何处理 使用mongodb踩过的坑 今天对安装 x
  • JS使用总结:简单标签赋值和取值:span等;实时触发事件

    JS使用总结 简单标签赋值和取值 xff1a span等 xff1b 实时触发事件 xff1b 了解一下简单标签赋值和取值实时触发事件代码 了解一下 作为后台开发 xff0c 今天使用了前端的技术 xff0c 做一个总结 xff1b 包括两
  • FreeRtos的笔记 (一)

    FreeRtos的笔记 一 一 前言 linux是分时系统 和 RTOS时实操作系统区别 RTOS时实操作系统 当外界事件或数据产生时 xff0c 能够接受并以足够快的速度予以处理 实时操作系统是保证在一定时间限制内完成特定功能的操作系统
  • UCOSII操作系统(一)--基础知识

    前言 比较主流的操作系统有UCOSII FREERTOS LINUX等 参考书籍 xff1a 嵌入式实时操作系统 COS II原理及应用 嵌入式实时操作系统uCOS II 邵贝贝 第二版 1 操作系统的作用 xff1a 操作系统是计算机硬件
  • ORB SLAM2 编译&运行

    1 依赖安装 xff1a 1 xff09 安装 GLEW xff1a sudo apt get install libglew dev 2 xff09 安装 libuvc xff1a git clone https github com k
  • SAP 一句话入门之SD

    SD是Sales and Distribution的简称 在SAP系统中 xff0c 销售与分销模块处在供应链下游 xff0c 关注从客户订单到向客户收款的全过程 SD模块中的Sales好理解 xff0c 而Distribution却容易被
  • realsense-ros安装

    一 realsense ros安装 1 Create a catkin workspace mkdir p realsense rosws src cd realsense rosws src catkin init workspace 2
  • thinkphp页面请求时间超过40S报404错误解决办法

    最近在写一个thinkphp项目的时候 xff0c 发现Ajax从后端请求数据时间比较长 xff0c 大概需要45秒左右 xff0c 但是一旦请求时间超过40s xff0c 页面就会超时404了 xff0c 一开始以为是ajax请求时间不能
  • C语言宏定义详解

    宏定义引入 源程序在编译之前 xff0c 会先进行预处理 预处理并不是C语言编译器的组成部分 xff0c 不能直接对它们进行编译 经过预处理后 xff0c 程序就不再包括预处理命令了 xff0c 最后再由编译程序对预处理之后的源程序进行编译

随机推荐

  • C语言枚举详解

    枚举的引入 枚举是C语言中的一种基本数据类型 xff0c 它可以让数据更简洁 xff0c 更易读 枚举语法定义格式为 xff1a enum 枚举名 枚举元素1 枚举元素2 注意 xff0c 各元素之间用逗号隔开 注意 xff0c 末尾有分号
  • STC-ISP使用指南

    该软件无需安装 xff0c 下载后打开直接用 本软件是专门给STC系列单片机下载烧录程序的 xff0c 并不能适用于ARM系列的单片机 界面介绍 xff1a 打开后的界面如下 xff1a 左边的部分一般是用来下载程序的 xff0c 右面一般
  • STM32前言知识总结

    目录 关于STM32 STM32F1 存储器 位带操作 三种启动模式 低功耗模式 复位 时钟系统 STM32库 仿真器和调试器 注 xff1a 本文大部分内容来自于STMCU官网以及STM32数据手册 STM32使用的是ARM公司的Cort
  • STM32的标准库及其使用

    单片机的开发工作量 xff0c 主要集中在两个地方 xff0c 一是调通各种外设 xff0c 二是实现产品功能 像较高级的语言 xff0c 比如c 43 43 java python等 因为将底层操作进行了封装 xff0c 所以只需要集中关
  • PADS(一)简介、安装与基本使用

    PADS是一款制作PCB板的软件 PADS包括PADS Logic PADS Layout和PADS Router PADSLayout xff08 PowerPCB xff09 提供了与其他PCB设计软件 CAM加工软件 机械设计软件的接
  • 电路中的常见符号总结

    嵌入式如何阅读原理图和数据手册 路溪非溪的博客 CSDN博客 硬件原理图常见缩写 EN xff1a Enable xff0c 使能 CS xff1a Chip Select xff0c 片选 RST xff1a Reset xff0c 重启
  • 嵌入式常见英文2500词总结

    目录 嵌入式硬件常见英文总结 嵌入式软件常见英文总结 电子技术专业英语 嵌入式硬件常见英文总结 block diagram xff0c 框图 figure xff0c 图形 xff0c 图标 processor xff0c 处理器 Mirr
  • 我的2013—弃金融IT,从SAP业务

    我的2013 xff0c 是动荡的一年 xff1b 这一年 xff0c 我跳巢了 xff1b 这一年 xff0c 我换行业了 xff1b 这一年 xff0c 我离开了生活5年的长春 xff0c 来到成都 xff1b 这一年 xff0c 我放
  • STM32实战总结:HAL之电机

    电机基础知识参考 xff1a 51单片机外设篇 xff1a 电机 路溪非溪的博客 CSDN博客 无刷电机和有刷电机 先详细了解有刷电机 xff1a 带你了解 xff08 有刷 xff09 电机工作原理 哔哩哔哩 bilibili 再详细了解
  • F407标准库之时钟系统

    主要参考正点原子数据手册和源码资料等 第19讲 STM32时钟系统精讲 哔哩哔哩 bilibili 此处记录较为重要或者较易出错的一些遗漏之处 xff0c 作为补充 一般而言 xff0c 时钟越高 xff0c 速度越快 xff0c 但同时抗
  • F407标准库之定时器

    主要参考正点原子数据手册和源码资料等 第31 通用定时器基本原理讲解 哔哩哔哩 bilibili 此处记录较为重要或者较易出错的一些遗漏之处 xff0c 作为补充 定时器中断 定时器相关的库函数主要集中在固件库文件 stm32f4xx ti
  • F407标准库之基础知识

    关于STM32的结构体封装 在STM32中 xff0c 有两种容易弄混的结构体封装 第一种是系统对底层寄存器的封装 结构体类型定义好之后 xff0c 是不会分配地址空间的 xff0c 此时只是个类型定义 xff0c 之后使用的时候 xff0
  • c++架构师需要掌握哪些知识

    目录 本文技术梳理主要针对于三类人群的技术需求 c c 43 43 Linux服务器端开发岗位分析 经常被问到的问题 xff1a 技术体系建立的好处 c c 43 43 Linux服务器开发技术学习路径 一 精进基石 二 高性能网络设计 三
  • cmake:使用execute_process调用shell命令或脚本

    CMake可以通过execute process调用shell命令或者脚本 xff0c 其原型如下 xff1a execute process COMMAND lt cmd1 gt args1 COMMAND lt cmd2 gt args
  • 树莓派3B+上安装ubutun mate 18.04.2

    1 准备16G以上储存卡 xff0c 读卡器 2 准备两个软件 xff1a SDCardFormatter Win32DiskImager分别用于储存卡格式化和写入系统文件 链接如下 xff1a 链接 xff1a https pan bai
  • linux应用编程--思维导图

    思维导图软件是xmind 下载源文件点击打开链接
  • 深度学习中Batch、Iteration、Epoch的概念与区别

    在神经网络训练中 xff0c 一般采用小批量梯度下降的方式 Batch Epoch Iteration 就是其中的重要的概念 我们要理解懂得它们都是什么以及它们之间的区别 1 Batch 每次迭代时使用的一批样本就叫做一个Batch xff
  • STM32使用CubeMAX配置的串口中断接收方法

    STM32使用CubeMAX配置的串口中断接收方法 目录 1 定位串口中断发生的地方 2 处理串口中断接收的流程是 xff1a xff08 1 xff09 初始化串口 xff08 2 xff09 在main中第一次调用接收中断函数 xff0
  • SAP 寻找增强点的方法

    SAP中寻找增强的实现方法 SAP 增强已经发展过几代了 xff0c 可参考 SAP 标准教材 BC425 和 BC427 简单的说SAP的用户出口总共有四 代 1 第一代 基于源代码的增强 SAP提供一个空代码的子过程 xff0c 在这个
  • SNMPV3的实现原理

    在snmp发展到V3版本后 xff0c 把snmp的安全性提升到一个新高度 xff0c 这同时也带来了实现上的复杂性 在02年 xff0c 03年我都曾经想进一步的了解它的实现 xff0c 但都没什么进展 这次在实现Csnmp的过程中 xf