如何记录服务器上所有用户的所有Bash命令?
我们的小公司运行一个Ubuntu Server 11.10,有几个人有SSH访问权限。 有时也会使用实际的终端。 我们如何在本地记录所有运行的Bash命令,以及用户和时间戳?
我们可以假设没有人是邪恶的并积极地试图避免日志记录,但我们仍然希望用户不要对他们的日志文件进行直接写访问。 必须正确处理同时会话。
对于BASH shell,编辑系统范围的BASH运行时配置文件:
sudo -e /etc/bash.bashrc
附加到该文件的末尾:
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
使用新文件设置“local6”的日志记录:
sudo -e /etc/rsyslog.d/bash.conf
而内容……
local6.* /var/log/commands.log
重启rsyslog:
sudo service rsyslog restart
登出。 登录。瞧!
但我忘记了日志轮换:
sudo -e /etc/logrotate.d/rsyslog
有一个日志文件列表以相同的方式旋转…
/var/log/mail.warn /var/log/mail.err [...] /var/log/message
因此,在该列表中添加新的bash-commands日志文件:
/var/log/commands.log
保存。
在这方面,进程计费系统可能是有用的,特别是提供lastcomm和ac命令的acct包。
ac命令打印出有关用户连接时间的统计信息,以小时为单位。 这是用户通过SSH或串行终端远程连接到系统的时间,或者在控制台上。
lastcomm命令显示有关先前执行的命令的信息。 最新的条目在列表的顶部给出。 还显示每个进程使用的CPU时间总量。
可能有用的旧教程如下:
http://www.linuxjournal.com/article/6144?page=0,1
其他会计命令如last等可以在本教程中找到:
http://www.techrepublic.com/article/system-accounting-in-linux/1053377
您可以在这里找到一个脚本,将所有bash命令/内置函数记录到文本文件或syslog服务器中,而无需使用补丁或特殊的可执行工具。
非常容易部署,因为它是一个简单的shell脚本,需要在bash的初始化时调用一次。
它是免费的,我希望它符合您的需求。
你可以使用史努比 。
史努比记录器可能很适合您的目的。 它不是一个不可避免的日志记录解决方案,而是一个有用的工具,适合那些喜欢跟踪自己行为的勤奋管理员。
披露:我是史努比维护者。
要处理多个会话而不是覆盖历史文件,您必须将“shopt -s histappend”放在Bash启动文件中。 请参阅同样问题的这个问题。
尝试这个(上面的解决方案不会100%使用bash 4.3):
export HISTTIMEFORMAT="%Y-%m-%d %T " export PROMPT_COMMAND='trap "" 1 2 15; history -a >(tee -a ~/.bash_history | while read line; do if [[ $line =~ ^#[0-9]*$ ]]; then continue; fi; logger -p user.info -t "bash[$$]" "($USER) $line"; done); trap 1 2 15;'
这会记录日志并且它会阻止记录用于bash历史记录文件的时间戳。 需要陷阱,因为bash会在多次按strg + c后将信号发送到“subjob”(用bash 4.3测试)。 这将强制注销当前用户(例如使用sudo登录)
您也可以尝试安装帐户。 Acct会对您的Linux系统上的内容进行详细的审计跟踪。
sudo apt-get install acct