CentOSにてディレクトリを監視し、操作をログに記録する方法

# 背景
CentOS 5.10 上の特定ディレクトリが何故か消えるという問題が発生していたため、犯人を特定する

# 手順
1. inotify-toolsで特定ディレクトリへの操作をログに出力し、いつ時点で消えたかを確認する
1. psacctプロセスアカウンティングコマンドでいつ時点でどのユーザがしでかしたのかを確認する
1. 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 : 履歴の中を見るためのコマンド

1. ユーザを絞る
`$ sudo lastcomm --user ユーザ名`

1. コマンドを絞る
`$ sudo lastcomm --command コマンド名`
例) `lastcomm --command ls`

1. 条件を複数満たす記録だけに限定したい場合は、 --strict-match オプションを付ける
`$ sudo lastcomm --strict-match --command {コマンド名} --user {ユーザ名}`

1. ファイルの先頭部分を表示する
`$ sudo lastcomm | head`

1. ログローテート設定を確認
`$ 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.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`

```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から原因を確認