サーバー上のすべてのユーザーによるすべてのBashコマンドをログに記録する方法は?


21

私たちの小さな会社はUbuntu Server 11.10を実行しており、そこに数人がSSHアクセスを持っています。実際の端末も時々使用されます。すべてのBashコマンドの実行をユーザーとタイムスタンプと共にローカルに記録するにはどうすればよいですか?

誰も悪名高くなく、積極的にロギングを回避しようとしていると想定できますが、ユーザーがログファイルに直接書き込みアクセスできないようにしたいのです。同時セッションは正しく処理する必要があります。

回答:


32

BASHシェルの場合、システム全体のBASHランタイム構成ファイルを編集します。

sudo -e /etc/bash.bashrc

そのファイルの最後に追加します:

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

新しいファイルで「local6」のログを設定します。

sudo -e /etc/rsyslog.d/bash.conf

そして内容...

local6.*    /var/log/commands.log

rsyslogを再起動します。

sudo service rsyslog restart

ログアウト。ログインしてください。

しかし、ログのローテーションを忘れました:

sudo -e /etc/logrotate.d/rsyslog

同じ方法でローテーションするログファイルのリストがあります...

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message

そのため、そのリストに新しいbash-commandsログファイルを追加します。

/var/log/commands.log

セーブ。


答えに追加したログのローテーションを忘れました。

1
この方法は機能しますが、それに関連するメソッドを作成できます(csh、.bash_logoutを使用するなど)。Sabaconのacctソリューションを使用します。これらは優れた読み取りでした:linuxjournal.com/article/6144およびbeginlinux.com/blog/2010/01/…– user8290

2
これは、単純にPROMPT_COMMAND非bashシェルにリセット、設定解除、または実行することで、ユーザーが簡単に無効にできると思います。
ステファンLasiewski

1
@Benubirdでは、いくつかのプリセットされた施設レベルがあるように見えます。そのうちの8つはlocal0-local7です:en.wikipedia.org/wiki/Syslog。0は緊急を意味し、7はデバッグを意味し、6は7、「正常な動作メッセージ」を意味します。
munchybunch

1
@yukashimaログは削除しないと大きなファイルになる可能性があるため、ローテーションはログファイルをローテーションし、古いファイルを削除してログを小さくすることを意味します...
Badr Elmers

4

この点で、プロセスアカウンティングシステム、特にlastcommおよびacコマンドを提供するacctパッケージが役立つ場合があります。

acコマンドは、ユーザーの接続時間に関する統計を時間単位で出力します。これは、ユーザーがSSHまたはシリアル端末を介してリモートで、またはコンソール上でシステムに接続された時間です。

lastcommコマンドは、以前に実行されたコマンドに関する情報を表示します。最新のエントリはリストの上部に表示されます。各プロセスが使用したCPU時間の合計も表示されます。

役に立つかもしれない古いチュートリアルはこちらです:

http://www.linuxjournal.com/article/6144?page=0,1

lastなどのその他のアカウンティングコマンドは、このチュートリアルで見つけることができます。

http://www.techrepublic.com/article/system-accounting-in-linux/1053377


lastcommはコマンドロガーとしては無意味です。実行された実行可能ファイルのみを記録します。引数、スイッチ、またはパスは記録されません。
Phil_1984_

3

スヌーピーを使用できます。

スヌーピーロガーはあなたの目的にぴったりかもしれません。避けられないロギングソリューションではなく、自分のアクションを追跡することを好む勤勉な管理者にとって役立つツールです。

開示:私はスヌーピーメンテナーです。


回答でそれをインストールして使用する手順を提供してください。
ムル14年

1
詳細なインストール手順は、snoopy githubページで入手できます。これは、現在の主要なsnoopyリソースです:github.com/a2o/snoopy。主要な場所は設計によって維持され、他の場所は維持されないため、他の場所でインストール手順を再度提供します。BTW Readmeが更新され、より構造化されました。
ボストヤンSkufca 14年

1
たぶんそう。ただし、これを使用するために必要な手順の要約さえなければ、これはリンクのみの回答であり、削除される可能性があります。
ムル14年

1
まあ、私は代替と実行可能なソリューションへのポインターを提供しました。それがこのサイトの目的ではない場合、私のアカウントと一緒に削除する必要があります。
ボストヤンSkufca 14年

2
@BostjanSkufca気分を害する必要はありません。少なくとも合理的に自己完結型の答えを持っているのは、単なるStack Exchangeのことです。手順を追加することに強く反対している場合は、それがあなたの願いです。私の下票は残っています。誰かがおそらくそれを支持するでしょう。
ムール14年

3

ここでは、パッチや特別な実行可能ツールを使用せずに、すべてのbashコマンド/ビルトインをテキストファイルまたはsyslogサーバーに記録するスクリプトを見つけることができます。

bashの初期化時に1回呼び出す必要がある単純なシェルスクリプトであるため、展開が非常に簡単です。

それは無料で、あなたのニーズに合うことを願っています。


1
これは良い答えですが、ブログにリンクするのではなく、ステップとスクリプトを答えの本文に含めることをお勧めします。これを含めるように回答を編集してください。
トムブロスマン

2
サイトは現在利用できません
ガイア

0

履歴ファイルを上書きしない複数のセッションを処理するには、Bash起動ファイルに「shopt -s histappend」を配置する必要があります。同じ問題に関するこの質問もご覧ください。


0

これを試してください(bash 4.3では上記のソリューションは100%動作しません):

export HISTTIMEFORMAT="%Y-%m-%d %T "
export PROMPT_COMMAND='trap "" 1 2 15; history -a >(tee -a ~/.bash_history | while read line; do if [[ $line =~ ^#[0-9]*$ ]]; then continue; fi; logger -p user.info -t "bash[$$]" "($USER) $line"; done); trap 1 2 15;'

これはロギングを行い、bash履歴ファイルに使用されるタイムスタンプのロギングを防ぎます。strg + cを複数回押すと、bashは「サブジョブ」に信号を送信するため、トラップが必要です(bash 4.3でテスト済み)。これにより、現在のユーザーのログアウトが強制されます(例:sudoでログイン)


0

acctをインストールすることもできます。Acctは、Linuxシステムで行われていることの詳細な監査証跡を保持します。

sudo apt-get install acct
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.