要审计用户执行的命令,在系统本地执行的话,比较简单。修改HISTTIMEFORMAT变量即可,比如:

export HISTTIMEFORMAT="[%F %T $(who am i)] "


但是简单的依赖.bash_history 或 script 是不可靠的,两者虽然记录了用户行为,但是可能被用户篡改和清除。

rsyslog 是标准Linux系统的一部分,能够实时的写日志,并且还可以将日志选择性的发送到远程日志服务器。

利用rsyslog 可以将日志实时写入远程日志服务器,从而杜绝用户篡改,提高审计材料的真实度。


以ubuntu为例,下面的办法可以让rsyslog记录用户所执行的命令以及时间戳,供审计使用。


1、rsyslog 添加日志

echo -e "local6.* /var/log/commands.log" >/etc/rsyslog.d/bash.conf

2、在/etc/profile 中加入

function bash2syslog {
	declare command
	command=$(fc -ln -0 2>/dev/null||true)
	if [ "$command" != "" ];then
		logger -p local6.notice -t bash -- "$(who am i)" $PWD $USER: "$command"
	fi
} 
trap bash2syslog DEBUG

这里写入本地日志。然后rsyslog直接将日志写入远程服务器 。


建议root 用户的umask 值设置为027或者007,防止/var/log/commands.log文件被普通用户查看到。



3、日志轮转

编辑/etc/logrotate.d/rsyslog 在中间增加一段

/var/log/commands.log
{
        rotate 30
        weekly
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                reload rsyslog >/dev/null 2>&1 || true
        endscript
}

 

4、重启rsyslog,用户退出重新登陆

service rsyslog restart

5、rsyslog 发送日志到远程服务器(可选)

echo "local6.*          @@192.168.0.2" >>/etc/rsyslog.conf

 

6、利用watchdog监视rsyslog,如果服务被停止,则重启机器 (可选)

apt-get install watchdog
update-rc.d watchdog defaults
 
Cat >> /etc/watchdog.conf  < 
  


7、目标日志服务器配置 /etc/rsyslog.d/commands-audit.conf

$template LOG_BY_HOSTIP, "/var/log/command-audit/%fromhost-ip%-commands.log"
local6.notice ?LOG_BY_HOSTIP


8、其它优化

设置/etc/profile

shopt -s histappend,

让不同会话共享历史记录,而不是临时保存在内存里,会话退出后才能共享

适当修改环境变量 PROMPT_COMMAND



参考文档

http://www.pointsoftware.ch/howto-bash-audit-command-logger/

http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/

http://blog.rootshell.be/2009/02/28/bash-history-to-syslog/

http://askubuntu.com/questions/93566/how-to-log-all-bash-commands-by-all-users-on-a-server

http://askubuntu.com/questions/393574/logging-of-commands-executed-in-bash