ssh升级后日志log路径变成messages

编译升级openSSH后,发现denyhosts失效,再查原来是ssh的日志路径变成messages了,百度后,修改sshd的一个参数,日志即变成secure

# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO

以前一直不理解facility那么多个,有的定义mail,cron,有的定义auth,这么多程序需要使用syslog,那怎么知道哪个程序使用的是对应的facility呢,比如mail,可以用sendmail ,也可以用qmail,那怎么信息都放到mail 里面啊? 带着这个疑问,我开始baidu.com了.看到其中有篇文章写到:/etc/syslog.conf文件中的一项配置记录由“选项”(selector)和“动作”(action)两个部分组成,两者间用tab制表符进行分隔。而“选项”又由一个或多个形如“类型.级别”格式的保留字段组合而成,各保留字段间用分号分隔。是保留字段呢 ?他们是唯一的.syslog程序定义了的??

于是man 3 syslog 察看syslog.h函数的man  手册,才明白原来程序使用syslog都是调用了函数的,所以任何程序作者只要愿意,都可以调用syslog的函数,在调用函数的时候传递 facility priority    以及其他一些参数....原来是这样的..,程序就和syslog联系起来了.


以下是从 syslogd的manual 和网上的一些信息完成;
说明:
1 关于syslogd的一些配置以及使用方法 已经进行测试调研
2 有时间可能进行syslog-ng(syslog的增强版)的调研

一、配置文件
linux的默认的日志服务器就是sysklog套件:
# rpm -qa|grep sysklogd
sysklogd-1.4.1-26_EL
其主要的配置文件有两个:
/etc/sysconfig/syslog这里定义syslog服务启动时可加入的参数。
/etc/syslog.conf这个是syslog服务的主要配置文件,根据定义的规则导向日志信息。


二、设置主配置文件
/etc/syslog.conf    根据如下的格式定义规则:
action
设备.优先级 动作 字段也被称为seletor(选择条件),选择条件和动作之间用空格或tab分割开。
#号开头的是注释,空白行会自动跳过。
1、facility
facility定义日志消息的范围,其可使用的key有:auth -由 pam_pwdb 报告的认证活动。
authpriv -包括特权信息如用户名在内的认证活动
cron -与 cron 和 at 有关的计划任务信息。
daemon -与 inetd 守护进程有关的后台进程信息。
kern -内核信息,首先通过 klogd 传递。
lpr -与打印服务有关的信息
mail -与电子邮件有关的信息
mark - syslog内部功能用于生成时间戳
news -来自新闻服务器的信息
syslog -由 syslog 生成的信息
user -由用户程序生成的信息
uucp -由 uucp 生成的信息
local0-local7 -与自定义程序使用
* 通配符代表除了 mark 以外的所有功能除mark为内部使用外,还有security为一个旧的key定义,等同于auth,已经不再建议使用。


