我们想要跟踪一台 Centos7 机器上的用户活动。为此,管理层决定使用脚本和剧本重播基本上记录用户活动并重播它。我对如何设计它进行了一些研究,但是依赖auditd的解决方案在这里被管理层拒绝,并且将脚本放入用户的.profile中会导致一些问题,如下所述。
预期的行为如下:
- 当用户通过 SSH 登录到服务器时,脚本命令会生成并开始将用户活动记录到文件中。
- 当用户在服务器上完成操作后,他会注销(通常键入 exit 或 CTRLD)。
- 脚本进程停止并关闭文件。
现在的问题是:
我的研究表明脚本实际上创建了另一个 shell。因此,如果我将 - 比方说 - 脚本 script.log 放入每个用户(或 skel)的 .bash_profile 中,它将在登录后为用户发出一个新的 shell,并且用户可以轻松中止该进程并开始在中键入命令他通常的 SSH 会话。 当用户退出脚本命令生成的 shell 时,如何强制我的脚本真正将用户踢出?
脚本输出(即用户的命令)应存储在非 sudo 者无法执行任何操作(无 R/W/E 权限)的私有位置。当用户本身没有特权时,我们如何在用户登录时以提升的特权运行脚本?
答案1
至于强制命令,sshd
有一个ForceCommand
选项:
强制执行由 ForceCommand 指定的命令,忽略客户端和 ~/.ssh/rc(如果存在)提供的任何命令。该命令是通过使用用户的登录 shell 和 -c 选项来调用的。
这适用于 shell、命令或子系统执行。它在 Match 块内最有用。客户端最初提供的命令可在 SSH_ORIGINAL_COMMAND 环境变量中找到。
因此,从阅读内容来看,如果您设置ForceCommand
为script
,那么应该大致可以满足您的要求。
为了保持审计跟踪的安全,多服务器系统中的一种解决方案是从系统日志中学习并通过网络将条目发送到不同的物理主机。这几乎阻止了用户在生成日志后访问日志。如果其他任何事情都失败,您可能可以配置一些东西,将日志发送到本地主机上的另一个端口,在那里守护进程收集并存储它们。 (尝试过显而易见的方法后,您不能,script -f /dev/tcp/localhost/8888
因为/dev/tcp/...
需要由 bash 处理,所以我想您需要mkfifo
自己一条通信路径,如手册页示例script -f
)