Shell - 处理多个命令历史文件

tmo*_*mow 5 bash ksh command-history

在我工作的地方,出于安全和审计目的,我们必须为每个会话保留一个历史文件(文件名中的用户、日期、终端等)。

显然,该HISTFILE变量设置为只读 ( readonly HISTFILE),因此普通用户无法设置不同的历史文件(要么不是 root 用户,要么不更改/etc/profile)。

这是我们在/etc/profile

EXTENDED_HISTORY=ON
readonly EXTENDED_HISTORY
export EXTENDED_HISTORY
HISTFILE=$HOME/.history/`date +%y%m%d.%H%M%S`.${WHO_USER:-user}.${WHO_TERMINAL:-term}.${SSH_PORT:-port}.${MY_PID:-pid}
readonly HISTFILE
export HISTFILE
Run Code Online (Sandbox Code Playgroud)

最大的问题是我们无法搜索旧命令,除非对旧文件执行 grep。

您是否有一个简单的解决方法甚至更好的解决方案来保持审计并仍然能够在多个会话之间共享命令历史记录?

我们使用 ksh 和 bash。

Gil*_*il' 7

Shell 历史文件是一种很差的审计命令的方式。用户可以轻松修改或绕过它们。只有当您相信用户不会故意或意外绕过审计机制时,它们才有用。例如,从 GUI、编辑器等启动的命令不会以这种方式记录。用户可以通过许多其他方式启动未记录的命令,甚至可以合理地否认他们这样做是为了方便或没有意识到这一点,而不是故意绕过安全措施。

如果您将历史文件设置为仅附加(这需要chattr +a以 root 身份在历史文件上运行),那么已记录的所有内容都会保持记录状态,但绕过记录仍然很容易。

您可以保留一个历史文件并定期备份,而不是保留单独的历史文件。这将保留执行命令的日期,但不保留终端。

如果您需要确信日志与执行的命令相对应,shell 历史文件是错误的工具。请改用审计守护程序。将其配置为记录所有execve呼叫。

auditctl -A exit,always -S execve
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅以下问题: