| Works
bashのコマンド履歴をSyslogへ送る
全ユーザーの操作履歴をまとめて保存する必要があり、その時にやったことのメモ。
本来はAuditとかを使う方が望ましいのかもしれませんが、今回のお仕事ではAuditはログが見にくいとかなんとか(ログ監視との兼ね合い?)。
ネットで調べるとbashを自前でコンパイルする方法がよく見つかるのですが、業務では商用サポートの関係でその方式をとるのは難しい。そんな中、RHEL7/CentOS7ならこの方法が使えました。
環境はRHEL7/CentOS7です。他の環境でも比較的あたらしいバージョンなら使えるかもしれませんが、まだ試していません。
手段としては、ユーザーがコマンドを実行したときに"trap"で引っかけて"logger"でSyslogに送ります。
今回は全ユーザーを対象にするので、"/etc/bashrc"の最後に以下を追記。
# history to syslog
PROMPT_COMMAND=$(history -a)
typeset -r PROMPT_COMMAND
function history_logging {
declare EXEC_CMD
EXEC_CMD=$BASH_COMMAND
logger -p local1.notice -t bash -i -- USER:$USER, CMD:$EXEC_CMD, PWD:$PWD
}
trap history_logging DEBUG
"logger"のオプションや出力する情報は必要に応じて修正。
これで次回ログイン時からユーザーが実行したコマンドがSyslogに送られるので、ログファイルを分けるなり、ログローテーションを設定するなりします。
上記の例だとログはこんな感じ。
Jul 20 13:08:17 centos bash[9898]: USER:root, CMD:systemctl list-unit-files, PWD:/root
Jul 20 13:08:37 centos bash[9901]: USER:root, CMD:useradd user01, PWD:/root
Jul 20 13:08:44 centos bash[9907]: USER:root, CMD:passwd user01, PWD:/root
Jul 20 13:08:51 centos bash[9912]: USER:root, CMD:su - user01, PWD:/root
Jul 20 13:08:52 centos bash[9934]: USER:user01, CMD:PATH=$PATH:$HOME/.local/bin:$HOME/bin, PWD:/home/user01
Jul 20 13:08:52 centos bash[9935]: USER:user01, CMD:export PATH, PWD:/home/user01
Jul 20 13:08:55 centos bash[9936]: USER:user01, CMD:ps -ef, PWD:/home/user01
必要だからやっていることなんですが、こういうことするとシビアな環境ではパフォーマンスに大きく影響しそうですね。