从 Linux 服务器上的远程用户获取命令历史记录

从 Linux 服务器上的远程用户获取命令历史记录

我有一个Linux服务器(CentOS),许多用户可以通过ssh.我需要从用户那里获取所有历史命令:

  • 日期:执行时间
  • pwd:可执行目录
  • 远程主机ip
  • 用户
  • 命令

答案1

由于您正在寻找的信息并且您没有提供太多信息(Linux 的发行版、版本、应用程序、用例),因此这个问题的答案相当复杂。

您将需要组合至少两组日志(如果不是更多)才能解决这个问题,除非您编写一些自定义的东西来做到这一点,否则将需要大量的工作来审核系统每天、每周、甚至每月都这样。您最好解决 sudoers 文件的任何问题并研究如何控制和审核用户,而不是事后查看如何找到此信息。

/var/log/secure(RHEL/CentOS、Debian 的 /var/log/auth.log,根据您的发行版和设置进行更改)应该显示人们何时通过 SSH 连接以及何时使用 sudo 执行命令;使用 grep,你可以找到他们的 IP,然后从那里你可以获得他们的连接历史记录:

grep '$USER_NAME' /var/log/secure

向我展示了这样的输出(当然,是经过修饰的):

Nov  1 22:38:41 $HOSTNAME sshd[26732]: Accepted publickey for $USERNAME from $IP_ADDRESS port 51203 ssh2: RSA $HASH
Nov  1 22:38:41 $HOSTNAME sshd[26732]: pam_unix(sshd:session): session opened for user $USERNAME by (uid=0)
Nov  1 22:38:41 $HOSTNAME systemd-logind[471]: New session 3427 of user $USERNAME.
Nov  1 22:38:41 $HOSTNAME systemd: pam_unix(systemd-user:session): session opened for user $USERNAME by (uid=0)
Nov  1 22:46:37 $HOSTNAME sudo:     $USERNAME : TTY=pts/0 ; PWD=$HOME ; USER=root ; COMMAND=/bin/grep $USERNAME /var/log/auth.log
Nov  1 22:46:37 $HOSTNAME sudo: pam_unix(sudo:session): session opened for user root by $USERNAME(uid=0)

因此,从 secure/auth 日志中,我已经可以看到 IP 地址、用户名、连接时间戳、用户执行的所有特权命令及其时间戳。

您可以通过将 $USER_NAME 替换为用户的用户名并执行此命令来查看用户命令的完整历史记录,但不带时间戳。这也会无意中显示它们所在的目录。

su -c "history" $USER_NAME

从用户那里向我展示了这个

500  exit
501  ls
502  cd Archive
503  ls
504  rm -rf *.NOTREAL
505  cd ../

我知道这个人(实际上是我,为此获取了现实世界的例子)在第一次连接 SSH 时执行了命令 501,因为 exit 是它前面的命令(这是一个不好的指示器,因为如果他们超时而不是使用退出?),但一旦连接,它们就会移至 Archive 目录并删除所有 .NOTREAL 文件,然后移至父目录。

根据我在安全/身份验证日志中找到的内容和用户的历史记录,我通常可以弄清楚他们在什么时间做了什么,但这是一个松散的关联。如果您让用户执行诸如通过 ssh 连接之类的操作,然后执行 sudo su - 或 sudo -i 以 root 身份运行所有操作,那么这会变得更加困难,因为历史记录最终会合并。

如果您确实想监视这样的事情,那么您确实需要查看如何设置特权用户帐户、sudoers 文件、日志记录和应用程序。我已经为您提供了一种非常基本的方法来解决这个问题,但这远不是最好的方法,而且它远不能在现实场景中定期使用。

相关内容