如何记录用户的bash命令?


Answers:


11

安装史努比。如果只想记录一个用户,请执行一些syslog过滤。


我想记录每个用户。
Malfist

然后只要安装它,它就会“正常工作”(TM)
Cian

我可以将其设置为/var/log/auth.log之外的其他地方登录吗?
Malfist

它进入syslog,因此您可以将其过滤到iirc。我只用syslog-ng做过任何事情,所以恐怕我不知道使用常规syslog的过滤器。
Cian

4

我编写了一种方法,无需使用修补程序或特殊的可执行工具即可将所有“ bash”命令/内建命令记录到文本文件或“ syslog”服务器中。

部署非常容易,因为它是一个简单的shellscript,需要在“ bash”初始化时调用一次。(例如,仅从.bashrc中“获取”它)是基于使用bash DEBUG陷阱的想法。另请参阅superuser.com上的这篇文章

declare -rx HISTCONTROL=""                                  #does not ignore spaces or duplicates
declare -rx HISTIGNORE=""                                   #does not ignore patterns
declare -rx AUDIT_LOGINUSER="$(who -mu | awk '{print $1}')"
declare -rx AUDIT_LOGINPID="$(who -mu | awk '{print $6}')"
declare -rx AUDIT_USER="$USER"                              #defined by pam during su/sudo
declare -rx AUDIT_PID="$$"
declare -rx AUDIT_TTY="$(who -mu | awk '{print $2}')"
declare -rx AUDIT_SSH="$([ -n "$SSH_CONNECTION" ] && echo "$SSH_CONNECTION" | awk '{print $1":"$2"->"$3":"$4}')"
declare -rx AUDIT_STR="[audit $AUDIT_LOGINUSER/$AUDIT_LOGINPID as $AUDIT_USER/$AUDIT_PID on $AUDIT_TTY/$AUDIT_SSH]"
set +o functrace                                            #disable trap DEBUG inherited in functions, command substitutions or subshells, normally the default setting already
shopt -s extglob                                            #enable extended pattern matching operators
function audit_DEBUG() {
  if [ "$BASH_COMMAND" != "$PROMPT_COMMAND" ]               #avoid logging unexecuted commands after 'ctrl-c or 'empty+enter'
  then
    local AUDIT_CMD="$(history 1)"                          #current history command
    if ! logger -p user.info -t "$AUDIT_STR $PWD" "${AUDIT_CMD##*( )?(+([0-9])[^0-9])*( )}"
    then
      echo error "$AUDIT_STR $PWD" "${AUDIT_CMD##*( )?(+([0-9])[^0-9])*( )}"
    fi
  fi
}
function audit_EXIT() {
  local AUDIT_STATUS="$?"
  logger -p user.info -t "$AUDIT_STR" "#=== bash session ended. ==="
  exit "$AUDIT_STATUS"
}
declare -fr +t audit_DEBUG
declare -fr +t audit_EXIT
logger -p user.info -t "$AUDIT_STR" "#=== New bash session started. ===" #audit the session openning
#when a bash command is executed it launches first the audit_DEBUG(),
#then the trap DEBUG is disabled to avoid a useless rerun of audit_DEBUG() during the execution of pipes-commands;
#at the end, when the prompt is displayed, re-enable the trap DEBUG
declare -rx PROMPT_COMMAND="trap 'audit_DEBUG; trap DEBUG' DEBUG"
declare -rx BASH_COMMAND                                    #current command executed by user or a trap
declare -rx SHELLOPT                                        #shell options, like functrace
trap audit_EXIT EXIT  

请参阅此处详细说明的方法:http : //blog.pointsoftware.ch/index.php/howto-bash-audit-command-logger

欢呼弗朗索瓦·舒尔勒


2

您可以尝试ttyrpld。它超出了您的期望,因为它将记录整个tty。
我还没有亲自使用过它,但是它的工作方式(在内核中)使该用户无法更改日志。


很酷,我会检查一下。如果一切都很好,那将是我所需要的。我可以将其日志文件更改为仅添加以确保
Malfist

使用史努比的前人答案似乎更像您想要的。
半径


-1

您可以启用系统审核。


1
以及如何做到这一点?
罗里

从要审核的手册页开始,然后从那里开始。它可能不是Debian基本安装的一部分,但是审核工具是Linux内核组件,因此可以在任何发行版上安装和使用userland工具。
Geoff Fritz,2010年

-3

bash保留指定大小的命令历史记录。您可以由管理员设置该大小,并轻松编写一个脚本,该脚本可以通过cron来获取每个用户的历史记录。


1
.bash_history是为了方便,而不是为了安全。造成这种情况的原因很多,其中最重要的是它是用户可编辑的(或至少是可附加的)。
马特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.