Linuxでコマンド実行履歴を取得したい

この記事を書いたメンバー:

Naritoshi

Linuxでコマンド実行履歴を取得したい

目次

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

カテゴリー
タグ

SAPシステムや基幹システムのクラウド移行・構築・保守、
DXに関して
お気軽にご相談ください

03-6260-6240 (受付時間 平日9:30〜18:00)