7

我想捕获任何用户在 Unix/Linux 中键入的所有命令。使用脚本命令或 acct 实用程序等选项很少。但是他们的问题是他们把从终端到文件的所有东西都弄糊涂了,或者只是提供了命令的摘要。我正在寻找一个实用程序,它将为我提供任何用户键入的所有命令以及命令的参数。是否可以?有没有其他选择,比如在系统调用中挂上钩子来获得这个?

4

8 回答 8

8

我知道这是旧的,但我认为脚本命令可能是他正在寻找的?

> script my_output_file
Script started, file is my_output_file

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

于 2014-01-25T23:19:19.693 回答
5

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

这考虑了诸如用户历史文件的可靠性之类的事情(并提供了有关改进的信息),而且还讨论了内置于 shell 中的显式审计功能。可能是您使用的任何环境都没有启用审计功能编译的 shell,但如果您有可用的构建的源代码和配置(至少对于任何 Linux 发行版都会这样做),它应该在保持其余配置与默认分发版相同的同时启用审计功能并不难。

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

因此,虽然 shell 审计将为您提供一层审计,但除非您的环境确实严格限制了除 shell 之外的其他执行路径,否则收益不会那么大。

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

于 2013-03-29T10:04:13.020 回答
3

您可以使用史努比记录器

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

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

披露:这里是当前的史努比维护者。

于 2014-10-23T18:39:16.823 回答
2

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

其他一切都真正需要根权力。

于 2013-12-12T00:10:03.400 回答
1

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

希望这可以帮助

于 2014-04-03T11:11:57.037 回答
1

对于零星的录音,我通常会运行

ssh 本地主机 | tee -a 记录的 session.log

这工作得很好。

于 2015-11-01T19:57:46.887 回答
0

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

这些将让您查看用户输入的所有带有 args 的 bash 和 fish shell 命令。

于 2013-03-29T09:33:24.347 回答
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 的发起者,因此您可以对其做出反应。当然,上面的案例检查并不是我们真正使用的;)——而是一个很好的样本。

希望它有帮助,吉米

于 2013-12-08T17:44:27.577 回答