SNMP安全配置的两种方法(也可同时兼顾配置两种方法)


方法一(最简单安装): 安装 Net-SNMP

CentOS及其它RedHat系列产品提供了net-snmp的二进制包。我们可以直接从源里安装。

shell> yum install net-snmp net-snmp-devel net-snmp-utils

说明:net-snmp-devel是为了使用net-snmp-config, net-snmp-utils是为了使用snmpwalk。

配置 Net-SNMP

在笔者的试验环境下,CentOS下的net-snmp无法在selinux环境下正常使用v3。 如果您想使用snmp v3,请先禁用selinux。

shell> net-snmp-config --create-snmpv3-user -ro -A snmp@jiankongbao -a MD5 jiankongbao

以上命令,创建一个snmpv3用户,只读,使用MD5,用户名为jiankongbao,密码为snmp@jiankongbao。

注意:运行之前请先停用net-snmp服务。

shell> service snmpd stop

运行 Net-SNMP

运行 Net-SNMP 服务的方法比较简单,不过Net-SNMP服务的名字是snmpd。

shell> service snmpd start

您可能需要把它加入开机自动运行服务列表。

shell> chkconfig snmpd on

检测 Net-SNMP

我们可以使用 snmpwalk 来检测snmp服务是否正常开启。

shell> snmpwalk -v 3 -u jiankongbao -a MD5 -A "snmp@jiankongbao" -l authNoPriv 127.0.0.1 sysDescr

如果一切正常,就会返回正常结果。 有关snmpwalk的参数说明,请参见其man文档。

配置 防火墙

Net-SNMP 使用 udp 协议,161端口。 同时,我们会从以下三个IP访问您的服务器。

  • 60.195.249.83 自2012年2月21日起监控宝的这个IP不再使用了,如果有用监控宝的用户可以使用下列IP组合

  • 60.195.252.107

  • 60.195.252.110

一个可能的配置文件是:

# iptables -A INPUT -i eth0 -p udp -s 60.195.249.83 --dport 161 -j ACCEPT 自2012年2月21日起,不再使用 iptables -A INPUT -i eth0 -p udp -s 60.195.252.107 --dport 161 -j ACCEPT iptables -A INPUT -i eth0 -p udp -s 60.195.252.110 --dport 161 -j ACCEPT

说明:以上只是一个可能的配置。请您在写之前明白每一句话的含义,而不是直接复制。要不然如果这里异常的出现

-I INPUT -j DROP

时,您就只能哭着骂我了,嘻嘻。

方法二:

二、snmp.conf文件介绍 (/etc/snmp/snmp.conf)

1.常用配置

  community名字都不变,组名字也不变。只加个view的范围,给他配置个权限。

    name   incl/excl  subtree   mask(optional)  view   all   included  .1  80

view    all           included   .1      80

access  notConfigGroup ""      any       noauth    exact  systemview  none none 改为

access  notConfigGroup ""      any       noauth    exact  all  none none

2.详解

#       sec.name  source          community
  com2sec notConfigUser  default       public 

#定义community名称为 public,映射到安全名 notConfigUser。

#       groupName      securityModel securityName
  group   notConfigGroup v1           notConfigUser  

  group   notConfigGroup v2c           notConfigUser

#定义安全用户名notConfigUser映射到notConfigGroup组。

# Third, create a view for us to let the group have rights to:

#定义一个view,来决定notConfigUser可以操作的范围。
  
# Make at least  snmpwalk -v 1 localhost -c public system fast again.

#定义可查看的snmp的范围。
  #       name           incl/excl     subtree         mask(optional)
  view    systemview    included   .1.3.6.1.2.1.1
  view    systemview    included   .1.3.6.1.2.1.25.1.1
# Finally, grant the group read-only access to the systemview view.

#给notConfigGroup组所定义view名 all 以只读权限
#access MyROGroup ""      any       noauth    0      all    none   none

3 配置步骤

 1)首选是定义一个共同体名(community),

这里是public,及可以访问这个public的用户名(sec name),这里是notConfigUser。Public相当于用户notConfigUser的密码:)
  #       sec.name  source          community
  com2sec notConfigUser  default       public

 2)定义一个组名(groupName)

这里是notConfigGroup,及组的安全级别,把notConfigGroup这个用户加到这个组中。
  groupName      securityModel securityName
  group   notConfigGroup   v1           notConfigUser
  group   notConfigGroup   v2c           notConfigUser

 3)定义一个可操作的范围(view)名

这里是all,范围是 .1
  #       name           incl/excl     subtree         mask(optional)
  view  all             included     .1

 4)定义notConfigUser这个组在all这个view范围内可做的操作,这时定义了notConfigUser组的成员可对.1这个范围做只读操作。
  #       group          context sec.model sec.level prefix read   write  notif
  access  notConfigGroup ""      any       noauth    exact  all  none none

