ユーザーのbashコマンドをログに記録するにはどうすればよいですか?


10

私はユーザーがsshを介して(うまくいけば)chroot jailにログインするdebian etchサーバーを実行しています。削除したり、防止したりできない方法で、実行したコマンドをログに記録するにはどうすればよいですか?


回答:


11

スヌーピーをインストールします。1人のユーザーだけをログに記録したい場合は、syslogフィルタリングfuを実行します。


すべてのユーザーをログに記録したい。
Malfist 2009

次に、インストールするだけで、「動作する」(TM)
Cian

/var/log/auth.log以外の場所にログを記録するように設定できますか?
Malfist 2009

それはsyslogに行くので、そこからどこにでもそれをフィルタリングすることができます、iirc。私はこれまでにsyslog-ngで何かをしたことがないので、私が恐れている通常のsyslogを使用するフィルターについては知りません。
Cian、

4

パッチや特別な実行可能ツールを使用せずに、すべての「bash」コマンド/ビルドをテキストファイルまたは「syslog」サーバーに記録する方法を書きました。

「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

スヌーピーを使用したCianの回答は、あなたが探しているものに似ているようです。
半径

0

grsecurityパッチカーネルを使用します。この目的のためのカーネルオプションがあります。


-1

システム監査を有効にすることができます。


1
そして、どうやってそれを行うのですか?
Rory

auditdのmanページから始めて、そこから進んでください。これは基本のDebianインストールの一部ではない可能性がありますが、監査機能はLinuxカーネルコンポーネントであるため、ユーザーランドツールを任意のディストリビューションにインストールして使用できます。
Geoff Fritz

-3

bashは、指定されたサイズのコマンド履歴を保持します。管理者はそのサイズを設定でき、cronを介してユーザーごとに履歴を取得して取得するスクリプトを簡単に作成できます。


1
.bash_historyはセキュリティのためではなく、便宜上のものです。これにはいくつかの理由がありますが、ユーザーが編集可能(または少なくとも追加可能)であるという理由も少なくありません。
マット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.