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

如何捕获任何用户在Unix/Linux中键入的所有命令?,linux,shell,unix,Linux,Shell,Unix,我想捕获任何用户在Unix/Linux中键入的所有命令。除了使用脚本命令或acct实用程序之外,几乎没有其他选择。但它们的问题是,它们将从终端到文件的所有内容都隐藏起来,或者只是提供命令的摘要。我正在寻找一个实用程序,它将提供给我所有的命令键入的任何用户与参数的命令。可能吗?有没有其他方法,比如在系统调用中挂接一个钩子来实现这一点 抓取/home/victor/.bash\u历史或/home/victor/.config/fish/fish\u历史 这些命令将让您看到所有bash和fish sh

我想捕获任何用户在Unix/Linux中键入的所有命令。除了使用脚本命令或acct实用程序之外,几乎没有其他选择。但它们的问题是,它们将从终端到文件的所有内容都隐藏起来,或者只是提供命令的摘要。我正在寻找一个实用程序,它将提供给我所有的命令键入的任何用户与参数的命令。可能吗?有没有其他方法,比如在系统调用中挂接一个钩子来实现这一点

抓取
/home/victor/.bash\u历史
/home/victor/.config/fish/fish\u历史


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

这考虑了用户历史记录文件的可靠性(并提供了有关改进的信息),但也讨论了内置于shell中的显式审计功能。可能您正在使用的任何环境都没有启用审计功能来编译shell,但是如果您有构建可用的源代码和配置(至少对于任何Linux发行版都是如此),在保持其余配置与默认发行版相同的情况下,启用审核功能应该不会太难

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

因此,虽然shell审计将为您提供一层审计,但除非您的环境与shell以外的其他执行路径进行了严格的对比,否则收益并不是很大


你应该考虑被审计的用户是否真的需要shell访问——如果不是,提供他们更有限的审计能力。一个小型的基于文本的菜单系统,也许是解决这个问题的最简单方法,如果您是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
#/银行标识代码/hs
ORIGSHELL=/bin/hs
LOGFILE=/var/log/whatyoulike
选项=“$@”
USER=`whoami`
WEBUSER=web
野=否
警告=否
如果[“$USER”=“$WEBUSER”]
然后
#那好吧,我们是在做一些疯狂的事情吗?
对于ARG in$@
做
中的大小写“$ARG”
*\/(猞猁)
野=是
;;
*\/(工作组)
野=是
警告=是
;;
*\/卷曲)
野=是
警告=是
;;
*\/链接)
野=是
警告=是
;;
*\/取回)
野=是
警告=是
;;
以撒
完成
#我们疯了吗?
如果[“$WILD”=“是”]
然后
主机=`hostname`
IPADDR=`resolveip-s$HOST`
NETSTAT=`/usr/bin/nightwawk-ape--数字主机--数字端口--tcp | grep“已建立的web”`
#记录下来。
echo“`date`[$USER]$IPADDR”$@”“>>$LOGFILE
echo“$NETSTAT”>>$LOGFILE
fi
#我们真的很疯狂吗?
如果[“$WARN”=“是”]
然后
#寄出去!
邮件-s‘黑客攻击’youremail@domain.com<$LOGFILE&
fi
fi
#现在,去做吧。
exec$操作“$@”
#我们从未来过这里。。。
出口0
这只是一个例子,如何使用它来跟踪所有透明的内容。您可以执行您想要检查输入的操作。 上面的脚本甚至用于查找当前shell的发起人,因此您可以对其作出反应。 当然,上述案例检查并不是我们真正使用的;)-但这是一个很好的样本

希望有帮助,
Jimmy

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


其他所有东西都需要root权限。

我知道这很旧,但我认为script命令可能就是他想要的

> script my_output_file
Script started, file is my_output_file

可以使用审计、tty记录、黑客和免费工具来做您想做的事情,但是,根据您试图控制的环境的规模,您可能会更好地使用审计和专注于应对您想要解决的挑战的产品。一些相当流行的,用于一些金融服务客户的是[,和]

希望这对您有所帮助

您可以使用

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

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


披露:目前史努比的维护者在这里。

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

ssh localhost | tee-a recorded-session.log


这非常有效。

shell历史记录是一个可行的选项吗?我不想使用bash或任何其他shell提供的历史记录。很好的回答是:问题创建者明确希望不使用历史记录。这看起来是一个非常危险的想法,因为它取代了系统shell。