本文记录是如何配置 Net-SNMP VACM. VACM,即 View Based Access Control.分为两部分: 1. VACM的快速配置 2. VACM的综合配置,该配置能够更加精细地配置用户的访问控制权限.

一、VACM的快速配置

1. SNMPv1 and SNMPv2 rocommunity/rwcommunity

对于SNMPv1和SNMPv2c,对基于COMMUNITY的请求,能够将其访问权限限定在特定的OID树,且将访问来源限定在特定的IP访问内,通常采用如下格式:

1
2
3
4
rocommunity COMMUNITY [SOURCE [OID]]
rwcommunity COMMUNITY [SOURCE [OID]]
rocommunity6 COMMUNITY [SOURCE [OID]]
rwcommunity6 COMMUNITY [SOURCE [OID]]

对于SNMP 5.3及其以上的版本,该指示符也能够将其访问权限限定在特定的视图VIEW中,语法如下:

1
2
3
4
rocommunity COMMUNITY SOURCE -V VIEW
rwcommunity COMMUNITY SOURCE -V VIEW
rocommunity6 COMMUNITY SOURCE -V VIEW
rwcommunity6 COMMUNITY SOURCE -V VIEW

2. SNMPv3 rouser/rwuser

可使用终端命令net-snmp-create-v3-user快速创建用户,这需要root权限,创建完成后,默认情况下该用户能够访问所有的OID树,通常情况下,可使用如下语法修改访问控制权限:

1
2
rouser USER [noauth|auth|priv [OID]]
rwuser USER [noauth|auth|priv [OID]]

对于SNMP 5.3及其以上的版本,该指示符也能够将其访问权限限定在特定的视图VIEW中,语法如下:

1
2
rouser USER noauth|auth|priv -V NAME
rwuser USER noauth|auth|priv -V NAME

二、VACM的综合配置

VACM的配置需要用到四个配置标识符,分别是 com2sec, group, view, access, 这些标识符能够直接配置底层 VACM 表格。下面对这四个标识符进行简要分析。

1. com2sec

1
2
com2sec [-Cn CONTEXT] SECNAME SOURCE COMMUNITY
com2sec6 [-Cn CONTEXT] SECNAME SOURCE COMMUNITY

SECNAME: security name, SNMPv3中 username = security name.

SOURCE: 可以理解为访问者来源地址.可以来自特定范围的源地址,比如一个特定的主机名或者地址,或者使用 IP/MASK(eg. 10.10.10.0/255.255.255.0)或IP/BITS(eg.10.10.10.0/24)表征的子网,也可以使用其默认值(“default”, 表示允许来自任何IP地址的访问).

COMMUNITY: community string, 是 SNMP 管理工作站和 SNMP 代理之间沟通的口令,也就是,如果管理工作站(例如用户)需要从SNMP代理获取需要的信息,则必须指定正确的口令(community string), 不同的SOURCE+COMMUNITY组合可以映射相同的SECNAME.

com2sec, 将 community string 映射到 security name, 可以理解为为用户分配口令。

如果使用标识符-Cn指定特定CONTEXT环境,则COMMUNITY将会映射到已命名的 SNMPv3 CONTEXT, 否则使用默认的CONTEXT("").

2. group

1
group GROUP {v1|v2c|usm} SECNAME

将指定安全模式(v1/v2c/usm)下的SECNAME映射到一个命名用户组(group)。

3. view

1
view VNAME TYPE OID [MASK]

view标识符用于创建一个命名为VNAME的view,即一个 OID 树的子集,通常情况是一单一子树。多个view标识符可以使用同一个VNAME,为其创建复杂的 OIDs 集合,当然每个view标识符需指定不同的OID子树。

TYPE:可以是 included或者excluded,二者配合可以从已具有访问权限的view中排除子view,从而生成复杂的view视图。

MASK的使用见: 对Net-SNMP访问权限控制VACM中mask的理解

4. access

1
access GROUP CONTEXT {any|v1|v2c|usm} LEVEL MATCH READ WRITE NOTIFY

将指定CONTEXT环境中的用户组映射到三类视图(read/write/notify)中,简单点说,就是将上一步中命名的group关联到特定view,确定group中用户的访问权限。

LEVEL: 有 noauth, auth, priv, 分别代表不认证不加密,认证不加密和认证并加密三种等级,且 noauth < auth < priv

MATCH: 指定访问来源 context 实例与 SNMP 坏境名CONTEXT 匹配的方式(exact 或者 prefix)

对于SNMPv1和SNMPv2c, LEVEL等级应设置为 noauth.

5. 实例分析

下面是VACM的实例配置分析,其作用包括可根据SNMPv3用户的不同安全等级限定不同的视图访问权限。

第一步,创建了两个安全名sec.name, 第一个名为local,指定其访问来源为localhost,即本机,其访问口令是secret42;第二个名为custom_sec,其访问来源限定为子网192.168.1.0/24,访问口令是public.

1
2
3
4
5
6
7
8
9
10
11
12
####
# First, map the community name (COMMUNITY) into a security name
# (local and mynetwork, depending on where the request is coming
# from):

# sec.name source community
com2sec local localhost secret42
com2sec custom_sec default public

#createUser username [-e ENGINEID] (MD5|SHA) authpassphrase [DES [privpassphrase]]
#create snmpv3 user
createUser cici MD5 "cicicici" DES "cicicici"

第二步,将安全名sec.name根据不同的安全模型sec.model创建分组

1
2
3
4
5
6
7
8
9
10
11
12
####
# Second, map the security names into group names:

# sec.model sec.name

group MyRWGroup v1 local
group MyRWGroup v2c local

group custom_grp v1 custom_sec
group custom_grp v2c custom_sec

group incremental usm cici

第三步,创建不同的OID视图,即不同的子树。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
####
# Third, create a view for us to let the groups have rights to:

# incl/excl subtree mask
view all included .1

view custom_v excluded .1
view custom_v included sysUpTime.0
view custom_v included hrStorageTable

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

最后,根据不同的安全等级赋予group不同的可访问OID视图

1
2
3
4
5
6
7
8
9
10
11
12
####
# Finally, grant the groups access to their views:

# context sec.model sec.level match read write notif
access MyRWGroup "" v1 noauth exact all none none
access MyRWGroup "" v2c noauth exact if_view none none
access custom_grp "" v1 noauth exact mini_view none none
access custom_grp "" v2c noauth exact custom_v none none

access incremental "" usm noauth exact mini_view none none
access incremental "" usm auth exact custom_v none none
access incremental "" usm priv exact all none none

上面的配置中,本地用户(MyRWGroup)SNMP v1模式下,能够访问所有OID树;在v2c模式下,仅能访问IF-MIB::ifTable中数据. 默认来源用户(custom_grp),即所有用户在SNMPv1模式下仅能得到sysUpTime.0的数据,在SNMPv2c模式下,能够访问sysUpTime.0hrStorageTable中数据; usm模式下,noauth安全等级下,用户(cici)仅能访问sysUpTime.0的数据,auth安全等级下,能够访问sysUpTime.0hrStorageTable数据,priv安全等级下,能够访问所有的OID树。

参考:

  1. Net-SNMP Vacm

  2. SNMPD.CONF man page

  3. VACM (Access Control) configuration