配置nagios来监控HA集群(一)

 

首先我们来看一下nagios.cfg文件

Log_file当然是定义日志文件,我们可以看到有好多的cfg_file定义了一些文件路径,而且这些文件都在/usr/local/nagios/etc/etc/objects/文件夹下,我们抽取localhost.cfg文件来查看一下:

我们一段一段的来看,首先是这个文件的说明,告诉我们这个文件是一个简单的配置示例用来监控本地机器,接下来:

这段定义的是本地机器的主机设置,我们可以看到默认的设置都是在本地回环下,接下来:

这段配置是告诉我们本地的组设置

这一段开始定义服务了,被定义的对象是根分区检查,检查check_local_disk后面参数意义是warning小于20% ctritical小于10% /表示根分区

这段是定义当前的用户,warning 当大于20个用户的时候,ctritical当大于50个用户的时候。

这段定义的是总进程数,warning当大于250个进程,critical当大于400个进程。

这一段则是定义负载,具体的负载内容我不太清楚(CUP资源,I/O,还是网络?


这一段定义的是交换分区的使用,当小于20%的空闲空间时候warning

这一段则是SSH的监控,注意的是默认情况下通知是disable的,因为不是所有的用户都把SSH服务打开的。

这段是http服务的设置,还是一样的默认是没有通知的。

nagios的主页上可以发现确实有两个服务被disabled了,点进去瞧一瞧

原来通知被disabled使用一个带叉的喇叭来表示的。。

现在我们来看command.cfg这个文件和这个目录libexec,好熟悉啊,这不正是我们刚刚看到的配置文件里那些带参数的命令么?这就是nagios的有趣之处了,首先在localhost.cfg调用命令,然后在command.cfg里面定义这些命令,而这些命令的执行程序则是放在libexec下面的,而这些libexec就是插件提供的功能。。真是一环套一环。不过这也是linux设计的初衷,由小模块解决小问题,然后组合在一起就解决了大问题。

值得一提的是在objects文件夹下面,按照官网安装的时候让我们修改了其中的一个contact.cfg文件。里面的是用户和用户组的一些配置信息,用里面我们的EMAIL地址来接收警告。

 

在开始真正的监控之前我们在来看下官方文档

Your monitoring box should be viewed as a backdoor into your other systems. In many cases, the Nagios server might be allowed access through firewalls in order to monitor remote servers. In most all cases, it is allowed to query those remote servers for various information. Monitoring servers are always given a certain level of trust in order to query remote systems. This presents a potential attacker with an attractive backdoor to your systems. An attacker might have an easier time getting into your other systems if they compromise the monitoring server first. This is particularly true if you are making use of shared SSH keys in order to monitor remote systems. 

 

Another area of concern is the ability for intruders to sniff monitoring data (status information) as it comes across the wire. If communication channels are not encrypted, attackers can gain valuable information by watching your monitoring information. Take as an example the following situation: An attacker captures monitoring data on the wire over a period of time and analyzes the typical CPU and disk load usage of your systems, along with the number of users that are typically logged into them. The attacker is then able to determine the best time to compromise a system and use its resources (CPU, etc.) without being noticed. 

 

看完这段话不禁吓出了一身冷汗,我们需要监控别的机器就需要获得一定的权限和级别来进入别的主机,这点像一个后门程序,当我的监控主机被人***,就很容易整个网络上的主机被***占据了,例如我们使用共享的SSH keys去完成监控的时候就很可能发生,所以想远程监控别的主机资源这种行为本身是极度不安全的。另一个重要的方面是***者可以通过sniff这种抓包工具去获得我们的监控数据,这些数据对于一次成功的***是致命的,特别是当这些数据在没有加密的情况下,例如***者在进行一段时间的数据收集之后,可以知道CPU和磁盘使用情况,然后用户登录情况,根据这些数据的分析可以选择一个最好的时机去***系统而不被察觉到。

 

那么怎么解决?

 

1. Use a Dedicated Monitoring Box. 利用一个专用的机器去监控,

像这样,将nagios专门放入一台机器运行,然后通过防火墙去监控其他的机器。

2. Don't Run Nagios As Root  这个对于每个服务都是如此,如果需要root权限使用sudo

3. Lock Down The Check Result Directory. 监控结果目录需要设置访问权限,如果其他用户可以进入到这个目录里,就可能发送假的监控数据,制造一些虚假的问题。

4. Lock Down The External Command File首先要给/usr/local/nagios/var/rw目录正确的权限,然后只能rootnagios用户写命令文件。在监控机器上尽可能较少用户数量,运行nagios命令时最好在cgi环境下,而不是用nobody的登录权限。

5. Require Authentication In The CGIs. 登录CGI也就是web界面时候一定要用户验证。这点有很多资料上面都忽略了,这是极度不安全的。

6. Implement Enhanced CGI Security Measures.主要是在登录CGI时候输入的userpassword不要被第三方截取到,要加强登录和输入环境的安全。

7. Use Full Paths In Command Definitions指定绝对路径,在调用命令的时候。

8. Hide Sensitive Information With $USERn$ Macros.还是账户密码信息的使用,不要将账户和密码信息直接写在某个文件处,尽量可能多的使用宏命令像$USER这种变量。

9. Strip Dangerous Characters From Macros.在命令里去除一些特殊的变量或者字符,主要是防止注入式***,很有可能***者敲的一段字符就是一个执行命令,从而打开了一个系统安全后门。

10. Secure Access to Remote Agents不是所有的机器都能去搜集信息,所以防火墙之类的检查工具是保证安全的前提,尽可能的检查nagios使用的监控协议(NRPE,SNMP,NSclinet..

11. Secure Communication Channels 加密,所有的经过的网络上的数据都要进行加密,以防止万一***者截取到数据包不会轻易地获取信息。

 

Additional Techniques

· Stronger Authentication using Digest Authentication. If you have followed the quickstart guides, chances are that you are using Apache's Basic Authentication. Basic Authentication will send your username and password in "clear text" with every http request. Consider using a more secure method of authentication such as Digest Authentication which creates a MD5 Hash of your username and password to send with each request.

· Forcing TLS/SSL for all Web Communication. Apache provides TLS/SSL through the mod_ssl module. TLS/SSL provides a secure tunnel between the client and server that prevents eavesdropping and tampering using strong publickey/privatekey cryptography.

· Locking Down Apache Using Access Controls. Consider locking down access to the Nagios box to your IP address, IP address range, or IP subnet. If you require access outside your network you could use ××× or SSH Tunnels. This is a easy and strong to limit access to HTTP/HTTPS on your system.

CGI的安全措施分为三个步骤:第一步登录的安全验证,user/password的输入不可少;第二步协议的安全,保证每个页面都运行在SSL/TLS协议下;第三步访问控制,主要是对访问的IP地址的过滤。这些在apache配置时候都讲烂了,这里不提。

Nagios的监控分几类我们在上面的图里已经看到了:Windows Server, Linux Server,Netware Server,Cisco Switch,而每类对象所用的协议的都不一样,这里我们用Linux Server来做详细实验:

首先这个逻辑图告诉我们nagios是通过check_nrpe来进行监控的,被监控的机器上需要NRPE模块,此模块提供check_disk还有check_load等功能,通道需要加密。可惜官网的描述让人蛋疼:

[Note: This document has not been completed. I would recommend you read the documentation on the NRPE addon for instructions on how to monitor a remote Linux/Unix server.] 

不说了,先看下官方推荐的NRPE addon这个插件是个什么样的东东

大致的意思就是NRPE是一个插件能在远程linux/unix主机上执行的,如果你需要监控远程主机的CPU负载,内存使用等信息。简单的监控能用check_by_ssh来完成,但是如果有上百或者上千的主机会大大增加CPU的负载。所以我们这里可以看出之前在localhost.cfg里有个服务的定义是ping,所以localhost.cfg文件里面定义的服务不仅仅是本地机器的服务,搜集了一下网上一些资深专家的意见:这里的服务并不是指被监测主机上运行的服务,而是指Nagios 所进行的“各种不同功能的监测”工作,一个监测工作就是一个服务。服务定义段就是要定义Nagios 将进行什么样的监测工作的配置段。而且服务当中也能够定义服务的类,并且类也能继承类,运用比较灵活。

    全部的服务大致可以分为大种:第一种是“本地系统监测服务”,就是监测主机Nagios 所在主机对自己本地的一些情况的监测,比如本地磁盘占用情况,本地CPU 使用情况等等。

第二种是“远程系统监测服务”,就是远程主机系统的内部情况,比如被监测主机的磁盘占用情况,远程主机的CPU 使用情况等等,但是要实现远程系统监测服务,还必须要再安装

NRPE 核心代理的C/S 扩展插件程序(这个以后讲)。第三种服务是“连通检测服务”,就是Nagios 主机到被监测的远程主机当中的一些连通性的监测,比如Ping 操作,指定端口的TCP/UDP 监控,这些服务不需要NRPE 也能够实现。

     我们先不用NRPE来试验下监控结果,也就是上面提到的第三种联通检测服务。首先修改localhost.cfg文件,添加host定义:

然后定义hostgroup

值得一提的是hostgroup里面的members必须要在host里面定义过的主机,最后定义服务:

同样这里的host_name也必须在前面被定义过的。我们重启服务然后再来看:


多出了两台主机,试验成功。现在我们再来开始远程系统监控服务,也就是NRPE。不说什么先看官方文档:

 

又提到了SSHNRPE,说SSHNRPE更安全,但给CPU造成的负担会在监控的两端同时发生,所以总的说来NRPE还是要比SSH消耗资源更低一些

这个内容是关键,很清楚的告诉了我们整个NRPE的工作流程,首先NRPE由两部分组成:check_nrpenrpe服务,然后NRPE的工作流程:首先,nagios执行check_nrpe,告诉它需要监控哪些内容;接下来check_nrpe链接远程主机上的nrpe通过ssl加密后;然后nrpe服务运行nagios插件区检查服务和资源;最后nrpe将结果返回给check_nrpe。值得注意的是:nrpe服务需要nagios插件(之前安装在主机上的),如果没有插件,单凭nrpe是没法进行监控的。

这里有一段假设,就是要告诉我们NRPE服务其实是一个xinetd服务,也就是除了iptablesTCP-wrappers也可以起作用,当然xinetd也是必须被安装的。

第一步:创建用户,和之前安装nagios一样:

第二步:创建安装目录:

第三步:不解释了(这里多说几句,什么GCC GD都是需要提前被安装的。。)

第四步:真不解释了

出错了,提示说没有找到SSLyum  -y install openssl-devel,搞定。

接下来,竟然是xinetd服务,配置当然要去/etc/xinetd.d下解决啊

only_from添加nagiosip地址。

这一段。。。老外太细致了!重启xinetd 服务,然后测试一下:

成功了!

文档接着说要打开防火墙策略等等。

nagios监控主机上安装nrpe,安装完成测试一下:

成功了,下面开始配置远程主机的服务,首先在command.cfg中定义:

接下来在localhost.cfg中把远程主机在文件中定义的主机名重新定义服务,照着模板抄然后命令格式为check_nrpe!check_load这样。。还有use的类要用generic-service

所有配置完毕,node1node2监控条目和状态栏出现了:

 

结束了吗?我刚刚忘了说node1node2分别是集群的两个节点,跑了一个http的服务,用luci的界面来查看下:

可以看到现在http运行在node1上面,那么我要查看http的服务状态是否像我在nagios这台机器上面localhost.cfg文件里定义一条服务监控http就行了呢?我们来试试,在node1/usr/local/nagios/etc/nagios.cfg里添加一条记录:

有人要问了,这里为什么要添加 -H localhost参数?让我们回忆一下在localhost.cfg里定义的命令首先要在command.cfg里进行描述吧?然后最终运行的是libexec目录下的程序吧?好,打开command.cfg找到check_http的定义:

其中$USER1$ 这个变量分别在resouce.cfg里定义了具体值:

所以在NRPE的配置文件里要把路径写全/usr/local/nagios/libexec/check_http,具体参数和参数值什么意思呢?我们执行一下/check_http看下:

不用多解释了吧?其实我们在nrpe.cfg里添加的记录就是相当于在nagios里面command.cfg里添加一条记录。解释到此为止,在localhost.cfg里定义一条http的记录,保存,重启服务再来看下情况如何:

出现了!而且告诉我现在http有问题,警告级别是warning。。。怎么回事呢?呵呵可能大家已经猜到了,和前一篇最后提到的一样,没有index文件,touch一个再看:

OY,这次没问题了。

 

这个实验真是做了一个通宵,走了各种弯路,不过最后还是成功了!感谢nagios提供的官方文档,感谢网友们无私的贡献出自己的学习经验。

 

参考文档:http://hi.baidu.com/kouzl/blog/category/Nagios

          http://nagios.sourceforge.net/docs/3_0/quickstart-fedora.html

          http://nagios.sourceforge.net/docs/nrpe/NRPE.pdf