2、level级别
level  定义消息的紧急程度。按严重程度由高到低顺序排列为:emerg -该系统不可用,等同panic
alert   -需要立即被修改的条件
crit    -阻止某些工具或子系统功能实现的错误条件
err     -阻止工具或某些子系统部分功能实现的错误条件,等同error
warning -预警信息,等同warn
notice  -具有重要性的普通条件
info    -提供信息的消息
debug   -不包含函数条件或问题的其他信息
none -没有重要级,通常用于排错
* 所有级别,除了none其中,panic、error、warn均为旧的标识符,不再建议使用。
在定义level级别的时候,需要注意两点:
1)优先级是由应用程序在编程的时候已经决定的,除非修改源码再编译,否则不能改变消息的优先级;
2)低的优先级包含高优先级,
例如,为某个应用程序定义info的日志导向,则涵盖notice、warning、err、crit、alert、emerg等消息。(除非使用=号定义)
3、selector选择条件
通过小数点符号“.”把facility和level连接在一起则成为selector(选择条件)。
可以使用分号“;”同时定义多个选择条件。也支持三个修饰符:* - 所有日志信息
= 等于,即仅包含本优先级的日志信息
! = 不等于,本优先级日志信息除外
4、action动作
由前面选择条件定义的日志信息,可执行下面的动作:file-指定日志文件的绝对路径
terminal 或 print -发送到串行或并行设备标志符,例如/dev/ttyS2
@host -远程的日志服务器
username -发送信息本机的指定用户信息窗口中,但该用户必须已经登陆到系统中
named pipe -发送到预先使用 mkfifo 命令来创建的 FIFO 文件的绝对路径※注意,不能通过“|/var/”方式导向日志到其他脚本中处理。
5、举例
例如:*.info;;;;                  /var/log/messages
#把除邮件、新闻组、授权信息、计划任务等外的所有通知性消息都写入messages文件中。
mail,news.=info                  /var/adm/info
#把邮件、新闻组中仅通知性消息写入info文件,其他信息不写入。
mail.*;mail.!=info               /var/adm/mail
#把邮件的除通知性消息外都写入mail文件中。
mail.=info                    /dev/tty12
#仅把邮件的通知性消息发送到tty12终端设备
*.alert                       root,joey
#如果root和joey用户已经登陆到系统,则把所有紧急信息通知他们
*.*                              @finlandia
#把所有信息都导向到finlandia主机(通过/etc/hosts或dns解析其IP地址)
※注意:每条消息均会经过所有规则的,并不是唯一匹配的。
也就是说,假设mail.=info信息通过上面范例中定义的规则时,/var/adm/info、/var/adm/mail、/dev/tty12,甚至finalandia主机都会收到相同的信息。
这样看上去比较烦琐,但可以带来的好处就是保证了信息的完整性,可供不同地方进行分析。
6、测试
部分情况下,上述规的实际执行结果和定义的预想结果可能会有出入。这时,可使用logger程序辅助测试:
# logger -p *.* 'Hello World!'
日志显示:
Nov 12 13:40:04 dc5test root: Hello World!
其表示意思如下:
第一列:日志产生时间
第二列:产生此日志的主机名称
第三列:产生此日志的应用程序或用户名称
第四列:日志信息7、自定义日志级别
正如前面所说的,应用程序的日志级别是由应用程序所决定的。部分应用程序可通过配置,定义其日志级别。
例如,/etc/ssh/sshd_config文件中就有:#
SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO
把sshd的日志定义在级别。
配置文件中的:
authpriv.* /var/log/secure
则日志文件被写入/var/log/secure文件中。
我们修改为:SyslogFacility local0
配置文件在中增加:
local0.* /var/log/
保存后,重新启动sshd或syslog服务,则以后sshd服务的所有日志都会单独的放到 文件中了。
三、设置服务参数   (实现日志的大集中的功能) @guoxian1  测试

1 默认情况下,syslog进程是不能接受其他日志服务器发过来的消息的。而通过修改其启动参数,可实现日志的大集中功能。修改/etc/sysconfig/syslog文件:
-r : 打开接受外来日志消息的功能,其监控514 UDP端口;
-x : 关闭自动解析对方日志服务器的FQDN信息,这能避免DNS不完整所带来的麻烦;
-m : 修改syslog的内部mark消息写入间隔时间(0为关闭),例如240为每隔240分钟写入一次“--MARK--”信息;
-h :默认情况下,syslog不会发送从远端接受过来的消息到其他主机,而使用该选项,则把该开关打开,所有接受到的信息都可根据中定义的@主机转发过去。
2 通过man syslogd可获得更详细的帮助,
而具体到实际配置文件改为:

SYSLOGD_OPTIONS="-r -h -x -m 0"

保存后,重启服务即可:
#/etc/init.d/syslog restart
此时,客户机只要通过修改,在最后定义动作为@主机或IP,即可发送日志信息到本服务器中。
*.*                                   @hostname

