一、需求:
将服务器上的每个用户执行的命令、执行时间、登录时间、主机ip、当前切换用户等信息保存到本地并实时传输至日志服务器进行异地保存。
rsyslog-server: 192.168.1.240
rsyslog-client: 192.168.1.25
二、工具及服务:
1、logger logger 是一个shell接口,可以通过该接口使用rsyslog的日志模块。 usage: logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ] -i 逐行记录每一次logger的进程id -f file记录特定的文件 -p 输入消息的特定优先级,默认是'user.notice' -t tag为每行信息打上特定的标签 -u 以特定的socker代替内嵌系统常规工作 2、rsyslog日志服务器 rsyslog是syslog的加强版,可以用作客户端及服务器,我们可以使用local0~local7来自定义设备传输至rsyslog 3、PROMPT_COMMAND Linux系统的环境变量PROMPTCOMMAND的内容会在bash提示符显示之前被执行。 该环境变量的默认值是 history -a 功能是将目前新增的history追加到histfiles 中,默认写入隐藏文件~/.bash_history中
三、实现:
1、配置rsyslog日志服务器:
# vim /etc/rsyslog.conf # 添加以下几行 # 启动udp端口也可以是tcp端口 $ModLoad imudp $UDPServerRun 514 # 设置白名单 $AllowedSender UDP, 192.168.1.0/24, 10.0.0.0/8 # 配置模板,以客户端ip为目录,以日期命名文件 $template Remote,"/var/log/syslog/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log" # 把非本地传输的日志按照指定的模板存放 :fromhost-ip, !isequal, "127.0.0.1" ?IpTemplate # & 表示已经匹配处理的内容,~ 表示不再进行其他处理 & ~ # 重启服务 # service rsyslog restart
2、配置rsyslog客户端:
# 配置PROMP_COMMAND # vim /etc/bashrc readonly PROMPT_COMMAND='logger -p local3.notice -t bash "$(who am i |awk "{print $5,$2}" | tr -d "[()]") [`pwd`] user=$(whoami) cmmd=$(history 1 | { read x cmd; echo "$cmd"; })"' source /etc/bashrc
其中:
local3.notice 使我们自定义的设备,用于rsyslog调用; bash 是我们为每行打印的信息打印的tag; who am i |awk “{print $1” ”$2” ”$3” ”$4” ”$5}”用于获取我们当前用户的登录信息; pwd 用于列出我们当前所在的目录; whoami 用于获取我们当前切换的执行命令的用户,例如我们从test 用户 sudo -i,执行命令的用户为root,但是登录的用户test,方便我们区分; command 是我们当前用户执行的命令。
注意:
1.我们需要在/etc/bashrc或/etc/profile中添加环境变量,用于所有用户。 2.export PROMPT_COMMAND 如果将PROMPT_COMMAND导出到用户工作区,那么对于有经验的用户就可以做赋值操作 export PROMPT_COMMAND ="", 简单的语法就会导致记录功能当前session端不可用,所以PROMPT_COMMAND必须设置成只读的属性,readonly PROMPT_COMMAND
3、配置rsyslog客户端:
# vim /etc/rsyslog.conf # 添加如下行 # 添加local3.none *.info;mail.none;authpriv.none;cron.none;local3.none /var/log/messages # 保存到本地的文件 local3.notice /var/log/audit.log # 远程日志服务器 local3.notice @192.168.1.240 # 重启rsyslog # service rsyslog restart
其中:
1.local3.notice 是在logger中定义的设备,rsyslog调用并将打印信息输出至指定文件。 2.添加local3.none是避免日志写入 /var/log/messages
4、配置轮转日志(client端):
/var/log/audit.log{ daily rotate 4 missingok notifempty nocompress create dateext sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript }
# 强制轮转
logrotate -vf
/etc/logrotate
.d
/rsyslog
ls
/var/log
|
grep
audit
audit.log audit.log-20190430
三、验证测试:
1、rsyslog服务端:
[root@rsyslog-server ~]# tail -f /var/log/syslog/192.168.1.25/192.168.1.25_2019-05-02.log May 2 08:10:37 localhost bash: 192.168.1.65 pts/2 [/root] user=root cmmd=service sshd restart May 2 08:12:22 localhost bash: 192.168.1.65 pts/2 [/root] user=root cmmd=vim /etc/rsyslog.conf May 2 08:12:31 localhost bash: 192.168.1.65 pts/2 [/root] user=root cmmd=service rsyslogd restart May 2 08:12:35 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started. May 2 08:12:35 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="14495" x-info="http://www.rsyslog.com"] start May 2 08:12:35 localhost bash: 192.168.1.65 pts/2 [/root] user=root cmmd=service rsyslog restart
2、rsyslog客户端:
[root@client ~]# tail -f /var/log/audit.log May 2 08:10:37 localhost bash: 192.168.1.65 pts/2 [/root] user=root cmmd=service sshd restart May 2 08:12:22 localhost bash: 192.168.1.65 pts/2 [/root] user=root cmmd=vim /etc/rsyslog.conf May 2 08:12:31 localhost bash: 192.168.1.65 pts/2 [/root] user=root cmmd=service rsyslogd restart May 2 08:12:35 localhost bash: 192.168.1.65 pts/2 [/root] user=root cmmd=service rsyslog restart