BeeX Technical BlogLinuxでコマンド実行履歴を取得したい

だれがどのコマンドを実行したかを後から調べるため、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システム運用保守サービス

クラウド・SAPシステム運用保守サービス

日々変わり続けるクラウドの最新技術やトレンドを取り込み、貴社に最適な基幹クラウド向け運用保守サービスを提供します。

詳細を見る

カテゴリ

タグ

BeeX Technical Blogについてのお問い合わせ

BeeX Technical Blogのエントリにご質問が御座いましたらお気軽にお問合せください。

お電話でのお問い合わせ

☎ 03-6214-2830

受付時間 平日9:30〜18:00

フォームでのお問い合わせ

お問い合わせフォーム