实现功能:将每台服务器上用户执行的每条命令及当时的相关环境如登录IP、执行时所在目录、执行时间、登录时间、主机IP、用户名等信息收集到某台中心服务器。
用到的工具或服务:rsyslog、logger、logrotate。
先简单介绍相关的服务和用到的环境变量再整合实现:
1、logger
logger是一个shell命令接口,可以通过该接口使用rsyslog(rsyslog是syslog的加强版,如果系统是syslog也可以)的系统日志模块,还可以从命令行直接向系统日志文件(或者自定义的文件)写入一行信息。
logger的用法,具体的参数可以用man查看。
1 | logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ] |
常用的参数如下:
1 | -i 逐行记录每一次logger的进程ID。 |
2、rsysylog
Linux系统日志信息分为两个部分内核信息和设备信息。共用配置文件/etc/rsyslog.conf
内核信息 -> klogd -> syslogd -> /var/log/messages等文件
设备信息 -> syslogd -> /var/log/messages等文件
其中设备可以使用自定义的设备local0-local7,使用自定义的设备照样可以将设备信息(日志)送给rsyslog。
3、PROMPT_COMMAND
Linux系统的环境变量PROMPT_COMMAND的内容会在bash提示符显示之前被执行。该环境变量的默认值是history -a
功能是将目前新增的history追加到histfiles 中,默认写入隐藏文件~/.bash_history
中。
1 | $ echo $PROMPT_COMMAND |
在文件/etc/profile追加一行,更改该环境变量的内容,让其执行我们指定的审计语句(审计语句中有自定义的设备local0,其日志等级info)。
1 | $ tail -n 1 /etc/profile |
为了防止用户覆盖PROMPT_COMMAND,可以设置这个环境变量为readonly。
审计语句的功能:bash环境下每次执行一条命令后,logger会将执行该命令和该命令的相关环境如登录IP、执行目录、执行时间、主机IP、执行用户等信息(可以看成是自定义设备local0,设备的日志等级自定义为info级别)送给rsyslog服务器。
4、整合实现 为了保证日志的完整性,除了将日志发送到远程的rsyslog日志集中服务器外,还落地存储一份到本地。本地和远程的rsyslog服务配置如下:
1 | *.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages |
该行新增加内容local0.none,意思是所有local0设备的全部等级日志信息都不记录到文件/var/log/messages中。
1 | $ local0.info /var/log/audit.log |
这是新增加的一行内容,意思是所有local0设备的info等级的日志信息记录到文件/var/log/audit.log中。
远程集中接收日志的rsyslog服务器的配置文件也要改成和上面的两行一样,修改配置文件后需要重启rsyslogd服务使其生效。
1 | $ *.* @192.168.192.168 |
这行还是不变,意思是所有日志的所有等级都发送一份到远程(IP为192.168.192.168)的rsyslog日志集中服务器。@表示使用UDP协议发送,@@表示使用TCP协议发送。
由于audit.log文件会不断地增大,需要类似像message、cron等日志一样的切割,要在logrotate的配置文/etc/logrotate.d/syslog增加一行就行了。
1 | /var/log/cron |
最后看看结果:
本地文件/var/log/audit.log
1 | $ tail /var/log/audit.log |
远程集中收集日志的服务器文件/var/log/audit.log
1 | $ tail /var/log/audit.log |
存在的小的瑕疵,就是敲空命令的时候会将最近一次执行的命令的信息再重复送一份给rsyslog。