SNMP++ 库忽略 USM 模型并接受每个输入,即使没有身份验证
SNMP++ library ignore USM model and accept every input even without auth
我正在构建一个 C++ 应用程序,其目的之一是接收 SNMP 陷阱。为此,我使用 SNMP++ 库版本 V3.3(https://agentpp.com/download.html C++ APIs SNMP++ 3.4.9)。
如果配置请求某种形式的身份验证,我原以为不使用身份验证的陷阱是 discarded/dropped,但事实并非如此。
为了确认此行为,我使用了 consoleExamples 目录中提供的 receive_trap 示例。我对
的每次通话都发表了评论
usm->add_usm_user(...)
安全名称为“MD5”的除外:
usm->add_usm_user("MD5",
SNMP_AUTHPROTOCOL_HMACMD5, SNMP_PRIVPROTOCOL_NONE,
"MD5UserAuthPassword", "");
然后我使用 net-snmp 向应用程序发送了一个陷阱(匹配“MD5”安全名称):
snmptrap -v 3 -e 0x090807060504030200 -u MD5 -Z 1,1 -l noAuthNoPriv localhost:10162 '' 1.3.6.1.4.1.8072.2.3.0.1 1.3.6.1.4.1.8072.2.3.2.1 i 123456
由于应用程序仅注册用户安全模型需要 MD5 密码,虽然陷阱本来是 refused/dropped/discarded,但事实并非如此:
Trying to register for traps on port 10162.
Waiting for traps/informs...
press return to stop
reason: -7
msg: SNMP++: Received SNMP Notification (trap or inform)
from: 127.0.0.1/45338
ID: 1.3.6.1.4.1.8072.2.3.0.1
Type:167
Oid: 1.3.6.1.4.1.8072.2.3.2.1
Val: 123456
为了确保没有使用“默认”UserSecurityModel,然后我评论了剩余的
usm->add_usm_user("MD5",
SNMP_AUTHPROTOCOL_HMACMD5, SNMP_PRIVPROTOCOL_NONE,
"MD5UserAuthPassword", "");
并使用相同的命令再次发送我的陷阱。这次什么都没发生:
Trying to register for traps on port 10162.
Waiting for traps/informs...
press return to stop
V3 大约有 18k 行 RFC,因此我完全有可能错过或误解了某些内容,但我希望能够指定我期望的安全级别并删除所有不匹配的内容。我错过了什么?
EDIT 使用 SNMPD
进行额外测试
我已经用 SNMPD 做了一些测试,我仍然得到类似的结果。
我已经创建了一个用户:
net-snmp-create-v3-user -ro -A STrP@SSWRD -a SHA -X STr0ngP@SSWRD -x AES snmpadmin
然后我尝试使用 authPriv 密钥:
snmpwalk -v3 -a SHA -A STrP@SSWRD -x AES -X STr0ngP@SSWRD -l authPriv -u snmpadmin localhost
请求被接受
使用 authNoPriv :
snmpwalk -v3 -a SHA -A STrP@SSWRD -x AES -l AuthNoPriv -u snmpadmin localhost
请求被接受
没有AuthNoPriv :
snmpwalk -v3 -a SHA -A STrP@SSWRD -x AES -X STr0ngP@SSWR2D -l noauthnoPriv -u snmpadmin localhost
请求被拒绝。
据我所知,authNoPriv 必须被拒绝,但被接受,这与我在 RFC 和 cisco snmpv3 resume
中阅读的内容不符
免责声明我不是专家,所以对以下内容持保留态度。
我不能说你正在使用的库,但关于 SNMP v3 流程:
在SNMPv3交换中,USM只负责在SNMP权威引擎端的验证,权威角色视种类而定消息。
- 授权代理:GET / SET / TRAP
- 接收者权威:INFORM
RFC 3414 在第 3.2 节中描述了消息的接收:
If the information about the user indicates that it does not
support the securityLevel requested by the caller, then the
usmStatsUnsupportedSecLevels counter is incremented and an error
indication (unsupportedSecurityLevel) together with the OID and value
of the incremented counter is returned to the calling module.
If the securityLevel specifies that the message is to be
authenticated, then the message is authenticated according to the
user’s authentication protocol. To do so a call is made to the
authentication module that implements the user’s authentication
protocol according to the abstract service primitive
因此在第 6 步中,securityLevel 是消息中的级别。这意味着即使未提供身份验证,TRAP 也会被接收方的 USM 层接受。
然后 TRAP 用户的任务是决定是否必须解释消息。
我正在构建一个 C++ 应用程序,其目的之一是接收 SNMP 陷阱。为此,我使用 SNMP++ 库版本 V3.3(https://agentpp.com/download.html C++ APIs SNMP++ 3.4.9)。
如果配置请求某种形式的身份验证,我原以为不使用身份验证的陷阱是 discarded/dropped,但事实并非如此。
为了确认此行为,我使用了 consoleExamples 目录中提供的 receive_trap 示例。我对
的每次通话都发表了评论usm->add_usm_user(...)
安全名称为“MD5”的除外:
usm->add_usm_user("MD5",
SNMP_AUTHPROTOCOL_HMACMD5, SNMP_PRIVPROTOCOL_NONE,
"MD5UserAuthPassword", "");
然后我使用 net-snmp 向应用程序发送了一个陷阱(匹配“MD5”安全名称):
snmptrap -v 3 -e 0x090807060504030200 -u MD5 -Z 1,1 -l noAuthNoPriv localhost:10162 '' 1.3.6.1.4.1.8072.2.3.0.1 1.3.6.1.4.1.8072.2.3.2.1 i 123456
由于应用程序仅注册用户安全模型需要 MD5 密码,虽然陷阱本来是 refused/dropped/discarded,但事实并非如此:
Trying to register for traps on port 10162.
Waiting for traps/informs...
press return to stop
reason: -7
msg: SNMP++: Received SNMP Notification (trap or inform)
from: 127.0.0.1/45338
ID: 1.3.6.1.4.1.8072.2.3.0.1
Type:167
Oid: 1.3.6.1.4.1.8072.2.3.2.1
Val: 123456
为了确保没有使用“默认”UserSecurityModel,然后我评论了剩余的
usm->add_usm_user("MD5",
SNMP_AUTHPROTOCOL_HMACMD5, SNMP_PRIVPROTOCOL_NONE,
"MD5UserAuthPassword", "");
并使用相同的命令再次发送我的陷阱。这次什么都没发生:
Trying to register for traps on port 10162.
Waiting for traps/informs...
press return to stop
V3 大约有 18k 行 RFC,因此我完全有可能错过或误解了某些内容,但我希望能够指定我期望的安全级别并删除所有不匹配的内容。我错过了什么?
EDIT 使用 SNMPD
进行额外测试我已经用 SNMPD 做了一些测试,我仍然得到类似的结果。
我已经创建了一个用户:
net-snmp-create-v3-user -ro -A STrP@SSWRD -a SHA -X STr0ngP@SSWRD -x AES snmpadmin
然后我尝试使用 authPriv 密钥:
snmpwalk -v3 -a SHA -A STrP@SSWRD -x AES -X STr0ngP@SSWRD -l authPriv -u snmpadmin localhost
请求被接受
使用 authNoPriv :
snmpwalk -v3 -a SHA -A STrP@SSWRD -x AES -l AuthNoPriv -u snmpadmin localhost
请求被接受
没有AuthNoPriv :
snmpwalk -v3 -a SHA -A STrP@SSWRD -x AES -X STr0ngP@SSWR2D -l noauthnoPriv -u snmpadmin localhost
请求被拒绝。
据我所知,authNoPriv 必须被拒绝,但被接受,这与我在 RFC 和 cisco snmpv3 resume
中阅读的内容不符免责声明我不是专家,所以对以下内容持保留态度。
我不能说你正在使用的库,但关于 SNMP v3 流程:
在SNMPv3交换中,USM只负责在SNMP权威引擎端的验证,权威角色视种类而定消息。
- 授权代理:GET / SET / TRAP
- 接收者权威:INFORM
RFC 3414 在第 3.2 节中描述了消息的接收:
If the information about the user indicates that it does not support the securityLevel requested by the caller, then the usmStatsUnsupportedSecLevels counter is incremented and an error indication (unsupportedSecurityLevel) together with the OID and value of the incremented counter is returned to the calling module.
If the securityLevel specifies that the message is to be authenticated, then the message is authenticated according to the user’s authentication protocol. To do so a call is made to the authentication module that implements the user’s authentication protocol according to the abstract service primitive
因此在第 6 步中,securityLevel 是消息中的级别。这意味着即使未提供身份验证,TRAP 也会被接收方的 USM 层接受。
然后 TRAP 用户的任务是决定是否必须解释消息。