履歴エントリにネットワークまたはユーザーソース接続データを追加するにはどうすればよいですか?


8

管理しているシステムのすべてのユーザーの履歴設定を変更したいと思います。以下のような接続端末からの情報を含めたいwho

sysadmin:/ # who
sysadmin  pts/0        Mar 26 07:11 (sysadmin.doofus.local)

現在、以下の方法で履歴を変更しています。これらの設定の多くがここで何度か取り上げられていることは知っています。ただし、私はこのコードを「Linuxシステム管理レシピ:Juliet Kemp」から抜粋してずっと前に作成しました。

shopt -s histappend
PROMPT_COMMAND='history -n;history -a'
HISTSIZE=100000
HISTFILESIZE=100000
HISTTIMEFORMAT="%m/%d/%y %T  "

shopt -s histappend 複数の端末を開いているときの問題が修正され、情報が失われる場合があります。

PROMPT_COMMAND='history -n;history -a' 複数の端末間で履歴にリアルタイムで追加できるように拡張されています。

HISTSIZE=100000 HISTFILESIZE=100000history保存 期間を延長します

HISTTIMEFORMAT="%m/%d/%y %T "履歴の各行の前にタイムスタンプを付けます

通常得られるもの history

835  ls
836  cd ..

私が変更した現在のhistory結果

5853  03/26/12 07:16:49  ls
5854  03/26/12 07:16:50  ll

history見たいからの帰り

5853  03/26/12 07:16:49  sysadmin.doofus.local    ls
5854  03/26/12 07:16:50  sysadmin.doofus.local    ll

001  03/26/12 05:11:29  demo_user.doofus.local    cd
002  03/26/12 05:11:30  demo_user.doofus.local    ll

私はそのDNS名前を見て「結婚」していません。それがそこからプルしwhoたり、他の場所からプルしたりする場合にのみ、それを必要とするでしょう。ルックアップやクエリを実行する必要はありません。IPアドレスでよかったです。

002  03/26/12 05:11:30  192.168.0.2    ll

どうして?私は、同じグループの複数のユーザーが毎日のタスクを実行するために共有するユーザーIDを持つ複数のシステムを管理しています。これにより、組織内の実際の場所と実際のユーザーを、彼らが履歴で行ったことと関連付けることができます。

これは最適ではないので変更したいと思いますが、船に乗っているときはクルーズライナーのサイズなので、ヘアピンを回転させようとはしません。(注:乗客が船外で投げようとした場合)

とにかく、それらをより良いソリューションに移行できるようになるまで、この追跡機能を使用したいと考えています。

また、私のhistory変更に現在使用しているものについて推奨事項がある場合は、ぜひお聞かせください。

おかげで、

編集:1

他のプログラムを実行したり、「理由の範囲内」で追加の設定をしたりしたくありません。

0オーバーヘッドを追加したいのですが、追加する必要がある場合は、それを小さくする必要があります。

同じユーザー:パスワードでシステムにログインした10人のユーザーのうちどれがそれを実行したかを確認したい(何かが発生した場合)自分のユーザーを信頼します。または、ユーザーではなかったかもしれませんが、cron何かをするためにユーザーとして接続を実行するシステムで忘れられた可能性があります。または、アプリケーションEx:BMC Control-M接続しsshてタスクを実行します。最小限の労力でそれを追跡できるので、「悪意のあるユーザー」を見つけることではありません。

編集2:

システムはSLESおよびRHELを実行している


1
プロセスアカウンティングのような音が役立つ場合があります。シェルの履歴はロギング用に設計されたことはありません。それを使用したい場合は、すべてのユーザーを信頼する必要があります。参照活動の監視に関連する質問関連する答えを
jw013 2012年

@ jw013コメントありがとうございます。ただし、それを構成および管理する必要があり、さらに、私が読んだ情報を提供したので/proc /dev、などの/homeディレクトリやユーザーディレクトリを除外することをお勧めします。これはオーバーヘッドを追加します。一方でhistory「静的」という方法や、変数やファイル入力に保存されている設定することができ、この情報はすでに利用可能でない場合は...既に記録されており、その接続情報は、IPなどを接続するシステムに知られているhistoryレコードとパフォーマンスヒットを非常に小さい、または0になります
2BC

これがLinux上にある場合は、の使用を検討してくださいauditd。そのログで十分な情報が得られるかどうかはわかりません。あなたが望むものの難しさは、正確に共有アカウントがとても非難されている理由です。
Gilles 'SO-悪をやめる'

