SNMPv3的加密和認證過程
轉載自:https://blog.csdn.net/qq_28657577/article/details/82257399
USM的定義為實現以下功能:
鑒別
數據加密
密鑰管理
時鍾同步化
避免延時和重播攻擊
1、UsmSecurityParameters(安全參數)
安全參數存在於snmp消息中的msgSecurityParameters字段,以ASN.1語法定義如下:
UsmSecurityParameters ::=
SEQUENCE {
-- global User-based security parameters
msgAuthoritativeEngineID OCTET STRING,
msgAuthoritativeEngineBoots INTEGER (0..2147483647),
msgAuthoritativeEngineTime INTEGER (0..2147483647),
msgUserName OCTET STRING (SIZE(0..32)),
-- authentication protocol specific parameters
msgAuthenticationParameters OCTET STRING,
-- privacy protocol specific parameters
msgPrivacyParameters OCTET STRING
}
msgAuthoritativeEngineID 權威引擎id。請求及inform消息中此值為接收方引擎id。Trap及應答消息中此值為發送方引擎id
msgAuthoritativeEngineBoots 權威引擎已重啟次數
msgAuthoritativeEngineTime 權威引擎發送此消息時的時間
msgUserName 用戶名
msgAuthenticationParameters 消息鑒別代碼
msgPrivacyParameters 用於解密的salt值
2、鑒別和加密的實現
2.1 鑒別
使用MD5或SHA-1作為內嵌安全散列函數,通過HMAC進行鑒別。
從用戶口令到鑒別密鑰產生方法:
假設用戶口令為password,不斷重復串接password必要多的次數達到1048576字節長度。然后通過MD5或SHA-1散列函數得到一個16字節或20字節的密鑰。
鑒別過程:
發送消息時用鑒別密鑰產生一個消息鑒別代碼,並將其填入msgAuthenticationParameters字段。收到一個消息時用發送此消息的用戶對應的鑒別密鑰對消息產生一個消息鑒別代碼,與msgAuthenticationParameters字段中的值進行比較,若相等則認為通過鑒別。
2.2 加密解密
用和產生鑒別密鑰相同的方法從用戶口令生成加密密鑰。
加密過程:
用16字節的加密密鑰的最后8位用作預IV,該引擎的snmpEngineBoots 的當前值(4個字節)和由本地維護的一個4字節整數串連構成一個salt值。由本地維護的這個4字節整數在每次發送消息時應采用不同的值。Salt值和預IV按位異或生成IV,加密密鑰和IV通過DES的CBC加密算法對ScopedPduData字段數據進行加密。並將salt值放入msgPrivacyParameters字段。
解密過程:
從收到的消息中取出msgPrivacyParameters字段內的salt值。用本地維護的16字節的密鑰的最后8位用作預IV,將salt值與預IV按位異或生成IV用密鑰和IV對已加密的數據進行解密。
SNMP學習筆記之SNMPv3的報文格式以及基於USM的認證和加密過程
下面我們就主要講解SNMPv3的報文格式以及基於USM的認證和加密過程!
1、SNMPv3的消息格式
如下圖1:
圖 1
其中,整個SNMPv3消息可以使用認證機制,並對EngineID、ContextName、PDU消息體部分進行加密。RequestID、MaxSize、Flags、SecurityModel、SecurityParameters構成SNMPv3消息頭。
報文中的主要字段定義如下:
RequestID:請求報文的序列號。
MaxSize:消息發送者所能夠容納的消息最大字節,同時也表明了發送者能夠接收到的最大字節數。
Flags:消息標識位,占一個字節。
SecurityModel:消息的安全模型值,取值為0~3。0表示任何模型,1表示采用SNMPv1安全模型,2表示采用SNMPv2c安全模型,3表示采用SNMPv3安全模型。
ContextEngineID:唯一識別一個SNMP實體。對於接收消息,該字段確定消息該如何處理;對於發送消息,該字段在發送一個消息請求時由應用提供。
ContextName:唯一識別在相關聯的上下文引擎范圍內部特定的上下文。
安全參數SecurityParameters又包括以下主要字段:
AuthoritativeEngineID:消息交換中權威SNMP的snmpEngineID,用於SNMP實體的識別、認證和加密。該取值在Trap、Response、Report中是源端的snmpEngineID,對Get、GetNext、GetBulk、Set中是目的端的snmpEngineID。
AuthoritativeEngineBoots:消息交換中權威SNMP的snmpEngineBoots。表示從初次配置時開始,SNMP引擎已經初始化或重新初始化的次數。
AuthoritativeEngineTime:消息交換中權威SNMP的snmpEngineTime,用於時間窗判斷。
UserName:用戶名,消息代表其正在交換。NMS和Agent配置的用戶名必須保持一致。
AuthenticationParameters:認證參數,認證運算時所需的密鑰。如果沒有使用認證則為空。
PrivacyParameters:加密參數,加密運算時所用到的參數,比如DES CBC算法中形成初值IV所用到的取值。如果沒有使用加密則為空。
2、下面根據實際操作,用Wireshark抓取的報文來講解SNMPv3協議的工作的過程:
說明:192.168.2.110是NMS的ip地址,192.168.2.1是Agent的ip地址
(1)由於SNMPv3進行數據交互的過程中要進行加密和認證,所以NMS首先要從Agent獲取AuthoritativeEngineID(標識一個SNMP實體)、AuthoritativeEngineBoots和AuthoritativeEngineTime(同步NMS和Agent時間,保證消息接收的時效性,同時也是用來進行數據認證和加密的參數),如下圖2:
圖 2
(2)Agent回復NMS請求的參數,回復報文如下圖3:
圖 3
(3)NMS繼續向Agent獲取AuthoritativeEngineBoots和AuthoritativeEngineTime參數,如下圖4:
圖 4
(4)Agent對NMS的請求進行響應,如下圖5:
圖 5
(5)下面開始正常數據操作,如下圖6:
圖 6
(6)Agent向NMS響應數據請求,如下圖7,傳輸的數據都進行了加密,可見SNMPv3的安全性:
圖 7