背景
CentOS 5.10 上の特定ディレクトリが何故か消えるという問題が発生していたため、犯人を特定する
手順
- inotify-toolsで特定ディレクトリへの操作をログに出力し、いつ時点で消えたかを確認する
- psacctプロセスアカウンティングコマンドでいつ時点でどのユーザがしでかしたのかを確認する
- historyからユーザのどのコマンドで消えたのかを特定する
仕込み
historyコマンドに時間が表示されるようにする
- /etc/profile を編集する
$ sudo vi /etc/profile
以下を追記
# history setting
HISTTIMEFORMAT=' %F %T '
各ユーザの
~/.bash_profile
が編集されている場合、上書きされてしまう。
→ 最悪全ユーザのbashrcに仕込んでおく?
ファイル再読み込み
$ sudo source /etc/profile
時間が出力されることを確認
$ history
プロセスアカウンティングコマンドを有効にする
全アカウントのコマンド実行履歴をログとして残す
コマンドの存在チェック
$ which accton
プロセスアカウンティングを起動
$ sudo /etc/init.d/psacct start
起動スクリプト /etc/rc.d/init.d/psacct を有効にしておく。
$ sudo chkconfig psacct on
有効確認
$ sudo chkconfig --list psacct
ログファイル出力場所
/var/account/pacct
- lastcomm : 履歴の中を見るためのコマンド
ユーザを絞る
$ sudo lastcomm --user ユーザ名
コマンドを絞る
$ sudo lastcomm --command コマンド名
例)lastcomm --command ls
条件を複数満たす記録だけに限定したい場合は、 --strict-match オプションを付ける
$ sudo lastcomm --strict-match --command {コマンド名} --user {ユーザ名}
ファイルの先頭部分を表示する
$ sudo lastcomm | head
ログローテート設定を確認
$ sudo vi /etc/logrotate.d/psacct
inotify-tools をインストール
ファイルやディレクトリに対して変更が行われると通知してくれる(誰がやったかまではわからない)
-
notifywaitコマンド : 指定したファイルやディレクトリに変化があると、その旨を出力する
$ inotifywait -m -r {変更ウオッチ場所} -e modify,attrib,moved_to,moved_from,move,create,delete,delete_self --format '%T %w%f (%e)' --timefmt '%F %T'
-m : 監視し続ける
-r:ディレクトリ以下すべてを対象
-e : 監視対象コマンドの指定
--format : 結果の出力フォーマットを指定
--timefmt : 日時の出力を指定 --formatの%Tに出る dagリポジトリがない場合、
追加
$ vi /etc/yum.repos.d/dag.repo
[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
gpgkey=http://ftp.riken.go.jp/pub/Linux/dag/RPM-GPG-KEY.dag.txt
enabled=0
dagリポジトリを指定してインストール
$ sudo yum --enablerepo=dag install inotify-tools
インストール確認
$ which inotifywait
監視shを作成
$ vi monitor_dir.sh
#!/bin/bash
# monitor_dir.sh
#
# -----------------------------------------------------------------------------
# Purpose : ディレクトリ内の変化を観察し、ファイルに出力する
# -----------------------------------------------------------------------------
# yyyy.MM.dd created {account}@{mail.address}
#
# Description :
# 1. 監視したいディレクトリを MONITOR_DIR に設定(再帰的には監視しない)
# 2. ログを出力したい場所を LOGFILE に設定
# 3. 監視終了後、プロセスを kill しておくこと!
#
# Usage :
# $ sudo nohup ./monitor_dir.sh &
#
# -----------------------------------------------------------------------------
MONITOR_DIR={監視したいディレクトリパス}
LOGFILE=/var/log/inotifywait.log
/usr/bin/inotifywait -m $MONITOR_DIR \
-e modify,attrib,moved_to,moved_from,move,create,delete,delete_self \
--format '%T %w%f (%e)' \
--timefmt '%F %T' | while read line; do
echo "$line " >> $LOGFILE
done
shの実行権限を変更
$ chmod 700 ./monitor_dir.sh
ログアウトしてもコマンドを実行(nohup) かつ バックグラウンドで実行(&)
$ sudo nohup ./monitor_dir.sh &
ログを見て動いているか確認
$ view /var/log/inotifywait.log
or
$ tail -f /var/log/inotifywait.log
以上で仕込みは完了
監視
inotifywaitのログからディレクトリに対する操作履歴を確認
削除された月日時間を割り出すpsacctコマンドでユーザ(誰がしでかしたか)を確認
$ sudo lastcomm | grep '{月日時間}'
判明したユーザのhistoryから原因を確認