Мониторинг файлов в Linux используя inotify

fiber-optic-cables.si
Привет всем, произошла такая история. Есть у меня сервер, на сервер заходит куча человек по SSH под рутом. Сервер это в MZ так что про безопасность я не сильно пекусь, но вот что приключилось, у меня внезапно пропала целая папка с веб-скриптами, а именно Cacti вся система нагнулась, кто-то под чистую ловко удалил все файлы. Блять. Ну бэкапа я не делал, система не критичная (а именно использовалась для тестов) но вот настроек жалко. Короче я провел опрос всех тех, кто имеет доступ к серверу, никто не удалял, никто ничего не трогал. Как всегда… Короче никто не признался. Итог, я закрыл по SSH доступ с рутом, и закрыл рута вообще, а на критичные файлы подвесил систему мониторинга файлов, которая отслеживает все события, которые происходят с файлами. Как это сделать, читаем под катом.

Что такое inotify

inotify — это подсистема ядра Linux, которая позволяет получать уведомления об изменениях в файловой системе. В основное ядро была включена начиная с 2.6.13, но может использоваться и с более ранними ядрами с помощью наложения патча. Основная сфера использования — в системах поиска (например Beagle), таким образом программе-индексатору не требуется сканировать всю файловую систему каждые несколько минут.

События которые отслеживаются inotify:
IN_ACCESS — К файлу было произведено обращение (чтение)
IN_ATTRIB — Были изменены метаданные (права доступа, временные метки, расширенные атрибуты и т.п.)
IN_CLOSE_WRITE — Файл, открывавшийся для записи, был закрыт
IN_CLOSE_NOWRITE — Файл, открывавшийся не для записи, был закрыт
IN_CREATE — Файл/каталог был создан в наблюдаемой директории
IN_DELETE — Файл/каталог был удален в наблюдаемой директории
IN_DELETE_SELF — Наблюдаемый файл/каталог был удален
IN_MODIFY — Файл был изменён
IN_MOVE_SELF — Наблюдаемый файл/каталог был перемещен
IN_MOVED_FROM — Файл/каталог был перемещен из наблюдаемой директории
IN_MOVED_TO — Файл/каталог был перемещен в наблюдаемую директорию
IN_OPEN — Файл/каталог был открыт

За инфу благодарим Википедию.

Установка и нaстройка inotify

Первое что нужно сделать, это добавить в систему репозитории epel & remi:

su root
cd ~ 
mkdir epel_remi
wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh epel-release-6-8.noarch.rpm remi-release-6.rpm
su root
cd ~ 
mkdir epel_remi
wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh epel-release-6-8.noarch.rpm remi-release-6.rpm

Должно быть так:

ls -l /etc/yum.repos.d/
total 28
-rw-r--r--. 1 root root 1926 Feb 25 10:57 CentOS-Base.repo
-rw-r--r--  1 root root  957 Nov  5  2012 epel.repo
-rw-r--r--  1 root root 1020 Feb 12 20:50 remi.repo
ls -l /etc/yum.repos.d/
total 28
-rw-r--r--. 1 root root 1926 Feb 25 10:57 CentOS-Base.repo
-rw-r--r--  1 root root  957 Nov  5  2012 epel.repo
-rw-r--r--  1 root root 1020 Feb 12 20:50 remi.repo

Теперь нужно поставить пакет:

yum --enablerepo=epel -y install inotify-tools
yum --enablerepo=epel -y install inotify-tools

Одноразовый запуск выполняется так:

inotifywait -e create,delete,modify,move -mrq /root &
inotifywait -e create,delete,modify,move -mrq /root &

где /root – директория в которой мы хотим отслеживать ивенты

Создади конфиг файл:

vi /etc/inotifywait.conf
...
# specify log file
LOGFILE=/var/log/inotify.log
# specify target directory for monitoring
MONITOR=/root
# specify target events for monitoring ( comma separated )
# refer ro "man inotifywait" for kinds of events
EVENT=create,delete,modify,move
...
vi /etc/inotifywait.conf
...
# specify log file
LOGFILE=/var/log/inotify.log
# specify target directory for monitoring
MONITOR=/root
# specify target events for monitoring ( comma separated )
# refer ro "man inotifywait" for kinds of events
EVENT=create,delete,modify,move
...

Где MONITOR=/root директория в которой мы будем отслеживать события
Где EVENT=create,delete,modify,move события которые будут регистрироваться