ok,这样我们的snmpd.conf文件就基本配成了

启动/关闭 重启:/etc/init.d/snmpd start/stop/restart 

关闭进程:ps aux |grep snmp |grep -v grep |awk '{print $2}' |xargs kill

常见问题

错误1:
# snmpwalk -v 1 -c public localhost system
Cannot find module (IP-MIB): At line 0 in (none)
Cannot find module (IF-MIB): At line 0 in (none)
...
Cannot find module (SNMPv2-TM): At line 0 in (none)
system: Unknown Identifier (Sub-id not found: (top) -> system)
错误2:
qu@ubuntu:~$ snmpwalk -v 2c -c public 192.168.4.12
Timeout: No Response from 192.168.4.12
dunkel :

> The original problem was:
> "However if I run "snmpwalk -v 1 -c public 192.168.1.36 system" on the
> stable box, with 192.168.1.36 the IP address of the testing box, i get:
> Timeout: No Response from 192.168.1.36

> snmpd is up and running, I can ping both ways, there are no firewalls
> in place. What could be wrong?"

> The solution is:
> open snmpd.conf with your favourite editor and
> add these 2 lines:
> interface eth0
> agentaddress [ip address of your host]:[listening port - 161 is the default] 
错误3:
sarge:/# snmpwalk -v 2c -c public localhost
Timeout: No Response from localhost
错误排除:
步骤1:
sarge:/# snmpd -f -Le    
屏幕显示(net-snmpd的log文件中是同样内容)          
Warning: no access control information configured.
It is unlikely this agent can serve any useful purpose in this state.
Run "snmpconf -g basic_setup" to help you configure the snmpd.conf file for this agent.
Error opening specified endpoint "udp:161"
Server Exiting with code 1
新建目录
拷贝现有snmpd.conf 到/root/.snmp/snmpd.conf
步骤2:
snmpd -f -Le -Dread_config 
读配置文件,开头显示了默认的配置文件的路径。
sarge:/# snmpd -f -Le -Dread_config
read_config: reading premib configuration tokens
read_config: config path used: /nfsroot/cq8401/bin/net-snmp/etc/snmp:/nfsroot/cq8401/bin/net-snmp/sh
are/snmp:/nfsroot/cq8401/bin/net-snmp/lib/snmp:/root/.snmp:/var/net-snmp

中间显示了配置文件的内容。
首先查看在默认配置文件的路径中是否有你的配置文件。
如果有,再在配置文件中配置权限。
小技巧:可以使用snmpd -f -Le -Dread_config 命令来查看日志文件信息,排错。
snmpd命令的有用选项:
-c FILE                指定文件为配置文件
-C                     不读取默认的配置文件
-d                     dump接收和发送SNMP数据包
-D TOKEN               对于给定的TOKEN(标志)打开调试信息   ( -Dmib_init)
-I [-]INITLIST    对于要初始化的MIB列表显示
-M DIRLIST        指定MIB库的路径
-V                显示详细信息
-Le                     把错误信息输出到日志中
-Lf FILE                 把错误信息输出到指定文件中
-m MIBLIST        use MIBLIST instead of the default MIB list

也许在执行第四不步make后,过了一会儿程序退出,并提示一下错误:

Grep /usr/lib/libbeecrypt.la: No such file or directory
/bin/sed: can't read /usr/lib/libbeecrypt.la: No such file or directory
libtool: : `/usr/lib/libbeecrypt.la' is not a valid libtool archive
make[1]: *** [libnetsnmpmibs.la] Error 1
make[1]:Leavingdirectory /email/share/ceno_soft/net-snmp-5.4.1/agent'

make: *** [subdirs] Error 1

解决方法

说明缺少libbeecrypt.la ,libbeecrypt.so等共享库

如果确认系统中有libbeecrypt.la,也许他安装在/usr/local下面,可尝试:

ln -s /usr/local/lib/libbeecrypt.la /usr/lib/libbeecrypt.la

如果/usr/local下面没有,那么你必须安装beecrypt

下载路径http://nchc.dl.sourceforge.net/sourceforge/beecrypt/beecrypt-4.1.2.tar.gz

解压并安装到/usr目录下:

tar -zxvf beecrypt-4.1.2.tar.gz

./configure -prefix=/usr

#默认是安装在/usr/local,我们需要安装在/usr目录下。如果没有加这个参数需要做连接

ln -s /usr/local/lib/libbeecrypt.la /usr/lib/libbeecrypt.la

编译并安装beecrypt库,先执行make编译源码包文件编译成功后执行安装命令make install,其命令如下:

#make

 #make install

好,beecrypt安装完成后,我们继续NET-SNMP的编译,执行一下make 命令。

当我们继续make的时候,第一个错消逝了,但不幸的是出现了一个新的错误,错误提示如下:rpath -Wl,/usr/local/lib

/usr/bin/ld: cannot find –lelf

collect2: ld returned 1 exit status

make[1]: *** [snmpd] Error 1 make[1]: Leaving directory `/local/akazam/cacti/bak/net-snmp-5.4.2/agent'

