
だれがどのコマンドを実行したかを後から調べるため、Linuxのコマンド実行履歴を保存しておく手軽な方法がないか調べてみました。前提として、シェルはbashとしています。
ヒストリーをファイルに保存する
bashのコマンド履歴をexit時にファイルに保存する方法です。 /etc/bash.bashrc.local などに記載すれば、すべてのbashユーザに有効です。
function save_history() { HISTTIMEFORMAT='%F %H:%M:%S ' SAVED_HISTORY_FILE=~/.sh_history.$(logname)+$USER.$(date +%Y%m%d%H%M%S) history > $SAVED_HISTORY_FILE : > ~/.bash_history } trap save_history EXIT
SUSE Linux 15 SP1で試してみました。ec2-userでコマンド実行します。
ec2-user@myserver:~> sudo ls -a /root/ . .. .bash_history .gnupg .ssh .viminfo bin ec2-user@myserver:~> date Thu Sep 12 02:18:13 UTC 2019
ログアウトしヒストリファイルが保存させます。再度ログインして、ヒストリファイルを確認してみます 。実行時間付きで保存されています。
ec2-user@myserver:~> more .sh_history.ec2-user+ec2-user.20190912022429 1 2019-09-12 02:18:09 sudo ls -a /root/ 2 2019-09-12 02:18:13 date
次はsudo su – でrootになってから操作してみます。
ec2-user@myserver:~> sudo su - myserver:~ # date Thu Sep 12 02:33:53 UTC 2019 myserver:~ # ls .bash_history .gnupg .ssh .viminfo bin myserver:~ # exit ec2-user@myserver:~> sudo cat /root/.sh_history.ec2-user+root.20190912023356 1 2019-09-12 02:29:59 ls 2 2019-09-12 02:33:53 date 3 2019-09-12 02:33:56 exit
ヒストリファイル名にsudo前のユーザ名(ec2-user)があります。ヒストリファイルを回収すれば、実行コマンド履歴を保存しておけます。
ただし、実行されたコマンドをリアルタイムで見ることができないのと、ヒストリファイルをユーザに削除される可能性があります。
コマンド実行毎にシスログ転送する
functionとトラップを変更し、コマンド実行時に内容をシスログ転送します。readonly属性にし、functionの内容を変更できないようにします。
function log_history { logger -p local1.notice -t history -i "$$, $(logname),$USER, $PWD, $BASH_COMMAND" } readonly -f log_history trap log_history DEBUG EXIT
コマンド実行とシスログの内容です。
ec2-user@myserver:~> sudo whoami root ec2-user@myserver:~> sudo tail -2 /var/log/localmessages 2019-09-12T02:44:50.375671+00:00 localhost history[5691]: 5589, ec2-user,ec2-user, /home/ec2-user, sudo whoami 2019-09-12T02:44:57.920668+00:00 localhost history[5696]: 5589, ec2-user,ec2-user, /home/ec2-user, sudo tail -2 /var/log/localmessages
sudo su – でrootになって操作してみます。
ec2-user@myserver:~> sudo su - myserver:~ # whoami root myserver:~ # tail -2 /var/log/localmessages 2019-09-12T02:45:49.894627+00:00 localhost history[5864]: 5766, ec2-user,root, /root, whoami 2019-09-12T02:45:53.645495+00:00 localhost history[5870]: 5766, ec2-user,root, /root, tail -2 /var/log/localmessages
sudo前のユーザ名(ec2-user)、実効ユーザ(root)が記録されており、だれがsudoしたか一目で分かります。ただし、trap DEBUGを再設定されるとコマンド取得できませんが、最低限trapを変更したことも記録されます。
二番目の方法はコマンド実行毎に動くので反応が重くならないか気になりますが、リアルタイムでコマンド内容を取得出来るのが利点です。
ヒストリをまとめて取得するのでよければ、最初の方法を使用した方法がシステムへの負荷が低くて良いかと思います。ファイル出力の代わりに、loggerでシスログ転送する方法もありかと思います。
手軽にコマンド実行履歴を取得出来るので、お試しください。