我希望输入的每条命令都发送到日志服务器。 syslog-ng 已配置为将所有日志发送到日志服务器。
我对实现此目的的所有方法都很感兴趣。我期望讨论一些关于恶意用户和安全性的问题,但第一个主要目标只是让会话记录下来。所有会话都通过 ssh 进行,但控制台连接命令也应记录下来。我希望这适用于任何 shell,但主要的 shell 是 bash。(同样,我知道恶意用户可以创建自己的 shell...)
答案1
这不是解决问题的方法。一旦你将 shell 访问权限授予用户,你就委托该用户执行他/她有适当权限执行的任何操作。忘记命令记录吧,在任何 Unix 系统中,执行命令的方法太多了。
例如,用户可以启动邮件客户端(pine
例如,记录的唯一命令是),在其中选择“撰写”,这将启动 VI,然后从 VI 通过 启动他想要的任何命令:!cmd
。此命令不会记录在任何地方,从系统的角度来看,它就像 VI 调用的任何辅助应用程序,如 grep 或 sort。shell 记录的唯一命令是pine
。
看来你真正想要的是审计. 启用审计子系统并使用来自的auditctl
命令和守护进程auditd
审计包来控制记录的内容。更多信息请参阅审计控制(8)手册页。
请注意,记录每个进程实例也可能不是最佳选择。例如,./configure
软件包的简单版本(使用 autotools 创建)以创建数千个进程实例而著称。这将使审计日志充斥着大量噪音,以至于以后很难对其进行分析。
答案2
安装acct
软件包(软件包名称因发行版而异,也称为进程记帐)并使用lastcomm <username>
:
[mithrandir]-[/home/sernin]-[1951] % lastcomm sernin
tr sernin pts/2 0.00 secs Fri Nov 12 12:02
zsh F sernin pts/2 0.00 secs Fri Nov 12 12:02
tr sernin pts/2 0.02 secs Fri Nov 12 12:02
zsh F sernin pts/2 0.00 secs Fri Nov 12 12:02
fortune sernin pts/2 0.00 secs Fri Nov 12 12:02
xmodmap sernin pts/2 0.00 secs Fri Nov 12 12:02
xrdb sernin pts/2 0.00 secs Fri Nov 12 12:02
sh sernin pts/2 0.00 secs Fri Nov 12 12:02
cpp sernin pts/2 0.00 secs Fri Nov 12 12:02
您还可以按 tty 或命令名称进行搜索。像往常一样,man lastcomm
获取更多信息。
答案3
如果您愿意进行一些 C 编程,您可以通过编写一个包装 execve 的库来实现此目的,记录到 syslog,然后 dlopen 包含实际 execve 系统调用的库。然后在 /etc/environment 中,将 LD_PRELOAD 设置为您创建的库的路径。
您需要小心在此处进入循环,因此您可能只想记录某些二进制文件的可执行文件,或者排除其他文件(如 syslog)的记录。
答案4
让用户使用 sudo(或类似命令)来运行您关心的命令,并在某种程度上信任用户,这样可能更好。随着您越来越接近“完全控制”事物,追踪他们所做的事情就越困难。例如,我最近一直在研究这样的工具。大多数情况下,它们只是创建日志,如果您有足够的用户和机器来让这样的事情变得有价值,那么这些日志就很难管理。:)
考虑一下您将生成的所有信息。您关心其中多少?可能很少 - 因此您生成的日志大多毫无价值。像其他人建议的那样,审核您真正关心的内容可能会让您获得更好的最终状态。