目次
だれがどのコマンドを実行したかを後から調べるため、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でシスログ転送する方法もありかと思います。
手軽にコマンド実行履歴を取得出来るので、お試しください。
- カテゴリー