从表面上看,修复 ksh 以使历史记录无法更改相当容易。我已经看到了所有建议,使 HIST* 环境变量为只读,以及使用 chattr 使历史记录文件仅可追加(使用 chattr +a .sh_history)。
但是,Bash 有两个功能似乎无法阻止历史记录更改:history 命令(使用 history -c 和 history -d)以及将历史记录文件与实际运行时历史记录(保存在内存中)分开。我还在 serverfault 上读到,如果您终止当前 shell,则历史记录将不会被写出。
有什么方法可以防止 Bash 的历史记录被更改?我希望能够保存所有用户命令,而用户无法从历史记录中删除任何内容。
也欢迎任何有关 Korn shell 的进一步提示。(我知道 ksh-93 审计……不知道我们是否可以使用它。)
答案1
这是将所有执行的命令发送到系统日志服务器的解决方案。
http://blog.rootshell.be/2009/02/28/bash-history-to-syslog/
博客文章摘录
这里有两种方法可以将用户执行的所有命令的副本发送到 Syslog 服务器。第一种方法将使用 Bash“陷阱”功能。第二种方法是在 Bash 源代码中应用补丁。
使用陷阱
只需在 /etc/profile 中添加以下几行:
function log2syslog
{
declare command
command=$(fc -ln -0)
logger -p local1.notice -t bash -i — $USER : $command
}
trap log2syslog DEBUG
/etc/profile
在启动 Bash 时解析并执行。目标是使用 trap 功能并在用户每次生成活动时调用一个函数。trap 函数 (log2syslog) 将从历史记录中提取最后一个命令并使用 logger 命令将其记录到 Syslog。实现起来非常容易,但这种方法:
spawns new process at each command logged (can have a negative effect when the server activity is high)
is not transparent to the user (regular users can’t edit /etc/profile but can read it!)
这就是为什么第二种方法会更受青睐。 使用补丁
方法是在 Bash 源代码树上打补丁,然后重新编译 shell。它需要一个带有编译器和源代码的环境,但这种方法会占用更少的 CPU,而且完全透明!
补丁示例如下:这里. 手动将补丁应用到 Bash 4 源代码树需要五分钟。
以下是 Syslog 消息的示例:
Feb 27 19:30:51 honey bash: HISTORY: PID=21099 UID=1000 echo foo!
答案2
如果你想记录用户的行为,请查看史努比。它也可以作为 CentOS 的安装包使用。