それはLinux上にあります。それを明確にするために質問を編集します。変更を監視するために何を指示する必要auditdがあるのとよく似inotifyています。個々のファイル、ディレクトリなど。そのレベルの構成には行きたくありません。実際(私はそうします)が、本質的にはあまり気にしません。私はそれpuppetを処理しなければなりません。auditdには、追加の負荷とセットアップ時間も付属しています。アカウントが何かを変更している場合、私はまだ履歴を振り返って、誰が何をログインして試行しているかを確認したいと思います。
2bc 2012年

2
hm、PROMPT_COMMAND=次のプロンプトの前に通常のコマンドを実行するだけなので、履歴ファイルの最終行で情報を追加するsed / awkを呼び出す関数を作成できませんでした。次に、その関数を呼び出してPROMPT_COMMAND=データを追加しますか?それはハッキーですが、仕事をする必要があります。
llua

回答:


1

lluaの提案から、もう少し歴史を扱うことができます。システム全体のBASH RCファイル(おそらく/etc/bash.bashrc)に行を追加します。

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

システムロガーで「local6」のロギングを設定します。多分このようなもの:

local6.*    /var/log/commands.log

システムロガーを再起動します。おそらく、ログファイルのローテーションを設定します。ログアウト; ログインする; そして、履歴は次のような形式で/var/log/commands.logに書き込まれます。

日時ホスト名ロガー:ユーザー名[audit_pid]:コマンド[return_val]

これをさらに微調整して味わうことができます。


1

次の段落では、一般的なアイデアについて説明し、一部の面で古くなっていますが、このページから最新のものを使用できます。大きなファイル〜/ .bash_history.archive(HISTFILE =〜/ .bash_historyとは別)を使用してみましょう。そして、各bashセッションの終了時に、新しい履歴行を追加します。

このアプローチの最初の問題は、各出口でこのスクリプトを呼び出すようにbashを作成する方法でした。確かに「exit」と入力して終了する場合は、「exit」関数のエイリアスを設定できますが、ショートカットCtrl-Dを使用しているため、何かに再割り当てする方法は見つかりませんでしたが、組み込みのexit関数はありません。

したがって、最初の試みは、Ctrl-Dを禁止することでした。

export IGNOREEOF=10

そして、exit関数を呼び出すための二重Ctrl-Xの組み合わせを定義します。

しかし、正しい方法はbashの終了トランプを使用することです。これは、bashを終了する方法に関係なく呼び出されるため、完璧なソリューションです。Ctrl-D、終了、xtermウィンドウを閉じます。

trap 'archive_history' EXIT

次の手順では、bash_historyに開始行を定義して、新しい行のみを保存し、履歴ファイルに追加するようにします。

export CURBASHSTART=`grep -v "^[ \t]*$" $HISTFILE | wc -l | awk '{print $1}'` CURBASHDATE=`date`

shopt -s cmdhist histappend

bashの開始時に必要なのはこれだけです。これで、現在の(新しい)履歴がどの履歴行から始まるかがわかります。履歴を保存するには、次のピースを〜/ .bashrcに追加します。

archive_history()
{
    HISTORYOLD=${HISTFILE}.archive
    CURTIME=`date`
    CURTTY=`tty`
    if  [ x$HISTDUMPPED = x ]; then
      echo "#-${HOSTNAME}-- ${CURBASHDATE} - ${CURTIME} ($CURTTY) ----" >>   $HISTORYOLD

      history $(($HISTCMD-${CURBASHSTART-0})) | sed -e 's/^[ ]*[0-9][0-9]* [ ]*//g'  >> $HISTORYOLD
      export HISTDUMPPED=1
    fi
}

exit ()
{
   archive_history
   builtin exit

}

ファイル〜/ .inputrcには、Ctrl-x xへの終了ショートカットを再定義する次の行が含まれている必要があります。最初の試みでは、それはひどい近道だと感じるかもしれませんが、それに慣れるでしょう-私を信じてください。

$if Bash
# to exit through calling exit function which will archive the history
"\C-x\C-x": "exit\n"
# to dump history we have so far
"\C-x\C-w": "archive_history\n"

$endif

また、bashセッションがログインセッションでありlogout、' 'を呼び出して終了する場合は、次の行を~/.bash_logout

archive_history

上記のすべてのアクションが完了したら~/.bash_history.archive、次のようなセクションを含むファイルを見つけることができます

#-belka-- Sun Oct 12 21:52:13 EDT 2003 - Sun Oct 12 21:53:25 EDT 2003 (/dev/pts/13) ----
exit
aptitude
exit
#-washoe-- Sun Oct 12 18:03:16 EDT 2003 - Sun Oct 12 23:06:48 EDT 2003 (/dev/pts/3) ----

exit
cd progr/letters/resume/
e resume.tex

必要に応じて、通常は通常の履歴ファイルとして読み取ることができます。

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