学海无涯 个人blog lnmps.com 新站
分类: LINUX
2013-04-23 14:03:35
首先解释什么是日志服务器, 一般意义上的日志服务器是指,S/C模式下用于专门存放系统日志或者程序日志的服务器。在Linux系统中,服务器会产生大量的日志,根据一般的日志的分类,可以把日志分为以下三种:
连接时间日志--由多个程序执行,把纪录写入到/var/log/wtmp和/var/run/utmp,login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。
进程统计--由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。
错误日志--由syslogd(8)执行。各种系统守护进程、用户程序和内核通过syslog(3)向文件/var/log/messages报告值得注意的事件。另外有许多UNIX程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。
在/var/log目录下常见的日志为:
access-log 纪录HTTP/web的传输
acct/pacct 纪录用户命令
aculog 纪录MODEM的活动
btmp 纪录失败的纪录
lastlog 纪录最近几次成功登录的事件和最后一次不成功的登录
messages 从syslog中记录信息(有的链接到syslog文件)
sudolog 纪录使用sudo发出的命令
sulog 纪录使用su命令的使用
syslog 从syslog中记录信息(通常链接到messages文件)
utmp 纪录当前登录的每个用户
wtmp 一个用户每次登录进入和退出时间的永久纪录
xferlog 纪录FTP会话
日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪侵入者等等。
既然日志那么重要,所以保存日志也就显的格外重要,这就要回头我们本文的开头,日志服务器,单纯的讲,系统只会把日志存放在本地,但是当一个系统工程师,管理者十台甚至上百台的服务器时,如果他需要查看日志,那么他就需要一台一台服务器的登录查看,这样显然是效率最低下的,所以,我们把所有的服务器的日志都发送到一台服务器上去,那么就可以节省很多不必要的登录和重复操作。
syslog是Linux系统默认的日志守护进程。默认的syslog配置文件是/etc/syslog.conf文件。syslog守护进程是可配置的,它允许人们为每一种类型的系统信息精确地指定一个存放地点。
# cat /etc/syslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg *
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
httpd.* @192.168.10.17
# Save boot messages also to boot.log
local7.* /var/log/boot.log
以上配置文件#号开头的为注释,其余均为配置,并且可以更改:每一行由两个部分组成。第一个部分是一个或多个“选择条件”;上例中的选择条件是“mail”。选择条件后面跟一些空格字符,然后是一个“操作动作”如:
mail.* -/var/log/maillog
选择条件本身分为两个字段,之间用一个小数点(.)分隔。前一字段是一项服务,后一字段是一个优先级。选择条件其实是对消息类型的一种分类,这种分类便于人们把不同类型的消息发送到不同的地方。在同一个syslog配置行上允许出现一个以上的选择条件,但必须用分号(;)把它们分隔开。上面给出的例子里只有一个选择条件“mail”。大家可以在我们后面给出的那个完整的syslog配置文件示例里看到同时有多个选择条件的配置行。
常见的服务类型:
1
优先级是选择条件的第二个字段,它代表消息的紧急程度。对一个应用程序来说,它发出的哪些消息属于哪一种优先级是由当初编写它的程序员决定的,应用程序的使用者只能接受这样的安排——除非打算重新编译系统应用程序。表2按严重程度由低到高的顺序列出了所有可能的优先级.常见的:
2
不同的服务类型有不同的优先级,数值较大的优先级涵盖数值较小的优先级。如果某个选择条件只给出了一个优先级而没有使用任何优先级限定符,对应于这个优先级的消息以及所有更紧急的消息类型都将包括在内。比如说,如果某个选择条件里的优先级是“warning”,它实际上将把“warning”、“err”、“crit”、“alert”和“emerg”都包括在内.
syslog允许人们使用三种限定符对优先级进行修饰:星号(*)、等号(=)和叹号(!)。熟悉规则表达式的读者应该对这三种限定符不会感到陌生。星号(*)的含义是“把本项服务生成的所有日志消息都发送到操作动作指定的地点”。就像它在规则表达式里的作用一样,星号代表“任何东西”。在前面给出的例子里,“mail.*”将把所有优先级的消息都发送到操作动作指定的/var/log/mail文件里。使用“*”限定符与使用“debug”优先级的效果完全一样,后者也将把所有类型的消息发送到指定地点。
等号(=)的含义是“只把本项服务生成的本优先级的日志消息都发送到操作动作指定的地点”。比如说,可以用“=”限定符只发送调试消息而不发送其他更紧急的消息(这将为应用程序减轻很多负担)。当你只需要发送特定优先级别的消息时,就要使用等号限定符。
就像它在编程时的用法一样,等号意味着等于且仅等于。叹号(!)的含义是“把本项服务生成的所有日志消息都发送到操作动作指定的地点,但本优先级的消息不包括在内”。比如说,这条syslog配置行将把除info优先级以外的所有消息发送到/var/log/mail文件里。
mail.*;mail.!info/var/log/mail
日志信息可以分别记录到多个文件里,还可以发送到命名管道、其他程序甚至另一台机器。
由于syslog的过滤性能和可配置性缺陷,在此我们选择使用syslog-ng。syslog-ng号称是下一代的syslog (ng) next generation服务。是一个商业版的开源软件。其官网地址为:
http://www.balabit.com/network-security/syslog-ng/
3
syslog- ng的一个设计原则就是建立更好的消息过滤粒度。syslog-ng能够进行基于内容和优先权/facility的过滤。另一个设计原则是更容易进行不同防火墙网段的信息转发,它支持主机链,即使日志消息经过了许多计算机的转发,也可以找出原发主机地址和整个转发链。最后的一个设计原则就是尽量使配置文件强大和简洁。
另外需要的一个软件是php-syslog-ng,是一个可以web来检索数据库中的日志信息,更好的呈现日志。其官网地址是:
php-syslog-ng已经更改名字为logzilla,在3.0版本以后做了licence限制,所以在此采用2.99的版本。
整体架构如下图:
4
1, 需要安装PHP,GD,MySQL,HTTP
yum –y install php gd mysql http
2,安装其他支持包
yum –y install libdbi* libnet
cpan Date::Calc Text::LevenshteinXS String::CRC32
cpan –i Digest::SHA1
cpan –I Net::MySQL
3,下载相关软件包
cd ~
mkdir sysserver
cd sysserver/
wget
wget
cp eventlog_0.2.9.tar.gz /usr/src/redhat/SOURCES/
cd /usr/src/redhat/SOURCES/
tar zxvf eventlog_0.2.9.tar.gz
cd eventlog-0.2.9/
rpmbuild --ba eventlog.spec.bb
cd /usr/src/redhat/RPMS/x86_64
rpm -Uvh libevtlog*
cd ~/sysserver
rpm -Uvh syslog-ng-3.0.3-1.rhel5.i386.rpm
安装logzilla
cd /var/www/html/
wget
tar -zxvf logzilla_v2.9.9o.tgz
mkdir -p /var/log/logzilla
5,配置Mysql
mysql -u -p
mysql> SELECT @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| OFF |
+-------------------+
1 row in set (0.00 sec)
低于Mysql5.1版本会提示如下,如不打算升级到logzilla3.0,没有关系,可以略过此步骤。
mysql> SELECT @@event_scheduler;
ERROR 1193 (HY000): Unknown system variable 'event_scheduler'
激活event_scheduler
mysql> SET GLOBAL event_scheduler = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| ON |
+-------------------+
1 row in set (0.00 sec)
mysql> quit;
6,修改syslog-ng配置
vim /opt/syslog-ng/etc/syslog-ng.conf
###########################################################################################
options {
long_hostnames(off);
# doesn't actually help on Solaris, log(3) truncates at 1024 chars
log_msg_size(8192);
# buffer just a little for performance
# sync(1); <- Deprecated - use flush_lines() instead
flush_lines(1);
# memory is cheap, buffer messages unable to write (like to loghost)
log_fifo_size(16384);
# Hosts we don't want syslog from
#bad_hostname("^(ctld.|cmd|tmd|last)$");
# The time to wait before a dead connection is reestablished (seconds)
time_reopen(10);
#Use DNS so that our good names are used, not hostnames
use_dns(no);
dns_cache(yes);
#Use the whole DNS name
use_fqdn(yes);
keep_hostname(yes);
chain_hostnames(no);
#Read permission for everyone
perm(0644);
# The default action of syslog-ng 1.6.0 is to log a STATS line
# to the file every 10 minutes. That's pretty ugly after a while.
# Change it to every 12 hours so you get a nice daily update of
# # how many messages syslog-ng missed (0).
# stats(43200);
};
destination d_logzilla {
program("/var/www/html/php-syslog-ng/scripts/db_insert.pl"
template("$HOST\t$FACILITY\t$PRIORITY\t$LEVEL\t$TAG\t$YEAR-$MONTH-$DAY\t$HOUR:$MIN:$SEC\t$PROGRAM\t$MSG\n")
template_escape(yes)
);
};
# Tell syslog-ng to log to our new destination
log {
source(s_local);
destination(d_logzilla);
};
log {
source(s_local);
destination(d_messages);
};
7,修改httpd配置,加入虚拟主机加入如下配置
ServerAdmin qingchn@163.com
DocumentRoot /var/www/html/php-syslog-ng/html/
ServerName syslog.com.cn
ErrorLog logs/syslog.com.cn-error_log
CustomLog logs/syslog.com.cn-access_log common
# LogZilla
Alias /logs "/var/www/html/php-syslog-ng/html/"
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
重启http服务
service httpd restart
8,修改php配置 红色部分为更改后的
vim /etc/php.ini
memory_limit = 128M
max_execution_time = 300
display_errors = On
magic_quotes_gpc = On
chmod 777 -R php-syslog-ng/
service httpd restart
9,配置日志自动分隔
Cp /var/www/html/php-syslog-ng/scripts/contrib/system_configs/logrotate.d /etc/logrotate.d/logzilla
10,添加自动脚本
crontab -e
@daily php /var/www/html/php-syslog-ng/scprits/logrotate.php >> /var/log/php-syslog-ng/logrotate.log
@daily /usr/bin/find /var/www/html/php-syslog-ng/html/jpcache/ -atime 1 -exec rm -f '{}' ';'
*/5 * * * * php /var/log/php-syslog-ng/reloadcache.log
11.安装logzilla
12,替换脚本
cd /var/www/html/php-syslog-ng/scripts/
./fixpaths.sh
Modifying ../scripts/reloadcache.php
Modifying ../scripts/resetusers.sh
Modifying ../scripts/contrib/loggen/find_missing_sequences.pl
Modifying ../scripts/contrib/system_configs/logzilla.apache
Modifying ../scripts/contrib/system_configs/crontab
Modifying ../scripts/contrib/system_configs/syslog-ng.conf
Modifying ../scripts/contrib/dbgen/dbgen.pl
Modifying ../scripts/db_insert.pl
Modifying ../scripts/logrotate.php
Modifying ../scripts/lpdcache.php
/etc/init.d/syslog-ng restart #重启syslog-ng服务
13,客户端的设置。
vim /etc/syslog.conf
*.debug @192.168.10.223
#可以根据具体设置添加,优先级。
service syslog restart #重启客户机syslog服务
Shutting down kernel logger: [ OK ]
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
Starting kernel logger: [ OK ]
测试
logger local4.err "this is a test message"
在服务器上能够看到该信息。证明安装完成。
由于,这篇文档是用word编写的,排版比较整齐,但是发表在博客上,就显得有点乱了。
在生产环境部署的时候,把所有的安装好了以后发现,日志没有写到数据库里面,
运行db_insert.pl 发现其中21行,有错误出现
查看行
21 use DBI;
因为这是一个perl脚本,需要调用 DBI数据接口
所以需要安装
perl-DBI-1.609-3.fc12.i686
安装上该包,重新检测发现可以把日志写入数据库了。