本文记录的是对 Net-SNMP 中 VACM mask 的理解,VACM 即 View Based Access Control 的缩写,其用于控制用户访问设备 MIB 树的权限。

在snmpd.conf 中使用 view 标识符加以 mask 参数,能够将用户的访问权限控制在 MIB Table 中的某一特定行,下面是 man page 中的摘要:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
view NAME TYPE SUBTREE [MASK]

The defines the named view. TYPE is either included or excluded.
MASK is a list of hex octets, separated by '.' or ':'. The MASK
defaults to "ff" if not specified.

The reason for the mask is, that it allows you to control access
to one row in a table, in a relatively simple way. As an
example, as an ISP you might consider giving each customer
access to his or her own interface:

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. which nicely covers up and including
the row index, but lets the user vary the field of the row)

文档中指出:

  1. mask 是使用 . 或者 : 分隔的十六进制数
  2. 在未指定的情况下,mask 的默认值是 ff
  3. mask 的主要作用是使你能够限制用户只允许访问 OID 表中的某一行数据

针对以上的帮助文档,下图能够更加形象化的理解 mask 的作用:

VACM mask分析
VACM mask分析

mask 中的每一 bit 都指示 OID 树对应的层级的访问权限,1 表示可访问,0表示不可访问。在上面的例子中,view cust1 允许用户访问 ifTable中第一行的所有列内容, 也就是 ifTable 表中第一行实例内容。

首先,设置用户可以访问设备的所有 OID,在终端上使用命令查看能获取的数据,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MacBook-Pro:gitblog carya$ snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.2.2.1.1
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifIndex.4 = INTEGER: 4
IF-MIB::ifIndex.5 = INTEGER: 5
IF-MIB::ifIndex.6 = INTEGER: 6
IF-MIB::ifIndex.7 = INTEGER: 7
IF-MIB::ifIndex.8 = INTEGER: 8
IF-MIB::ifIndex.9 = INTEGER: 9
IF-MIB::ifIndex.10 = INTEGER: 10
MacBook-Pro:gitblog carya$ snmpget -v 2c -c public localhost .1.3.6.1.2.1.2.2.1.1.1
IF-MIB::ifIndex.1 = INTEGER: 1
MacBook-Pro:gitblog carya$ snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.2.2.1.1.2
IF-MIB::ifIndex.2 = INTEGER: 2

上面的结果显示,用户可以获取 ifTable 中所有的 colum 内容,而当我们定义上例所示的 view:

1
view cust1 included .1.3.6.1.2.1.2.2.1.1.1 ff.a0

并将用户的访问控制权限限定在 view cust1 中,再次使用上面的命令测试,结果如下:

1
2
3
4
5
6
MacBook-Pro:gitblog carya$ snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.2.2.1.1
IF-MIB::ifIndex.1 = INTEGER: 1
MacBook-Pro:gitblog carya$ snmpget -v 2c -c public localhost .1.3.6.1.2.1.2.2.1.1.1
IF-MIB::ifIndex.1 = INTEGER: 1
MacBook-Pro:gitblog carya$ snmpget -v 2c -c public localhost .1.3.6.1.2.1.2.2.1.1.2
IF-MIB::ifIndex.2 = No Such Object available on this agent at this OID

从上面的结果可以看出,此时只能获取 ifTable 的第一行的 colum 内容。用户也可以直接使用如下命令查看结果验证:

1
MacBook-Pro:gitblog carya$ snmptable -v 2c -c public localhost ifTable

本文参考了 Net-SNMP官网VACM文档, 可直接点击查看。