URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

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

 必要だからやっていることなんですが、こういうことするとシビアな環境ではパフォーマンスに大きく影響しそうですね。