View Access Control Model 是 Net-SNMP 提供的更复杂的配置选项之一。
基础知识
检查手册页
snmpd.conf 手册页的 访问控制 部分讨论 VACM 设置,并包含最新信息。 先检查那里。
生活在拒绝中
回应“啊,这对我可怜的小脑袋来说太复杂了!” 我们收到的有关配置访问控制的消息类型,如果需求很简单,可以避免它。 因此,如果只想授予用户对整个 MIB 树的读取或写入权限,可以使用 ro
和 rw
配置选项,它们指定只读 (ro) 或读写 (rw) 访问权限 .
SNMPv1和SNMPv2 rocommunity/rwcommunity
这些指令允许访问基于团体的请求,可选择限制为特定范围的源 IP 地址和/或特定 OID。 有关详细信息,请参见 snmpd.conf 手册页,但一般形式为:
rocommunity COMMUNITY [SOURCE [OID]]
rwcommunity COMMUNITY [SOURCE [OID]]
rocommunity6 COMMUNITY [SOURCE [OID]]
rwcommunity6 COMMUNITY [SOURCE [OID]]
在 5.3 及更高版本中,该指令还可以限制对指定名称的视图的访问,使用语法
rocommunity COMMUNITY SOURCE -V VIEW
rwcommunity COMMUNITY SOURCE -V VIEW
rocommunity6 COMMUNITY SOURCE -V VIEW
rwcommunity6 COMMUNITY SOURCE -V VIEW
SNMPv3 rouser/rwuser
这些指令允许 SNMPv3 用户访问,可选地要求特定的访问级别并将用户限制为特定的 OID。 有关详细信息,请参见 snmpd.conf 手册页,但一般形式为:
rouser USER [noauth|auth|priv [OID]]
rwuser USER [noauth|auth|priv [OID]]
在 5.3 及更高版本中,该指令还可以限制对指定名称的视图的访问,使用语法
rouser USER noauth|auth|priv -V NAME
rwuser USER noauth|auth|priv -V NAME
特殊情况和示例
以下是一些更复杂配置的示例,包括根据 SNMPv3 用户的安全级别支持不同的视图。
VACM 视图,或如何限制对树中特定分支的访问
####
# 首先,将团体名称(COMMUNITY)映射为安全名称
# (local和custom_sec, 取决于请求来自哪里):
# sec.name source community
com2sec local localhost secret42
com2sec custom_sec 192.168.1.0/24 public
####
# 其次,将安全名称映射为组名称:
# sec.model sec.name
group custom_grp v1 custom_sec
group custom_grp v2c custom_sec
group incremental usm myuser # SNMPv3 用户名 == sec.name
####
# 第三,为我们创建一个视图,让组有以下权利:
# incl/excl subtree mask
view all included .1
view custom_v excluded .1
view custom_v included sysUpTime.0
view custom_v included interfaces.ifTable
view mini_view excluded .1 80
view mini_view included sysUpTime.0
view if_view excluded .1 80
view if_view included sysUpTime.0
view if_view included ifTable
####
# 最后,授予组访问其视图的权限:
# context sec.model sec.level match read write notif
access MyRWGroup "" any noauth exact all all none
access custom_grp "" any noauth exact custom_v none none
access incremental "" usm noauth exact mini_view none none
access incremental "" usm auth exact if_view none none
access incremental "" usm priv exact all_view none none
VACM 掩码,或如何限制对表中特定索引(行)的访问
使用 snmpd.conf
中的 view
指令,可以将用户限制在表中的一行。 为此,指定了可选的 mask
参数。 这是手册页的摘录:
view NAME TYPE SUBTREE [MASK]
定义命名视图。 TYPE是`included`或`excluded`。 MASK 是一个十六进制八位列表,用由“.”或“:”分隔。 如果未指定,则 MASK 默认为“ff”。
使用掩码的原因是,它允许以相对简单的方式控制对表中一行的访问。 例如,作为 ISP,您能会考虑让每个客户访问他或她自己的接口:
view cust1 included interfaces.ifTable.ifEntry.ifIndex.1 ff.a0
view cust2 included interfaces.ifTable.ifEntry.ifIndex.2 ff.a0
(interfaces.ifTable.ifEntry.ifIndex.1 == .1.3.6.1.2.1.2.2.1.1.1,
ff.a0 == 11111111.10100000. 它很好地覆盖并包含行索引,但允许用户改变行的字段)
注意:掩码分隔符可以是“.” 或者 ”:”。
因此,为了更直观地了解它:
.1.3.6.1.2.1.2.2.1.1.1 == interfaces.ifTable.ifEntry.ifIndex.1
1 1 1 1 1 1 1 1 1 0 1 (00000) == (ff.a0)
^ ^ ^ ^
| | | |-- the index
| | |---- the column
| |------ ifEntry
|-------- ifTable
因此掩码中的每个位都指示相应的 OID 是否必须匹配。 在上面的示例中,OID 的除列之外的所有部分都必须匹配。 所以这个视图允许访问 ifTable 中第一行的任何列。 因此,与 ifTable 的exclude
行配对时,用户只能访问第 1 行。
现在,将它们与其他访问控制指令结合在一起。 假设有 2 个客户,每个客户只连接到一个特定的接口(例如客户 1 连接到 eth0,客户 2 连接到 eth1):
####
# 首先,将团体名称(COMMUNITY)映射为安全名称
# (local、cust1_sec 和cust2_sec, 取决于请求来自哪里):
# sec.name source community
com2sec local localhost secret42
com2sec cust1_sec 192.168.1.0/24 public
com2sec cust2_sec 192.168.2.0/24 public
####
#其次,将安全名称映射为组名称:
# sec.model sec.name
group MyRWGroup v1 local
group MyRWGroup v2c local
group cust1_grp v1 cust1_sec
group cust1_grp v2c cust1_sec
group cust2_grp v1 cust2_sec
group cust2_grp v2c cust2_sec
####
# 第三,为我们创建一个视图,让组有权:
# incl/excl subtree mask
view all included .1
view cust1_v excluded .1
view cust1_v included sysUpTime.0
view cust1_v included interfaces.ifTable.ifEntry.ifIndex.1 ff.a0
view cust2_v excluded .1
view cust2_v included sysUpTime.0
view cust2_v included interfaces.ifTable.ifEntry.ifIndex.2 ff.a0
####
#最后,授予组访问其视图的权限:
# context sec.model sec.level match read write notif
access MyRWGroup "" any noauth exact all all none
access cust1_grp "" any noauth exact cust1_v none none
access cust2_grp "" any noauth exact cust2_v none none
重要的是要注意这是有效的,因为客户位于不同的网络上。 如果所有客户都在同一个网络上,那么需要注意的是,嗅探网络流量可能会将一个客户的“团体字符串”暴露给另一个客户,从而允许第二个客户通过 SNMP 查看第一个客户的接口统计信息。 在这种情况下,可能希望使用 SNMPv3 usm 用户提供的加密功能,而不是 SNMPv1 和 SNMPv2 团体字符串。
使用上下文
可以为 SNMPv1 和 SNMPv2 团体模拟 SNMPv3“上下文”,如 配置多个代理的此页面 中所述。