在我工作的地方,出于安全和审计的目的,我们必须为每个会话保留一个历史文件(文件名中的用户、日期、终端等)。
显然,该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
最大的问题是我们无法搜索旧命令,除非对旧文件执行 grep 操作。
您是否有一个简单的解决方法甚至更好的解决方案来保持审核并仍然能够在多个会话之间共享命令历史记录?
我们使用 ksh 和 bash。
答案1
Shell 历史文件是审核命令的一种糟糕方法。用户可以轻松修改或绕过它们。仅当您相信用户不会故意或意外绕过审核机制时,它们才有用。例如,从 GUI、编辑器等启动的命令不会以这种方式记录。用户还有许多其他方式可以启动未记录的命令,甚至可以合理地否认他们这样做是为了方便或没有意识到,而不是故意尝试绕过安全措施。
如果您将历史文件设置为仅追加(这需要chattr +a
以 root 身份运行历史文件),那么记录的所有内容都会被记录下来,但仍然很容易绕过记录。
您可以不保留单独的历史文件保留单个历史文件并定期备份。这将保留执行命令的日期,但不保留终端。
如果您需要确信日志与所执行的命令相对应,那么 shell 历史文件是错误的工具。请改用审核守护程序。将其配置为记录所有execve
呼叫。
auditctl -A exit,always -S execve
请参阅以下问题以获取更多信息:
答案2
我不是 100% 清楚你的要求,但以下是我如何获取每个会话的单独历史记录。它基本上是根据host和pty命名的。这是为了bash。
# Unique history file per shell session.
HISTSIZE=300
HISTFILE=$HOME/.bash_hist_${HOSTNAME/.*/}_$(basename $(tty))
SAVEHIST=500
export HISTCONTROL=ignoredups
这是在一个~/.bashrc
文件中。我不明白你无法更改 HISTFILE 的意思。
一个缺点是您无法预测您将获得哪些会话历史记录。但要审核,您可以 grep 全套:
grep something ~/.bash_hist_*
但您确实将会话的上下文保存在单独的文件中。