如何在Unix/Linux中捕获任何用户键入的所有命令?

7
我想记录任何用户在Unix/Linux中键入的所有命令。 有一些选择,如使用脚本命令或acct实用程序。但它们的问题是它们将终端上的所有内容都写入文件,或者只提供命令的摘要。我正在寻找一个工具,可以为我提供任何用户键入的所有命令及其参数。这可能吗?是否有其他选择,例如制作一个钩子以获取系统调用?

2
Shell历史记录是一个可行的选择吗? - wei2912
我不想使用bash或其他shell提供的历史记录。 - vinayag
1
在此链接 http://serverfault.com/questions/470755 上有一篇非常好的回答,介绍如何记录生产服务器上管理员运行的所有命令。 - IvanD
8个回答

8

5

看起来在http://administratosphere.wordpress.com/2011/05/20/logging-every-shell-command/有一篇很好的关于shell审计的文章。

这篇文章考虑了用户历史文件的可靠性(并提供改进信息),还讨论了内置于shell中的显式审计功能。也许你使用的环境没有启用审计功能编译的shell,但如果您有构建源代码和配置的可用性(至少对于任何Linux发行版),应该不难在保持默认发行版的情况下启用审计功能。

这种方法仍然会留下通过某个命令或从某个程序中调用的操作系统功能执行的命令。因此,例如,如果您在计算机上有perl或任何其他编程语言解释器可用,尽管您可能可以审计perl的执行,但无法知道用户告诉perl解释器要做什么。另一方面,即使进行了shell审计,我不确定是否可以看到从编辑器(如vi)内部作为过滤器执行perl的执行。

因此,尽管shell审计将为您提供一层审计,但除非您的环境真的针对与shell不同的其他执行路径进行了加强,否则收益并不是很大。

您应该考虑需要审计的用户实际上是否需要shell访问权限,如果没有,请为他们提供一个更有限但具备审计功能的小型文本菜单系统?


4
你可以使用Snoopy Logger它是什么: 一个简单的库,通过LD预加载在进程和execv / e()系统调用之间插入自己。它将所有执行的命令记录到syslog中。 它不是什么: 安全/审计解决方案-可以轻易绕过。 它不会记录内置的shell命令(因为它们是内部的,当调用时,shell不会创建新进程-例如echo与/bin/echo)。
披露:当前的Snoopy维护人员在这里。

2

获取bash源代码。在exec调用周围添加记录器。编译它。在登录后将其作为第一个命令运行。

其他所有内容都需要root权限。


1

对于偶尔录制,我通常运行

ssh localhost | tee -a recorded-session.log

这个方法效果很好。


1

有启用审计、tty录制、黑客和免费工具可供使用,但是根据您试图控制的环境规模,您最好同时使用审计和专注于解决您想要解决的挑战的产品。一些非常受欢迎的产品,被一些金融服务客户使用,包括[Observe-IT, CentrifyPowerBroker]

希望这有所帮助


0

最简单的解决方法是,如果您是root用户并且有权限更改系统文件,则可以通过重定向控制台本身来实现:

如果您使用例如/bin/sh作为默认控制台,请将其移动到/bin/hs并在/bin/sh下创建一个类似于此的文件:

#!/bin/hs

ORIGSHELL=/bin/hs
LOGFILE=/var/log/whatyoulike

OPTIONS="$@"

USER=`whoami`
WEBUSER=web
WILD=NO
WARN=NO



if [ "$USER" = "$WEBUSER" ]
then

  #Ok then - are we doing something wild?
  for ARG in $@
  do
    case "$ARG" in
    *\/lynx)
      WILD=YES
      ;;
    *\/wget)
      WILD=YES
      WARN=YES
      ;;
    *\/curl)
      WILD=YES
      WARN=YES
      ;;
    *\/links)
      WILD=YES
      WARN=YES
      ;;
    *\/fetch)
      WILD=YES
      WARN=YES
      ;;
    esac
  done

  #Are we wild?
  if [ "$WILD" = "YES" ]
  then
    HOST=`hostname`
    IPADDR=`resolveip -s $HOST`
    NETSTAT=`/usr/bin/nighthawk -ape --numeric-hosts --numeric-ports --tcp | grep 'ESTABLISHED web'`

    # Log it.
    echo "`date` [$USER] $IPADDR "$@"" >> $LOGFILE
    echo "$NETSTAT" >> $LOGFILE
  fi
  #Are we REALLY wild?
  if [ "$WARN" = "YES" ]
  then
    # Mail it!
    mail -s 'HACKATTACK' youremail@domain.com < $LOGFILE &
  fi
fi

# Now, do it.
exec $OPERATION "$@"

#we never come here...
exit 0

这只是一个例子,展示如何透明地跟踪所有内容。您可以自由检查输入。

上面的脚本用于查找当前 shell 的发起者,以便您可以对其做出反应。

当然,上述情况检查并不是我们真正使用的检查方式 ;) - 但是它是一个很好的样本。

希望能有所帮助, Jimmy


这看起来是一个非常危险的想法,因为它替换了系统 shell。 - Alien Life Form

0

获取 /home/victim/.bash_history/home/victim/.config/fish/fish_history

这些将让您查看用户输入的所有 bash 和 fish shell 命令及其参数。


1
问题创建者明确表示不想使用历史记录。 - Jimmy Koerting

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接