make: *** [subdirs] Error 1

ke[1]: Leaving directory `/local/akazam/cacti/bak/net-snmp-5.4.2/agent

make: *** [subdirs] Error 1

解决方法

执行命令: ln -s /usr/lib/libelf.so.1  /usr/lib/libelf.so

测试SNMP
1.查看端口是否打开

netstat -ln | grep 161

2.安装SNMP测试工具

yum install net-snmp-utils

3.本机测试SNMP数据(修改meidahua为配置的团体名(Community))

snmpwalk -v 2c -c meidahua localhost system

4.远程测试SNMP数据(修改ip为服务器ip,snmpwalk命令需要安装net-snmp)

snmpwalk -v 2c -c meidahua ip system

或者可以使用方法一中的 snmpwalk snmp账户密码 登录 来检测snmp服务是否正常开启,IP切换成实际IP即可。

shell> snmpwalk -v 3 -u jiankongbao -a MD5 -A "snmp@jiankongbao" -l authNoPriv 127.0.0.1 sysDescr

错误排除
防火墙禁止访问
如果本地测试SNMP有数据,远程测试SNMP无数据则由于服务器防火墙禁止了外部访问服务器udp 161端口,则:
修改 /etc/sysconfig/iptables (或者:/etc/sysconfig/iptables-config ) ,增加如下规则:

限制只允许特定IP访问使用如下修改方式:

# iptables -A INPUT -i eth0 -p udp -s 60.195.249.83 --dport 161 -j ACCEPT 自2012年2月21日起,不再使用 iptables -A INPUT -i eth0 -p udp -s 60.195.252.107 --dport 161 -j ACCEPT iptables -A INPUT -i eth0 -p udp -s 60.195.252.110 --dport 161 -j ACCEPT 不限制IP泽使用下列方式修改防火墙

-A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 161 -j ACCEPT

重启iptables

/etc/init.d/iptables restart

SNMP端口安全配置-修改默认端口:

最简单的实现如下:

/usr/sbin/snmpd tcp:端口号 或/usr/sbin/snmpd udp:端口号

或vi /etc/rc.d/init.d/snmpd

修改前 OPTIONS="-Lsd -Lf /dev/null -p /var/run/snmpd.pid -a"

修改后 OPTIONS=" tcp:9999 -Lsd -Lf /dev/null -p /var/run/snmpd.pid -a"

/etc/rc.d/init.d/snmpd start就行了。

Linux SNMP安全加固设置

以下的示例采用SUSE10 Linux环境,但它同样适用于其它Linux发行版。

编译和安装

首先我们需要下载Net-SNMP的源代码,选择一个版本,比如5.7.1,地址如下:

http://sourceforge.net/projects/net-snmp/files/net-snmp/5.7.1/

接下来对下载的源代码包进行解压缩,如下:

suse10:~ # tar xzvf net-snmp-5.7.1.tar.gz

然后通过configure来生成编译规则,如下:

suse10:~ # cd net-snmp-5.7.1 suse10:~ # ./configure --prefix=/usr/local/snmp --with-mib-modules=ucd-snmp/diskio

注意,以上的

--with-mib-modules=ucd-snmp/diskio

选项,可以让服务器支持磁盘I/O监控。

接下来,开始编译和安装:

suse10:~ # make suse10:~ # make install

到现在为止,我们已经有了可以运行的SNMP代理程序,它位于/usr/local/snmp/sbin/snmpd,在启动它之前,我们还要进行一些必要的设置。

设置安全的验证方式

将SNMP代理程序暴露给网络上的所有主机是很危险的,为了防止其它主机访问你的SNMP代理程序,我们需要在SNMP代理程序上加入身份验证机制。SNMP支持不同的验证机制,这取决于不同的SNMP协议版本,监控宝目前支持v2c和v3两个版本,其中v2c版本的验证机制比较简单,它基于明文密码和授权IP来进行身份验证,而v3版本则通过用户名和密码的加密传输来实现身份验证,我们建议使用v3,当然,只要按照以下的介绍进行配置,不论是v2c版本还是v3版本,都可以保证一定的安全性,你可以根据情况来选择。

注意一点,SNMP协议版本和SNMP代理程序版本是两回事,刚才说的v2c和v3是指SNMP协议的版本,而Net-SNMP是用来实现SNMP协议的程序套件,目前它的最新版本是刚才提到的5.4.2.1。

v2c

先来看如何配置v2c版本的SNMP代理,我们来创建snmpd的配置文件,默认情况下它是不存在的,我们来创建它,如下:

suse10:~ # vi /usr/local/snmp/share/snmp/snmpd.conf

然后我们需要创建一个只读帐号,也就是read-only community,在snmpd.conf中添加以下内容:

# rocommunity jiankongbao 60.195.249.83 自2012年2月21日起,此ip不再使用 rocommunity jiankongbao 60.195.252.107 rocommunity jiankongbao 60.195.252.110 # 如果您使用的是插件 此处的ip 应该安装采集器的机器的ip

注意:添加用户时,请确保snmp服务没有运行,否则无法添加。

注意,这里的“rocommunity”表示这是一个只读的访问权限,监控宝只可以从你的服务器上获取信息,而不能对服务器进行任何设置。

紧接着的“jiankongbao”相当于密码,很多平台喜欢使用“public”这个默认字符串。这里的“jiankongbao”只是一个例子,你可以设置其它字符串作为密码。

最右边的“60.195.249.83,60.195.252.107,60.195.252.110”代表指定的监控点IP,这些IP地址是监控宝专用的监控点,这意味着只有监控宝有权限来访问你的SNMP代理程序。

所以,以上这段配置中,只有“jiankongbao”是需要你进行修改的,同时在监控宝上添加服务器的时候,需要提供这个字符串。

v3

当然,我们建议您使用v3版本来进行身份验证。对于一些早期版本的Linux分发版,其内置的SNMP代理程序可能并不支持v3,所以我们建议您按照前边介绍的方法,编译和安装最新的Net-Snmp。

v3支持另一种验证方式,需要创建一个v3的帐号,我们同样修改以下配置文件:

suse10:~ # vi /usr/local/snmp/share/snmp/snmpd.conf

然后添加一个只读帐号,如下:

rouser jiankongbao auth

注意:添加用户时,请确保snmp服务没有运行,否则无法添加。

可以看到,在v3中,“rouser”用于表示只读帐号类型,随后的“jiankongbao”是指定的用户名,后边的“auth”指明需要验证。

接下来,我们还要添加“jiankongbao”这个用户,这就是v3中的特殊机制,我们打开以下配置文件:

suse10:~ # vi /var/net-snmp/snmpd.conf

这个文件会在snmpd启动的时候被自动调用,我们需要在它里边添加创建用户的指令,如下:

createUser jiankongbao MD5 mypassword

这行配置的意思是创建一个名为“jiankongbao”的用户,密码为“mypassword”,并且用MD5进行加密传输。这里要提醒的是:

密码至少要有8个字节

这是SNMP协议的规定,如果小于8个字节,通信将无法进行。

值得注意的是,一旦snmpd启动后,出于安全考虑,以上这行配置会被snmpd自动删除,当然,snmpd会将这些配置以密文的形式记录在其它文件中,重新启动snmpd是不需要再次添加这些配置的,除非你希望创建新的用户。

以上配置中的用户名、密码和加密方式,在监控宝添加服务器的时候需要添加。

启动SNMP代理程序

经过配置后,现在可以启动snmpd,如下:

/usr/local/snmp/sbin/snmpd

如果要关闭,则可以直接kill这个进程,如下:

killall -9 snmpd

增强的安全机制

有了以上的验证机制,你就可以放心的使用SNMP代理了。但是,如果你的SNMP代理程序版本较低,可能会有一些别有用心的破坏者利用一些固有的漏洞进行破坏,比如发送较长的数据导致SNMP代理程序内存泄漏或者拒绝服务等,为此,你还可以使用防火墙(iptables)来进行增强的安全过滤。

在Linux中,我们用iptables来实现防火墙,一般情况下,除了流入指定端口的数据包以外,我们应该将其它流入的IP数据包抛弃。你可能已经配置了一定的防火墙规则,那么只要增加针对SNMP的规则即可。

SNMP代理程序默认监控在udp161端口,为你的iptables增加以下规则:

# iptables -A INPUT -i eth0 -p udp -s 60.195.249.83 --dport 161 -j ACCEPT 自2012年2月21日起,不再使用 iptables -A INPUT -i eth0 -p udp -s 60.195.252.107 --dport 161 -j ACCEPT iptables -A INPUT -i eth0 -p udp -s 60.195.252.110 --dport 161 -j ACCEPT

以上设置中假设服务器外网网卡是eth0,你可以根据实际情况来修改。

这样一来,只有监控宝的专用监控器可以发送UDP数据包到你的服务器的161端口,与SNMP代理程序进行通信。

相关内容