一、概述

为了方便日志监控并防止日志被篡改,通常工作环境中会使用rsyslog架设日服务器用于存放其它服务器的日志。rsyslog支持日志的远程发送和接收。
rsyslog客户端:负责发送日志到远程日志服务器,支持udp,tcp,relp协议。
rsyslog服务器:负责接收客户端发来的日志并存储在本地,支持文件存储和数据库存储方式。

对于入侵排查工作来说,操作系统的认证日志、计划任务日志和历史命令是非常重要的。为加强日志管理,要求将各系统的相应日志信息保存到
专用的rsyslog日志服务器,保存日志的路径格式为:源IP地址/设施名(日志类别)/年月.log。

对于进行安全审计或者数据分析,需要将各类设备的日志发送到日志服务器。
为了方便日志监控并防止日志被篡改,通常在工作网络中会架设中央日志服务器用于存放各个服务器的日志,rsyslog支持日志的远程发送和接受
rsyslog客户:负责发送日志到中央日志服务器,支持udp,tcp,relp协议
rsyslog服务器:负责接受从rsyslog客户发送的日志并存储在rsyslog服务器,支持日志文件存储、数据库存储

以下为rsyslog客户与rsyslgo服务器使用到的模块与配置语法

角色 功能 RPM包名 模块 配置语法
客户 使用udp协议发送 rsyslog - *.* @hostname:514
使用tcp协议发送 rsyslog - *.* @@hostname:514
使用relp协议发送 rsyslog-relp omrelp *.* :omrelp:hostnames:2514
服务器 使用udp协议接收 rsyslog imudp $ModLoad imudp
$InputUDPServerRun 514
使用tcp协议接收 rsyslog imtcp $ModLoad imtcp
$InputTCPServerRun 514
使用relp协议接收 rsyslog-relp imrelp $ModLoad imrelp
$InputRELPServerRun 2514
将日志记录到MySQL ryslog-mysql ommysql $ModLoad ommysql
*.*:ommysql:DBserver,DBname,DBuser,DBpasswd
将日志记录到PostgreSQL rsyslog-pgsql ompgsql $ModLoad ompgsql
*.*:ompgsql:DBserver,DBname,DBuser,DBpasswd

二、实验

1、服务端配置

1、配置
vi /etc/rsyslog.conf
#### MODULES ####
$ModLoad imudp
#如果不在此处添加ip,默认全网监听,目前只发现了针对UDP设置IP
$UDPServerAddress 192.168.10.131 # this MUST be before the $UDPServerRun directive!
$UDPServerRun 514
#允许客户端通过udp:514 端口连接

$ModLoad imtcp
#TCP暂时没找到解决全网监听的办法,如果全网监听不安全,可以考虑只开启UDP
$InputTCPServerRun 514
#允许客户端通过tcp:514 端口连接

#### GLOBAL DIRECTIVES ####
# Use default timestamp format 使用默认日志的时间戳格式
#有些操作系统下面这个参数给注释掉了,可以取消注释
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# 使用RemoteLogs模板接受客户端的日志,保存到本地的/var/log/remote目录下,下面第一层子目录是通过年月日的命令格式,然后是每
台客户端的ip命令的log,当有数据来时,remote目录会自动创建
$template RemoteLogs,"/var/log/remote/%$YEAR%-%$MONTH%-%$DAY%/%fromhost-ip%.log"
## 排除本地主机IP日志记录,只记录远程主机日志
:fromhost-ip, !isequal, "127.0.0.1" ?Remote
#指示rsyslog在将消息写入文件后停止处理消息。如果不包含"&~",则接收到的日志信息将被写入下面配置的那些日志文件,如messages
& ~

2、重启
systemctl restart rsyslog
ss -tulnp|grep 514
##有些重启以后,日志会报以下错误
"warning: ~ action is deprecated, consider using the 'stop' statement instead [try http://www.rsyslog.com/e/2307 ]"
可以修改配置:
& stop

3、补充
如果是suse系统,还需要额外添加参数
vi /etc/sysconfig/syslog
SYSLOG_REQUIRES_NETWORK=yes

2、客户端配置

1、配置说明
authpriv.* @10.0.0.100:514
#一个@表示通过udp:514 通信
authpriv.* @@10.0.0.100:514
#两个@表示通过tcp:514 通信

2、配置
vi /etc/rsyslog.conf
在最后追加
authpriv.*;auth.*;cron.* @192.168.10.131:514

3、重启
systemctl restart rsyslog

3、验证

客户端132只需要退掉重新登录,就会产生登录信息
然后去服务端
/var/log/remote/192.168.10.132/日志文件

4、补充

#配置客户端rsyslog发送tcp端口日志,通过修改配置文件/etc/rsyslog.config上指定tcp传输的日志
#配置文件中追加发送邮件相关的日志,级别为值得报告的信息
echo 'mail.info @@192.168.10.131:514'>>/etc/rsyslog.conf
#重启syslog
sysctemctl restart rsyslog
#测试,在客户端执行logger命令进行测试
logger -p mail.info "this is a test for rmote log."#发送测试消息

三、过滤配置抄录

#配置服务端(接收)
vi /etc/rsyslog.conf #在文件开始加上,同时确保514端口能够被客户端用tcp访问
$ModLoad imtcp.so # needs to be done just once #使用tcp方式
$InputTCPMaxSessions 500 # tcp接收连接数为500个
$InputTCPServerRun 514 # tcp接收信息的端口
$template logformat,”%TIMESTAMP:::date-mysql% %FROMHOST-IP%%msg%\n” # 定义一个名为logformat模板, 为信息加上日志时间
$template DynFile,”/var/log/tlog%$year%%$month%%$day%.log” # 定义日志文件的名称,按照年月日
# 把rawmsg(也可以使用msg)日志中包含sdns_log标志的信息写到DynFile定义的日志文件里
:rawmsg, contains, “sdns_log” ?DynFile;logformat
:rawmsg, contains, “sdns_log” ~ # 这个表示丢弃包含sdns_log标志的信息, 一般都加上它, 以免多个日志文件记录重复的日志

#配置客户端(发送)
vi /etc/rsyslog.conf #在文件开始加上
#把包含sdns_log的信息通过tcp发到192.168.1.2 @@表示tcp @表示udp
:rawmsg, contains, “sdns_log” @@192.168.1.2 # 默认514端口
#这个表示丢弃包含sdns_log标志的信息,防止这个信息写到本机的/var/log/message
:rawmsg, contains, “sdns_log” ~

#测试
在客户端上执行
logger -p user.info “sdns_log 34334″
在服务端的/var/log/目录里是否有tlog*日志产生

补充:
如果要把不同服务器发送过来的日志保存到不同的文件, 可以这样操作:
:fromhost-ip, isequal, “192.168.0.160″ /var/log/host160.log
:FROMHOST-IP, isequal, “192.168.0.161″ /var/log/host161.log
:FROMHOST-IP, startswith, “192.168.1.” /var/log/network1.log
:FROMHOST-IP, startswith, “192.168.2.” /var/log/network2.log