例子:
(1 服务器syslog配置修改(host):
1) vim /etc/sysconfig/syslog(修改)
SYSLOGD_OPTIONS="-r -h -x -m 0"
2) vim vim /etc/syslog.conf (添加)
*.info                                                  /var/log/local4messages
3) restart syslogd
/etc/init.d/syslog restart
(2 客户端服务器修改(host):
1) vim /etc/syslog.conf (修改)
local7.*                                @host
2) restart syslogd
/etc/init.d/syslog restart
(3 发送消息测试:
运行测试程序:
#include
#include
#include
int main(){
 openlog("slog", LOG_PID|LOG_CONS,LOG_LOCAL7);
syslog(LOG_INFO,"test HELLO WORLD  ......");
closelog();
return 0;
}
(4 检查10.210.213.128接受到的日志信息:
tail /var/log/local4messages
Apr  5 17:16:06 10.210.213.130 slog[697]: test HELLO WORLD  ...... 
Apr  5 17:16:07 10.210.213.130 slog[711]: test HELLO WORLD  ...... 
Apr  5 17:16:58 10.210.213.130 slog[717]: test HELLO WORLD  ...... 
Apr  5 17:16:59 10.210.213.130 slog[718]: test HELLO WORLD  ...... 

(5 结论:
测试通过能够通过syslog来进行收集日志
这地方也可以用 @name 不过这个name要在 /etc/hosts 中指定ip地址
(在构建集中的日志服务器时,请务必配合ntp时间服务,以保证信息的有效性,避免不必要的麻烦)
3 另外,/etc/sysconfig/syslog配置文件中,还定义有klogd服务的启动参数:(klogd 是linux用来记录kernel message 的 没有具体调研)
KLOGD_OPTIONS="-x"详细帮助,请参考man 8 klogd或man klogd。
四、网上资料
syslog配置日志服务器
1 记录UNIX类主机的log信息:
首先需要对freebsd的syslog进行配置,使它允许接收来自其他服务器的log信息。
在/etc/sysconfig/syslog中加入:
syslogd_flags="-4 -a 0/0:*"
说明:freebsd的syslogd参数设置放在/etc/sysconfig/syslog文件的syslogd_flags变量中
Freebsd对syslogd的默认设置参数是syslogd_flags="-s",(可以在/etc/defaults/中看到)
默认的参数-s表示打开UDP端口监听,但是只监听本机的UDP端口,拒绝接收来自其他主机的log信息。如果是两个ss,即-ss,表示不打开任何UDP端口,只在本机用/dev/log设备来记录log.
2 修改后的参数说明:
-4 只监听IPv4端口,如果你的网络是IPv6协议,可以换成-6
-a 0/0:* 接受来自所有网段所有端口发送过来的log信息。
如果只希望syslogd接收来自某特定网段的log信息可以这样写:-a .1.0/24:*
-a .1.0/24:514或者-a .1.0/24表示仅接收来自该网段514端口的log信息,这也是freebsd的syslogd进程默认设置,也就是说freebsd 在接收来自其他主机的log信息的时候会判断对方发送信息的端口,如果对方不是用514端口发送的信息,那么freebsd的syslogd会拒绝接收信息。即,在默认情况下必须:远程IP的514端口发送到本地IP的514,
在参数中加入*,表示允许接收来自任何端口的log信息。这点,在记录 UNIX类主机信息的时候感觉不到加不加有什么区别,因为UNIX类主机都是用 514端口发送和接收syslog信息的。但是在接收windows信息的时候就非常重要了。因为windows的syslog软件不用514端口发送信息,这会让默认配置的syslogd拒绝接收信息。笔者同样在linux系统下用linux的syslogd来配置log服务器,发现linux下的 syslogd就没有那么多限制,只要给syslogd加上-r参数,就可以接收来自任何主机任何端口的syslog信息,在这方面来说freebsd的默认配置安全性要比linux稍微高一点。
修改好syslogd参数后,我们需要修改一下/etc/syslog.conf文件,指定log信息的存放路径,
比如你要记录其他系统的远程登陆登出信息并指定日志存放路径,则需要修改以下行:
3 authpriv.* /var/log/testlog
这表示把系统的登入登出日志(包括本机系统登陆登出日志)存放到/var/log/testlog文件中。当然,这是最简陋的做法,因为这样会把所有服务器的登陆登出信息存放在一个文件中,察看的时候很不方便,通常的做法是用一个脚本,对接收到的信息进行简单的分拣,再发送到不同的文件。
4 关于syslogd的管道的使用
如下设置:
authpriv.* |/var/log/filter_


在记录目标前面加上“|”表示把接收到的信息交给后面的程序处理,这个程序可以是一个专门的日志处理软件,也可以是一个自己编写的小的脚本,举例:

#!/bin/sh
read stuff
SERVER=`echo $stuff |awk ‘{print $4}’`
echo $stuff >> /var/log/login_log/$
这个简单的脚本以IP作为分类依据,先用read读取log信息,用awk取出第四字段(即IP地址或者主机名所在的字段),以该字段为文件名存放该主机的日志。
这样一来,来自.1.1的log会记录到.1.1.log文件中,来自.1.2的log会被记录在 .1.2.log文件中,分析和归类就比较方便了。当然这是一个最简单的例子,读者可以根据自己的需求写出更好的脚本,甚至把log信息分类后插入数据库中,这样日志的管理和分析就更方便了。


最后重启一下syslogd服务,让配置生效:
/etc/rc.d/syslogd restart
OK,服务端的配置完成。现在配置一下客户端:

5 关于客户端的配置
这里所说的客户端,就是发送自己的日志到远程日志服务器上的主机。
修改/etc/syslog.conf文件:
我们举例你只要记录系统登入登出日志到远程日志服务器上,那么只需要修改以下一行:
authpriv.* @.10.100
这里的.10.100就是log服务器的IP,“@”符号表示发送到远程主机。
OK,重启一下syslog服务:
Linux: /etc/init.d/syslogd restart
BSD: /etc/rc.d/syslogd restart
用logger测试一下是否配置成功:
logger –p “Hello,this is a test”
到log服务器上去看看,“Hello,this is a test”应该已经被记录下了。最后在客户机上登陆登出几次,看看真实的authpriv信息是否也被成功的记录下。

五 建立一个中央日志服务器
 1 建立中央日志服务器前的准备工作
配置良好的网络服务(DNS和NTP)有助于提高日志记录工作的精确性。在默认情况下,当有其他机器向自己发送日志消息时,中央日志服务器将尝试解析该机器的FQDN(fullyqualifieddomainname,完整域名)。(你可以在配置中央服务器时用“-x”选项禁止它这样做。)如果syslog守护进程无法解析出那个地址,它将继续尝试,这种毫无必要的额外负担将大幅降低日志记录工作的效率。类似地,如果你的各个系统在时间上不同步,中央日志服务器给某个事件打上的时间戳就可能会与发送该事件的那台机器打上的时间戳不一致,这种差异会在你对事件进行排序分析时带来很大的困扰;对网络时间进行同步有助于保证日志消息的时间准确性。如果想消除这种时间不同步带来的麻烦,先编辑/etc/文件,使其指向一个中央时间源,再安排ntpd守护进程随系统开机启动就可以了。
2 配置一个中央日志服务器

须稍加配置,就可以用syslog实现一个中央日志服务器。任何一台运行syslog守护进程的服务器都可以被配置成接受来自另一台机器的消息,但这个选项在默认情况下是禁用的。在后面的讨论里,如无特别说明,有关步骤将适用于包括SUSE和RedHat在内的大多数Linux发行版本。我们先来看看如何激活一个syslog服务器接受外来的日志消息:


    1. 编辑/etc/sysconfig/syslog文件。

在“SYSLOGD_OPTIONS”行上加“-r”选项以允许接受外来日志消息。如果因为关于其他机器的DNS记录项不够齐全或其他原因不想让中央日志服务器解析其他机器的FQDN,还可以加上“-x”选项。此外,你或许还想把默认的时间戳标记消息(--MARK--)出现频率改成比较有实际意义的数值,比如240,表示每隔240分钟(每天6次)在日志文件里增加一行时间戳消息。日志文件里的“--MARK--”消息可以让你知道中央日志服务器上的syslog守护进程没有停工偷懒。按照上面这些解释写出来的配置行应该是如下所示的样子: 
SYSLOGD_OPTIONS="-r-x-m240"
 2. 重新启动syslog守护进程。修改只有在syslog守护进程重新启动后才会生效。如果你只想重新启动syslog守护进程而不是整个系统,在RedHat机器上,执行以下两条命令之一: 
/etc/rc.d/init.d/syslogstop;/etc/rc.d/init.d/syslogstart 
/etc/rc.d/init.d/syslogrestart
3. 如果这台机器上运行着iptables防火墙或TCPWrappers,请确保它们允许514号端口上的连接通过。syslog守护进程要用到514号端口。
4 为中央日志服务器配置各客户机器
让客户机把日志消息发往一个中央日志服务器并不困难。编辑客户机上的/etc/文件,在有关配置行的操作动作部分用一个“@”字符指向中央日志服务器,如下所示: 
authpriv.*       @.1.40

另一种办法是在DNS里定义一个名为“loghost”的机器,然后对客户机的syslog配置文件做如下修改(这个办法的好处是:当你把中央日志服务器换成另一台机器时,不用再修改每一个客户机上的syslog配置文件): 
authpriv.*              @loghost

接下来,重新启动客户机上的syslog守护进程让修改生效。让客户机在往中央日志服务器发送日志消息的同时继续在本地进行日志工作仍有必要,起码在调试客户机的时候不必到中央日志服务器查日志,在中央日志服务器出问题的时候还可以帮助调试。

你可能感兴趣的:(操作系统linux)