SNMP 學習中篇 v3 版本使用

2021-09-29 21:00:46 字數 3219 閱讀 4248

snmp v3 版本是一種安全的協議,支援認證和加密過程,前面實現了 v1、v2 版本獲取路由器 arp 表的過程,這裡繼續完善一下 v3 版本的支援。v3 版本的特點是,增加了帳號密碼認證和加密傳輸,所以需要安全方面的配置資訊,詳情如下。

根據 snmpwalk 命令的幫助文件可知,v3 版本的協議引數選項有:

a) –l level 指定安全級別:noauthnopriv|authnopriv|authpriv

b) –u user-name 安全名字

c) –a protocol 驗證協議:md5|sha。如果 -l 指定為 authnopriv 或 authpriv 時才需要。

d) –a passphrase 驗證字串。如果-l指定為 authnopriv 或 authpriv 時才需要。

e) –x protocol 加密協議:des|aes。如果 -l 指定為 authpriv 時才需要。

f) -x passphrase 加密字串:如果-l指定為 authpriv 時才需要。

第乙個選項,安全級別型別,其區別為:

noauthnopriv:不認證、不加密,等價於 v1、v2 版本;所以不建議開啟

authnopriv:認證不加密,只對帳號密碼進行校驗,資料傳輸不加密

authpriv:既認證又加密,校驗帳號密碼,同時加密傳輸

曾研究過瀏覽器實現 https 協議的過程,所以很容易理解 v3 版本中的安全配置選項。在需要管理的裝置上配置 snmp v3 服務時,需設定這些安全配置資訊,包括帳號、密碼、認證方式、加密演算法、加密金鑰,然後將這些資訊告知 snmp 服務角色,雙方基於此前提進行 snmp 通訊。

先看看 -a 選項,它是指驗證協議,演算法有 md5 和 sha 。

md5 是指 message digest ,sha 是 security hash ,它們都屬於摘要演算法,即:不限制輸入的明文長度,而生成固定長度的摘要,且不可逆。摘要演算法常用來做數字簽名的,在 v3 協議中,用來做密碼認證。

原理為,snmp 服務端和**端都知道乙個帳號和密碼,然後通訊時,服務端傳送 v3 請求並用 md5 或 sha 摘要演算法生成密碼摘要傳送,snmp **端用同樣的摘要演算法生成密碼的摘要資訊,與接收到的摘要比對,一致,則通過認證。

-x 選項,加密演算法有兩種,aes(advanced encrypt stnadard) 和 des ( data encryption standard ),它們都是對稱加密演算法,通訊雙方約定相同的金鑰後,就能進行加密和解密了。

snmp4j 工具包的官方文件中給出了snmp類實現 v3 版本的示意**,與 v2 版本不同的是,它使用的atarget的實現是usertarget類,並設定安全等級。

第一步,先建立 target

usertarget target = new usertarget();

target.setversion(snmpconstants.version3);

target.setaddress(new udpaddress(snmpinfo.getip()+"/"+snmpinfo.getport()));

switch (snmpinfo.getlevel())

target.settimeout(3000); //3s

target.setretries(2);

第二步,建立snmp物件:

transport.listen();

snmp manager = new snmp(transport);

經過測試,只支援 udp 協議,tcp 協議貌似不支援。

第三步,新增認證使用者資訊:

//獲取摘要演算法對應的 oid 物件

oid authprotocol = null;

string signaturetype = snmpinfo.getauthprotocol();

if(signaturetype.equals(signature_md5)) else if(signaturetype.equals(signature_sha))

//獲取加密演算法對應的 oid 物件

oid encryptprotocol = null;

string encrypttype = snmpinfo.getencrypttype();

if(encrypttype.equals(encrypt_des)) else

}//建立使用者安全模型物件

usm usm = new usm(securityprotocols.getinstance(),

new octetstring(mpv3.createlocalengineid()), 0);

securitymodels.getinstance().addsecuritymodel(usm);

//新增使用者配置資訊

usm.adduser(new octetstring(snmpinfo.getaccount()),

new usmuser(new octetstring(snmpinfo.getaccount()), authprotocol,

new octetstring(snmpinfo.getpassword()), encryptprotocol,

new octetstring(snmpinfo.getprivatekey())));

snmpinfo是乙個儲存了 v3 配置資訊的實體,類的屬性有:

ip:snmp 管理裝置 ip

port:通訊埠,預設 161

level:安全等級

account:帳號

password:口令

authprotocol:摘要演算法

encrypttype:加密演算法

privatekey:加密金鑰

前面三部分合起來,就是乙個完整的基於 snmp4j 工具包提供的 v3 版本的例子了。開始對官方給出的例子不是很明白,因為只是**片段,也沒有完整的引數說明,官網文件開著三天,因為沒搞明白,沒敢關。

轉機發生在分析過 v3 協議的配置資訊後,再對比 demo ,突然就知道了 v3 版本的配置資訊對應什麼引數了,這可能就是傳說中的頓悟吧,就這樣解決了 snmp 版本的支援!

謹以此文,記錄此過程。

區塊鏈V3版本實現思路

當前版本問題 區塊在記憶體中,每次執行完程式就釋放,無法重用 建立區塊不靈活,在main中寫死,無法隨意新增區塊 v3版本思路 bolt資料庫介紹 輕量級 開源 go語言實現 key value進行讀取 map byte byte blockchain結構重寫 newblockchain函式重寫 由...

區塊鏈V3版本實現之六

命令列demo 1 package main23 import 4 fmt 5 os 6 78func main 16 顯示效果 使用命令列分析 所有的支配動作交給命令列來做 主函式只需要呼叫命令列結構即可 根據輸入的不同命令,命令列做相應動作 a addblock b printchain cli...

區塊鏈V3版本實現之四

部分 blockchain.go檔案中改寫addblock函式 1 v3版本 2 func bc blockchain addblock data string 12 block newblock data,bc.tail 13 b.put block.hash,block.serialize 將區...