Edited at

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

More than 3 years have passed since last update.


背景

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


手順


  1. inotify-toolsで特定ディレクトリへの操作をログに出力し、いつ時点で消えたかを確認する

  2. psacctプロセスアカウンティングコマンドでいつ時点でどのユーザがしでかしたのかを確認する

  3. 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 ユーザ名


  2. コマンドを絞る

    $ sudo lastcomm --command コマンド名

    例) lastcomm --command ls


  3. 条件を複数満たす記録だけに限定したい場合は、 --strict-match オプションを付ける

    $ sudo lastcomm --strict-match --command {コマンド名} --user {ユーザ名}


  4. ファイルの先頭部分を表示する

    $ sudo lastcomm | head


  5. ログローテート設定を確認

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