Создадим init скрипт:

vi /etc/rc.d/init.d/inotifywait
vi /etc/rc.d/init.d/inotifywait

Тело скрипта:

#!/bin/bash
 
# inotifywait: Start/Stop inotifywait
#
# chkconfig: - 80 20
# description: inotifywait waits for changes to files using inotify.
#
# processname: inotifywait
 
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
. /etc/inotifywait.conf
 
LOCK=/var/lock/subsys/inotifywait
 
RETVAL=0
start() {
   echo -n $"Starting inotifywait: "
   /usr/bin/inotifywait \
   --format '%w%f %e %T' \
   --timefmt '%Y/%m/%d-%H:%M:%S' \
   --exclude '.*\.sw[pox].*' \
   -e $EVENT \
   -o $LOGFILE \
   -dmrq $MONITOR
 
   RETVAL=$?
   echo
   [ $RETVAL -eq 0 ] && touch $LOCK
   return $RETVAL
}
stop() {
   echo -n $"Stopping inotifywait: "
   killproc inotifywait
   RETVAL=$?
   echo
   [ $RETVAL -eq 0 ] && rm -f $LOCK
   return $RETVAL
}
case "$1" in
   start)
      start
      ;;
   stop)
      stop
      ;;
   status)
      status inotifywait
      ;;
   restart)
      stop
      start
      ;;
   *)
      echo $"Usage: $0 {start|stop|status|restart}"
      exit 1
esac
exit $?
#!/bin/bash

# inotifywait: Start/Stop inotifywait
#
# chkconfig: - 80 20
# description: inotifywait waits for changes to files using inotify.
#
# processname: inotifywait

. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
. /etc/inotifywait.conf

LOCK=/var/lock/subsys/inotifywait

RETVAL=0
start() {
   echo -n $"Starting inotifywait: "
   /usr/bin/inotifywait \
   --format '%w%f %e %T' \
   --timefmt '%Y/%m/%d-%H:%M:%S' \
   --exclude '.*\.sw[pox].*' \
   -e $EVENT \
   -o $LOGFILE \
   -dmrq $MONITOR

   RETVAL=$?
   echo
   [ $RETVAL -eq 0 ] && touch $LOCK
   return $RETVAL
}
stop() {
   echo -n $"Stopping inotifywait: "
   killproc inotifywait
   RETVAL=$?
   echo
   [ $RETVAL -eq 0 ] && rm -f $LOCK
   return $RETVAL
}
case "$1" in
   start)
      start
      ;;
   stop)
      stop
      ;;
   status)
      status inotifywait
      ;;
   restart)
      stop
      start
      ;;
   *)
      echo $"Usage: $0 {start|stop|status|restart}"
      exit 1
esac
exit $?

Даем права и запускаем:

chmod 755 /etc/rc.d/init.d/inotifywait 
/etc/rc.d/init.d/inotifywait start 
chmod 755 /etc/rc.d/init.d/inotifywait 
/etc/rc.d/init.d/inotifywait start 

Подразним inotify

Создадим, переместим и затем удалим файл:

touch event.txt
mv event.txt super.txt
mv super.txt super.conf
rm -rf super.conf
touch event.txt
mv event.txt super.txt
mv super.txt super.conf
rm -rf super.conf

Теперь посмотри активность в логе:

cat /var/log/inotify.log
cat /var/log/inotify.log
/root/event.txt CREATE 2013/08/14-10:34:05
/root/event.txt MOVED_FROM 2013/08/14-10:34:11
/root/super.txt MOVED_TO 2013/08/14-10:34:11
/root/super.txt MOVED_FROM 2013/08/14-10:34:17
/root/super.conf MOVED_TO 2013/08/14-10:34:17
/root/super.conf DELETE 2013/08/14-10:34:24
/root/event.txt CREATE 2013/08/14-10:34:05
/root/event.txt MOVED_FROM 2013/08/14-10:34:11
/root/super.txt MOVED_TO 2013/08/14-10:34:11
/root/super.txt MOVED_FROM 2013/08/14-10:34:17
/root/super.conf MOVED_TO 2013/08/14-10:34:17
/root/super.conf DELETE 2013/08/14-10:34:24

Как видим любые операции с файлами фиксируются.
Теперь любое мудло которое удалит ваши файлы, а потом будет делать тупое лицо, мол я тут не причем, будт поймано.