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

时间:2013-03-29 06:37:22

标签: linux shell unix

我想捕获任何用户在Unix / Linux中输入的所有命令。有很多替代方法,比如使用脚本命令或acct实用程序。但是他们的问题是他们从终端到文件的所有内容都是愚蠢的,或者只是提供命令的摘要。我正在寻找一个实用程序,它将为我提供由任何用户键入的所有命令和命令的参数。可能吗?是否有任何替代方案,如挂钩系统调用来获得这个?

8 个答案:

答案 0 :(得分:7)

我知道这是旧的,但我认为脚本命令可能就是他想要的东西?

> script my_output_file
Script started, file is my_output_file

http://www-users.cs.umn.edu/~gini/1901-07s/files/script.html

答案 1 :(得分:4)

关于shell审计似乎有一篇很好的文章 http://administratosphere.wordpress.com/2011/05/20/logging-every-shell-command/

这可以考虑用户历史文件的可靠性(并提供有关改进的信息),还讨论了shell中内置的显式审计功能。可能是您使用的任何环境都没有启用审计功能编译的shell,但是如果您的构建的源和配置可用(至少对于任何Linux发行版都是如此),它应该是'太难以启用审计功能,同时保持配置的其余部分,因为它在默认分发中。

这种方法仍然会打开的是通过其他命令执行的命令 - 或者从某些程序中调用的操作系统功能。所以,f.ex。如果您在机器上有perl或任何其他编程语言解释器,而您可能可以审计perl的执行,则无法告诉用户告诉perl解释器要做什么。另一方面,即使使用shell审计,我也不确定如果执行f.ex,是否会看到perl执行。从某些编辑器(如vi)中作为过滤器来处理在编辑器中编写的任何内容。

因此,虽然shell审计将为您提供一层审计,但除非您的环境真正与其他执行路径相比,否则增益并不是很好。

您应该考虑要审核的用户是否确实需要shell访问权限 - 如果没有,请为他们提供更有限的内容,并具有审核功能。一个小的基于文本的菜单系统,也许?

答案 2 :(得分:2)

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

其他一切都非常需要根权力。

答案 3 :(得分:2)

您可以使用Snoopy Logger

它是什么: 一个简单的库,它通过LD预加载在进程和execv / e()系统调用之间插入自己。它将所有已执行的命令记录到syslog。

不是什么: 安全/审计解决方案 - 可以轻松规避。 它不记录内置的shell命令(因为它们是内部的,当被调用时,shell不会创建新进程 - 例如echo vs / bin / echo)。

披露:现在的窥探维护者。

答案 4 :(得分:1)

有启用审计,tty记录,黑客和免费工具来做你想做的事情,但是,根据你试图控制的环境的规模,你可能会更好地使用审计和专注于交易的产品面对你想要解决的挑战。在一些金融服务客户上使用的一些非常受欢迎的是{Observe-ITCentrifyPowerBroker

希望这有帮助

答案 5 :(得分:1)

对于零星录音我经常跑

ssh localhost | tee -a recorded-session.log

这很有效。

答案 6 :(得分:0)

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

这些将让你看到所有bash和fish shell命令以及用户输入的args。

答案 7 :(得分: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的发起者,因此您可以对其做出反应。 当然上面的案例检查不是我们真正使用的;) - 但是一个很好的样本。

希望它有所帮助, 麦