私が働いている場所では、セキュリティと監査の目的で、各セッション(ファイル名のユーザー、日付、端末など)の履歴ファイルをアーカイブする必要があります。
明らかに、HISTFILE
変数は読み取り専用(readonly HISTFILE
)に設定されているため、通常のユーザーは他の履歴ファイルを設定できません(rootまたは変更の両方ではありません/etc/profile
)。
これが私たちが持っているものです/etc/profile
:
EXTENDED_HISTORY=ON
readonly EXTENDED_HISTORY
export EXTENDED_HISTORY
HISTFILE=$HOME/.history/`date +%y%m%d.%H%M%S`.${WHO_USER:-user}.${WHO_TERMINAL:-term}.${SSH_PORT:-port}.${MY_PID:-pid}
readonly HISTFILE
export HISTFILE
最大の問題は、古いファイルをgrepingせずに古いコマンドを取得できないことです。
監査を維持しながら複数のセッション間でコマンド履歴を共有するための簡単な回避策またはより良いソリューションはありますか?
私たちはkshとbashを使います。
答え1
シェル履歴ファイルはコマンドを監査する良い方法です。ユーザーはこれを簡単に変更またはバイパスできます。これは、ユーザーが意図的にまたは誤って調停メカニズムをバイパスしないことを信頼している場合にのみ有用です。たとえば、GUI、エディタなどで実行されたコマンドはこの方法で記録されません。ユーザーが文書化されていないコマンドを開始する方法はいくつかありますが、意図的にセキュリティ対策をバイパスしようとするのではなく、便宜上または認識されずにコマンドを実行しているという事実を否定できます。
履歴ファイルを追加専用に設定すると(chattr +a
履歴ファイルをルートとして実行する必要があります)、記録された内容はすべて記録されますが、記録はまだバイパスできます。
別の履歴ファイルをアーカイブできません。単一履歴ファイルを保持そして定期的にバックアップしてください。これにより、コマンドが実行された日付が保存されますが、端末は保存されません。
ログが実行されたコマンドと一致することを確認する必要がある場合、シェル履歴ファイルは無効なツールです。代わりに監査デーモンを使用してください。すべての通話を記録するように設定しますexecve
。
auditctl -A exit,always -S execve
詳細については、次の質問を参照してください。
答え2
あなたが要求するものは100%確かではありませんが、各セッションの個々の記録を取得する方法は次のとおりです。デフォルトでは、ホストとptyに基づいて名前が付けられます。これはバッシュのためのものです。
# Unique history file per shell session.
HISTSIZE=300
HISTFILE=$HOME/.bash_hist_${HOSTNAME/.*/}_$(basename $(tty))
SAVEHIST=500
export HISTCONTROL=ignoredups
これは~/.bashrc
ファイルにあります。 HISTFILEを変更できないことが何を意味するのか理解できません。
1つの欠点は、どのセッション履歴を取得するかを予測できないことです。ただし、監査するには、セット全体をgrepできます。
grep something ~/.bash_hist_*
ただし、セッションコンテキストを別々のファイルに保存します。