共有ユーザー環境でIPアドレスごとにhistoryコマンドを使い分ける | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

Linux環境で、共有ユーザーを使っている場合に過去のコマンドの実行履歴を見てみようとしても誰が発行したものかわからなかったりして、何かサーバーに問題があったりした際にどのような作業をしたのかがわからずに困ったりすることがあります。

まぁ、共有でユーザー使うなよって話はありますが、そういった場合でも接続元のIPアドレスごとにhistoryコマンドの実行ログファイルを分けて保存することでユーザーごとのコマンド実行ログを残せたりします。



接続元のIPアドレスごとに.bash_historyを保存する


historyコマンドは、bash環境では通常は.bash_historyに保存されていきますが、これは環境変数で設定を変えることが出来ます。

以下のように、接続元のIPアドレスをベースにhisotryファイルを作るように.bash_profileに記述しておきます。


export RIPADDR=`who am i | cut -d '(' -f 2 | sed -e 's/)//g'`
export HISTFILE=~/.bash_history_${RIPADDR}

if [ ! -f $HISTFILE ]; then
    touch $HISTFILE
    chmod 600 $HISTFILE
fi


環境変数はRIPADDRは接続もとのIPアドレスを、HISTFILEでhistoryコマンドの実行履歴の保存ファイルを定義します。
あとは、接続時にその設定ファイルが存在しなければ作成するというような具合です。

SSHで接続した場合は、SSH_CONNECTIONという環境変数に接続元のIPアドレスがセットされますが、suしたりすると環境変数が消えてしまうので、who am iから取得しています。(もっと簡単に取得する方法ないんですかね)


ただ、この方法は接続先のサーバーにだけは有効ですが、踏み台にして接続したりしたら当然その先のサーバーでは接続元が皆同一になるので意味がなくなったりします・・・。

そういった場合は、制御端末ごとに保存するようにしておいてもよいかもしれません。


export RIPADDR=`who am i | cut -d '(' -f 2 | sed -e 's/)//g'`
export TTY_NUM=`tty | cut -d '/' -f4`
export HISTFILE=~/.bash_history_${RIPADDR}_pts${TTY_NUM}


ちなみに、誰がサーバーへの接続元IPや制御端末を誰が使ったかの情報は、lastコマンドで取得できるので、何かあった際はつき合わせて確認するということもできます。


$ last | less
work     pts/1        192.168.0.1 Sun Mar  4 15:25   still logged in
work     pts/2        192.168.0.2 Sun Jan 22 22:55 - 00:04  (01:08)
work     pts/1        192.168.0.1 Sun Jan 22 22:55 - 23:41  (00:46)


.bash_historyファイルは編集や削除が出来てしまうので、ログとしての信憑性は薄いのですが、日々の運用の中で参考情報としては使えるかもしれません。