我有 Ubuntu 服务器。服务器上允许多个用户操作。他们使用 ssh。
我需要在一个地方保存所有命令行的历史记录,显示时间、用户和命令。我还想阻止用户编辑历史记录文件。一般来说,我需要记录他们在服务器上执行的操作,并阻止他们修改记录。
有没有什么办法可以解决这个问题?
答案1
我相信这是可能的。我会首先为每个用户创建一个日志文件(因为我不确定共享池化历史文件的副作用)。因此,为了举例说明,我将
mkdir /var/log/history
touch /var/log/history/soneil
chown root:soneil /var/log/history/soneil
chmod 660 /var/log/history/soneil
所以我有一个由 root 拥有的历史文件,但“soneil”可以写入。
然后,来点小魔术:chattr +a /var/log/history/soneil
现在‘soneil’只能附加对于历史而言,除了根之外,其他一切都是不可改变的。
所以我已经准备好了日志文件,我只需要使用它。
在 /etc/bashrc 中(在 Ubuntu 上我注意到这是 /etc/bash.bashrc):
export HISTFILE=/var/log/history/$USER
readonly HISTSIZE
readonly HISTFILE
readonly HISTIGNORE
readonly HISTCONTROL
readonly 内置命令相当不言自明,我相信也同样适用于 SvenW 的功能。
经过测试,这与普通历史文件有同样的问题;它是在注销时写入的,并且没有时间戳。因此事件的排序会很混乱。我想如果我必须自己做这件事,我会添加
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
readonly PROMPT_COMMAND
每次绘制新提示时强制将历史记录刷新到磁盘。还有一个 HISTTIMEFORMAT
envar,它将向历史文件添加时间戳,但格式不太美观(将 var 设置为更美观的格式只会影响“历史记录”的输出,而不会影响文件本身的内容)。
答案2
我认为你想做的事情实际上是不可能的。你主要担心谁更改了文件,还是明确希望看到他们曾经pico
这样做过?如果是前者,您可以使用具有日志记录功能的共享文件系统(即 NFS、Samba)并以此方式挂载用户目录。根据配置,这将记录每个文件操作。
- - 编辑
再仔细想想,我想您可以使用陷阱来做您想做的事情,但这是一个黑客解决方案,并且会阻止某些 bash 功能:
将以下内容放入您的/etc/bashrc
(或类似内容):
function commandlogger
{
LASTENTRY=$(fc -ln -0)
logger -p local1.info -t commandlogger -i -- "${USER} - ${LASTENTRY}"
}
trap commandlogger DEBUG
每当用户输入命令时,都会触发 bash 陷阱,然后将该命令记录到系统日志中。然后您可以grep
通过它查找标签commandlogger
。此外,只有在下一个命令之后才会记录条目。
答案3
正如 Khaled 所说,处理此问题的最佳方法不是允许很多人使用 ssh 登录同一个帐户,而是为每个用户提供自己的登录名,并让他们通过使用共享帐户的权限执行单个命令来获取权限。
如果您这样做,sudo 不仅会使用 syslog 将记录到系统日志中,而且如果您需要一份关于谁做了什么的明确的防篡改记录,您还可以将这些 syslog 发送到中央日志主机,任何用户都无权访问该主机。
编辑:我刚刚尝试通过启用进程记帐来做到这一点,尽管这为我提供了每个用户运行的每个命令的明确列表,但它似乎没有记录参数和标志,只记录命令本身。有人知道有什么方法可以lastcomm
报告参数和标志吗?