rsyslog+LogAnalyzer展示+cacti-syslog插件
https://blog.51niux.com/?id=108 已经讲述了rsyslog如何做日志服务器,并如何将收集到的日志存放到指定的目录里面。这里呢主要分三部分记录,第一部分是rsyslog如何将日志写到mysql里面去。第二部分是LogAnalyzer搭建以及展示数据。第三部分也是最主要的就是通过rsyslog来收集交换机的信息并进行报警。
一、rsyslog将日志写到mysql数据库中。
1.1 数据库的操作
#yum install httpd php mysql-server php-mysql php-gd rsyslog-mysql –y
# /etc/init.d/mysqld start
# cd /usr/share/doc/rsyslog-mysql-5.8.10/
# mysql -uroot -p<createDB.sql
# mysql
mysql> use Syslog;
mysql> grant all on Syslog.* to rsysloguser@'192.168.1.%' identified by 'rsyslog123';
mysql> grant all on Syslog.* to rsysloguser@'127.0.0.1' identified by 'rsyslog123';
mysql> flush privileges;
1.2 rsyslog.conf的操作
# cat /etc/rsyslog.conf
$ModLoad ommysql #加载支持mysql的模块
*.* :ommysql:192.168.1.101,Syslog,rsysloguser,rsyslog123 #书写格式为facility.priority :ommysql:SERVER_IP,DATABASE,USERNAME,PASSWORD
# service rsyslog restart
1.3 观察测试
因为上面我们是所有的信息都往mysql的表里面写,所以通过重启sshd服务等,通过mysql查询表,会发现是有日志增加的,可以自行测试查看。
mysql> select * from SystemEvents\G
前面已经说过了rsyslog怎么收集客户端的日志,那么其他的客户端的日志也会传到mysql数据库中的。
博文来自:www.51niux.com
二、LogAnalyzer的搭建部署
首先说一下,这个软件就属于将rsyslog收集到服务器的mysql里面,然后通过php调用展示。
一般情况下呢,我们可以将交换机的信息写入到rsyslog服务器的数据库里面,然后通过php程序来展示,这样交换机的相关信息我们能够很直观的来进程查看。
以华为交换机举例:
info-center loghost rsyslog服务器的IP地址 facility #这里是选择默认的local级别,当然也可以后面加local0-7来指定
info-center loghost source Vlanif2 #这里表示从vlan2发出去,如果你划了vlan的话
下面是rsyslog服务器端要做的设置(上面一已经讲述了如果将收集到的日志写入到数据库里面,这里记录的是如何安装图形化软件来展示):
# wget download.adiscon.com/loganalyzer/loganalyzer-3.6.6.tar.gz
# tar zxf loganalyzer-3.6.6.tar.gz
# cp -rf /tools/loganalyzer-3.6.6/src /var/www/html/syslog
# touch /var/www/html/syslog/config.ph
# chmod 666 /var/www/html/syslog/config.php
# mysql -uroot -p -e "create database loganalyzer;
# mysql -uroot -p -e "grant all privileges on loganalyzer.* to sysloguser@'localhost' identified by 'syslogpass';"
# mysql -uroot -p -e "flush privileges;"
下面访问URL:IP/syslog进行图形化操作:
这就是写PHP然后去掉数据库里面的信息然后呈现出来,方便我们比较直观的来查看记录。左上角的search联合条件查询和,Statistics图形展示也是很好的。
三、做交换机的错误报警
之前已经说过了,还有其他的日志收集工具能够更好的做系统日志的收集分析工具,而交换机发送日志相对简单一点,上面已经展示了。
如何做交换机的报警呢?首先可能想到的是,既然我们可以让rsyslog服务器不同的来源IP做不同的文件存储。类似于下面的设置方式:
$template Remote,"/rsyslog/data/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
:fromhost-ip, !isequal, "127.0.0.1" ?Remote
& ~
既然文件有了,信息也有了,那么问题就简单了,我们就自己做个脚本,去指定的目录里面去过滤信息白,如果有我们设置好的信息,如登录错误啊,端口DOWN啊等一些比较敏感的信息,那么就报警出来就好了。
这是一个思路,脚本就不贴了,大家可以根据实际情况来写这个脚本,如果觉得这样比较灵活的话。
博文来自:www.51niux.com
四、cacti-syslog插件做交换机日志的收集操作
https://blog.51niux.com/?id=65 这里记录了cacti的搭建安装,这里就不累述了。
4.1 cacti-syslog插件的安装
mysql的设置:
mysql> create database cactisyslog;
mysql> grant all on cactisyslog.* to cactiuser@'localhost' identified by 'cactiuser';
mysql> flush privileges;
# mysql -uroot -p cactisyslog </var/www/html/cacti/plugins/syslog/syslog.sql
syslog插件的设置:
# cat /var/www/html/cacti/plugins/syslog/config.php
$use_cacti_db = false; #默认是true,这是设置成false,是为了不使用cacti的数据库,syslog日志比较多,我们独立使用一个数据库
$syslogdb_default = 'cactisyslog'; #这里就是我们创建的数据库的名称
rsyslog服务器的设置:
#cat /etc/rsyslog.conf #基本你去搜索都是这种写法,因为syslog插件官网上面也是这么写的,也不能说是错,等会出效果展示说明一下。
$template cacti_syslog,"INSERT INTO syslog_incoming(facility, priority, date, time, host, message) values ('%syslogfacility%', '%syslogpriority%', '%timereported:::date-mysql%', '%timereported:::date-mysql%', '%fromhost-ip%', '%msg%')", SQL
*.* >localhost,syslog,cactiuser,cactiuser;cacti_syslog
#这个结构就是,定义了一个模板cacti_syslog,然后默认的内容就是向syslog_incoming表插入内容,字段就是facility, priority, date, time, host, message对应的就是变量,SQL表示是SQL语句。
*.*就是所有的信息,>写入到,localhost表示本地,cactisyslog表示是cactisyslog库,cactiuser,cactiuser;用户名,密码;cacti_syslog模板
# service rsyslog restart
cacti的设置:
查看是否成功:
# /etc/init.d/sshd restart #随便执行一个服务重启
mysql> select * from syslog_incoming; #然后查看这个表。这个表就是先数据存到里面,就相当于一个临时表,数据等着被拿走。
4.2 cacti-syslog的隐身操作
#这种问题就导致了,cacti的过滤是根据warning啊这种来过滤的,你全是数字没法过滤。然后呢日志级别全是数字,没法显示颜色啊,不好判断啊。再次呢报警设置,报警报出来的级别也是数字。
下面让我们来调整一下。
首先是rsyslog.conf 的设置:
# cat /etc/rsyslog.conf
$template cacti_syslog,"INSERT INTO syslog_incoming(facility, priority, date, time, host, message) values ('%syslogfacility-text%', '%syslogseverity-text%', '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', '%fromhost-ip%', '%msg%')", SQL
*.* >localhost,syslog,cactiuser,cactiuser;cacti_syslog
#主要是'%syslogfacility-text%', '%syslogseverity-text%',这两个地方发生了变化
#'%timegenerated:::date-mysql%' #这里也很重要,如果你是像我一样只做交换机日志的收集,实际使用过程中,交换机虽然设置成了utc时区,但是不管是思科的还是华为的发过来的时间都比现在的时间少8个小时,用默认的格式收集日志,时间也是-8小时,感觉是硬件时间不对导致发送的日志时间减8,思科的交换机硬件时间是不能改的。所以我这里采用了日志报告的时间。
# service rsyslog restart
然后再次查看:
#从结果看,输出的信息已经发生了变化,颜色也出现了。
延伸一下,从上面的图也可以看出来,我们还在接受本地的一些信息,不说别的,cacti要加一个脚本放到定时任务里面,我们设置的是1分钟一次,还有其他的信息。当然还会有其他的信息也都记录在数据库里面,这样web显示的时候可能会感觉有点不太好而且记录的信息也不够精准。因为我们只是做所有交换机日志的收集,而这里却掺杂了好多本地的日志记录。下面我们搞一搞:
#cat /etc/rsyslog.conf
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$template mySource,"%timestamp% %FROMHOST-IP% %syslogtag% %msg%\n"
$ActionFileDefaultTemplate mySource
$template cacti_syslog,"INSERT INTO syslog_incoming(facility, priority, date, time, host, message) values ('%syslogfacility-text%', '%syslogseverity-text%', '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', '%fromhost-ip%', '%msg%')", SQL
:fromhost-ip, !isequal, "127.0.0.1" >localhost,cactisyslog,cactiuser,cactiuser;cacti_syslog
#这样 最下面一行我们稍作修改,让来源IP是127.0.0.1的不插入到数据库里面
#这是运行了一段时间之后的效果图
五、cacti-syslog插件做日志报警设置
5.1 cacti的Mail/DNS报警邮箱设置就不累述了。
5.2 日志报警设置
#然后就会进入到添加界面,点击右上角的Add.
下面为报警的格式:
----------------------------------------------- WARNING: A Syslog Plugin Instance Count Alert has Been Triggered Name: IP_attack Severity: Warning Threshold: 1 Count: 1 Message String: The specified source IP address attack occurred ----------------------------------------------- Hostname : 182.118.22.1 Date : 2017-04-21 17:38:30 Severity : Warning Priority : warn Message : The specified source IP address attack occurred.(Slot=MPU, SourceAttackIP=182.118.22.132, AttackProtocol=TCP, AttackPackets=85 packets per second) -----------------------------------------------
#当然也可以整恢复报警,报警级别就变成Notice就行了,然后有其他交换机报警需要,如登录错误报警,端口Down报警等,制作对应的报警模板了,根据自己的需求来。
#或者如下面,交换机账户登录出问题的报错:
5.3 不记录那些信息设置
#还是进入一个界面之后右上角的Add按钮,然后弹出下面的界面。
#然后你可以观察,syslog页面关于“Some packets are dropped because an attack is detected.”这个关键字的记录之前的是会有的,但是之后不会再出现了。
5.4 Syslogs,Statistics,Aleert Log的使用
Syslogs:
主要是两个功能,一个是可以根据IP,时间,日志级别,设备等,做一个多条件的筛选过滤。
第二个功能就是可以通过图表的形式快速的进入到规则设置:
点击左边蓝色的叹号,可以进入到Alerts的添加设置,字符串里面会自动添加到此条规则的message信息,我们就不用再复制粘贴了,可以做到精准的针对某条具体的信息做阀值设置,也可以对message内容做修改
点击红色的X号,可以进入到Removals的删除某条记录的功能,其效果跟上面是一致的。
Statistics:
这个是一个总的汇总技术,没有时间选择,可以选择哪种Facility: 和哪种Priority:,不选的话都是默认的ALL,来汇总每个设备,Priority:和Facility:到现在为止出现的次数。
Aleert Log:
就是查看一下触发Alter的日志记录,也是可以多条件筛选的。
博文来自:www.51niux.com
六、rsyslog一些扩展知识
6.1 rsyslog基本写法:
基本写法就是:filter action #filter就是过滤条件,action就是动作。
基本的写法:authpriv.* /var/log/secure #filter就是将authpriv的所有信息级别(local级别从0-7),action就是写到/var/log/secure文件。
6.2 Filter三种过滤写法:
第一种写法:
基于设施/优先级的过滤写法,其基本语法为:FACILITY.PRIORITY,如:news.crit /var/log/spooler #就是将news消息的crit级别记录到/var/log/spooler文件中。
前置符号=表明只有该优先级的消息会被捕获,!表明除了该优先级的消息之外的优先级会被捕获。除了前置符号外,可以使用符号*表示所有的设施或者优先级。定义多个设施或者优先级使用,分隔,如果是多个 filter 的话,则使用;进行分隔。
使用范例:
*.info;mail.none;authpriv.none;cron.none /var/log/messages #这个例子就是,首先是定义了将所有的info级别的消息记录到/var/log/messages 文件中,但是呢这里有多个filter,所以用到了几个;号来分隔开。mail.none因为下面还有个mail.*记录到/var/log/maillog的操作,所以这里就表示/var/log/messages 不记录mail设施的相关信息。其他的另外两个意思一致。
cron.!info,!debug /var/log/cron #这个例子就是表示,除info和debug,其他优先级的消息会记录到 /var/log/cron 文件中,并且可以看到多个优先级之间使用逗号隔开的。
第二种写法:
基于属性的过滤写法,其语法格式为::PROPERTY, [!]COMPARE_OPERATION, "STRING" #:PROPERTY是要比较的日志属性,COMPARE_OPERATION 为要执行的比较操作,这个的!表示取反的意思,"STRING"为比较的值。
日志属性:
msg : 日志正文。
hostname : 日志中的主机名。
fromhost : 从哪个主机接收到的消息。
fromhost-ip :消息来源的IP地址。
syslogtag : 日志标签,如:sshd[19359].
programname : 日志标签的静态部分,如sshd。
pri : 日志的PRI部分。
pri-text : PRI的文本表示,如:syslog.info。
syslogfacility : 日志类别。
syslogfacility-text : 日志类别的文本表示。
syslogseverity : 日志级别。
syslogseverity-text : 日志级别的文本表示。
timegenerated : 接收日志的时间。
timereported : 日志内的报告时间,或日志内此条信息的生成时间。
$now : 当前时间,YYYY-MM-DD
$year : 当前年,YYYY
$month:当前月,MM
$day : 当前日,DD
$hour : 当前小时,HH
$minute : 当前分钟,MM
比较操作:
contains :匹配提供的字符串值是否是属性的一部分,如果不区分大小写,使用contains_i。
isequal :比较属性和值是否相等。
startswith :属性是否以指定字符串开始(startswith_i)。
regex :正则表达式(POSIX BRE 基本正则)匹配。
ereregex :正则表达式(POSIX ERE 扩展正则)匹配。
isempty :判断属性是否为空,不需要 value。
使用范例:
:fromhost-ip, !isequal, "127.0.0.1" ?cacti_syslog #这里的:PROPERTY就是:fromhost-ip,判断来源IP。这里的COMPARE_OPERATION就是isequal,判断是否相等。!isequal就是取反不相等的意思。"STRING"就是"127.0.0.1" 。这句话总的意思就是如果来源IP不是127.0.01,就执行action操作。
第三种写法:
基于表达式的过滤器使用了rsyslog自定义的脚本语言RainerScript构建复杂的filter,我也没写过,也就不记录和学习了。记录的这些已经够我使用了。
6.3 Action操作
第一个:指定多个action,使用&连接。
范例(切记一定要换行使用&,不然是不生效的,错误格式会导致你什么日志都收不到):
authpriv.* /var/log/secure
& /var/log/messages #这里就表示认证信息除了向/var/log/secure传输以外,还会向/var/log/messages传输一份。
& @182.118.22.12;Source #这里就表示还会发送到远端的182.118.22.12,并且;Source是用了格式;模板名称。这里的意思就是发送数据的时候用的是自定义模板Source的格式.
第二个:动态的生成日志文件的方式。格式为:FILTER ?Filetemplate #Filetemplate是我们自定义的输出路径模板
上面那种直接指定一个文件路径,如/var/log/secure,这都是静态日志生成,下面是动态生成日志文件的抒写范式:
$template Source,"/rsyslog/data/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log" #这里就是定义了一个模板Source,里面是要写入到哪个动态文件.
:fromhost-ip, !isequal, "127.0.0.1" ?Source #?模板名称,所以这里除了来源IP是127.0.0.1的也就是除了本地以外其他客户端的日志都会写入到对应的目录和对应的文件中去。
第三个:丢弃某些内容,使用~动作。
范式:
:fromhost-ip, !isequal, "127.0.0.1" ?Source
& ~
#上面的意思就是,来自于本地的消息不仅不会不被写入到Source模板定义的文件里面去,也会被丢弃。不过用来这里有跟没有效果是一样的。类似于这种::msg, contains, “error” ~ # 忽略包含error的日志
6.4 模板操作
格式就是:$template 模板名称,“模板内容”,【OPTION】
上面已经介绍了动态文件名模板,下面介绍一下数据库模板的范式:
$template cacti_syslog,"INSERT INTO syslog_incoming(facility, priority, date, time, host, message) values ('%syslogfacility-text%',
'%syslogseverity-text%', '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', '%fromhost-ip%', '%msg%')", SQL
:fromhost-ip, !isequal, "127.0.0.1" >localhost,cactisyslog,cactiuser,cactiuser;cacti_syslog
#首先看第一行,$template,这个以$开始就是表示是全局指令,每一行只能有一个指令。cacti_syslog就是模板名称,INSERT INTO syslog_incoming(facility, priority, date, time, host, message) values ('%syslogfacility-text%', '%syslogseverity-text%', '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', '%fromhost-ip%', '%msg%') 这些是模板的内容,属性用%%括起来。SQL是一个OPTION,表示指定了模板的功能支持选项为sql和stdsql,在使用数据库存储的时候会用到。
#然后看第二行,前面就不说了,>后面跟的格式为:数据库主机IP,数据库库名,数据库授权用户,数据库用户密码;调用哪个模板。