防止 Linux 中的 bash(和 ksh)历史记录被更改

防止 Linux 中的 bash(和 ksh)历史记录被更改

从表面上看,修复 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 的安装包使用。

相关内容