LINUX.ORG.RU

Система контроля действия пользователя

 


0

2

Мне нужно разработать систему контроля действий пользователя которая отслеживала бы создание файла,изменение файла,удаление файла в корневом каталоге(«/») и во всех подкаталогах проще говоря по всей системе

я набросал такой проект основанный на api inotify

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/inotify.h>
#include <limits.h>

#define MAX_EVENTS 1024 /*Максимальное количество событий для обработки за один раз*/
#define LEN_NAME 16 /*Будем считать, что длина имени файла не превышает 16 символов*/
#define EVENT_SIZE  ( sizeof (struct inotify_event) ) /*размер структуры события*/
#define BUF_LEN     ( MAX_EVENTS * ( EVENT_SIZE + LEN_NAME )) /*буфер для хранения данных о событиях*/

int main( int argc, char **argv ) 
{
	int length, i = 0, wd;
	int fd;
	char buffer[BUF_LEN];

	 /* Инициализация Inotify*/
	fd = inotify_init();
	if ( fd < 0 ) {
		perror( "Couldn't initialize inotify");
	}

	
	wd = inotify_add_watch(fd, "/", IN_CREATE | IN_MODIFY | IN_DELETE); 

	if (wd == -1)
	{
		printf("Couldn't add watch to %s\n",argv[1]);
	}
	else
	{
		printf("Watching:: %s\n",argv[1]);
	}

	/* бесконечный цикл*/
	while(1)
	{
		i = 0;
		length = read( fd, buffer, BUF_LEN );  

		if ( length < 0 ) {
			perror( "read" );
		}  

		while ( i < length ) {
		struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];
		if ( event->len ) {
			if ( event->mask & IN_CREATE) {
				if (event->mask & IN_ISDIR)
					printf( "The directory %s was Created.\n", event->name );       
				else
					printf( "The file %s was Created with WD %d\n", event->name, event->wd );       
			}

			if ( event->mask & IN_MODIFY) {
				if (event->mask & IN_ISDIR)
					printf( "The directory %s was modified.\n", event->name );       
				else
					printf( "The file %s was modified with WD %d\n", event->name, event->wd );       
			}
          
			if ( event->mask & IN_DELETE) {
				if (event->mask & IN_ISDIR)
					printf( "The directory %s was deleted.\n", event->name );       
				else
					printf( "The file %s was deleted with WD %d\n", event->name, event->wd );       
			}  


				i += EVENT_SIZE + event->len;
			}
		}
	}

 /* Освобождение ресурсов*/
inotify_rm_watch( fd, wd );
close( fd );

return 0;
}
Собственно вопрос а можно как-нибудь сделать чтобы наблюдение было не только в корне но и во всех вложенных каталогах(те грубо говоря по всей системе) я так понял нужно реализовать рекурсию... но ведь по всей системе может быть 10-ки тысяч каталогов или даже сотни

По нормальному - это писать модуль ядра, встраиваться в систему и перехватывать функции fopen,creat,fwrite и т.д. хотя быть может, где-то в ядре уже есть галка «писать в сислог каждый чих».

aido ★★ ()

Разве inotify не сообщает о создании/изменении файла/каталога вообще где-либо в системе? О каких десятках тысяч каталогов идет речь? Или я не правильно понимаю принцип работы inotify?

I-Love-Microsoft ★★★★★ ()

Offtop конечно, но разве selinux в permissive режиме не решает поставленную задачу?

Deleted ()

Инкрементирую модуль ведра. Через параметры модуля при modprobe задавать файл с перечнем директорий, в которых нужно отслеживать, а также файл с перечнем директорий, которые нужно опустить (скажем, те же /var/log и /tmp).

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от I-Love-Microsoft

ну в корневом каталоге може тыбть там сотни папок в этих папок еще сотни и тд и тп и все это нужно отслеживать

kold2015 ()

У тебя таким образом inotify watches закончатся. Выбрасывай это решение и пиши модуль ядра.

Посмотреть максимальное количество watches можно так (его даже можно изменить, только это все равно неправильное решение):

sysctl fs.inotify.max_user_watches

m0rph ★★★★★ ()
Последнее исправление: m0rph (всего исправлений: 1)

Решал такую задачу so'шкой, которая грузилась через /etc/preload.conf и перехватывала все варианты open.

anonymous ()

не удивляйся, если у тебя система после этого станет работать раза в полтора-два медленнее после таких пируэтов.

aido ★★ ()

Мне нужно разработать систему контроля действий пользователя которая отслеживала бы создание файла,изменение файла,удаление файла в корневом каталоге(«/») и во всех подкаталогах проще говоря по всей системе

Такая система уже реализована: https://wiki.archlinux.org/index.php/Audit_framework.

Deleted ()
Ответ на: комментарий от I-Love-Microsoft

Нет, на каждый каталог надо отдельно заводить watch

false ★★★★★ ()
Ответ на: комментарий от kold2015

В МСВС есть своя система аудита, для простого журналирования наверное хватит. Включается где-то в панели управления.

anonymous ()

как вариант - SELinux с аццким аудитом. и парсить логи. но будет всё равно медленно и печально. на плюсах такое не реализовать однозначно, это убьёт производительность. да и не нужно это в никсах, на самом деле. кто не хочет изменений в руте, те монтируют систему из рид-онли образа.

Iron_Bug ★★★★★ ()
Ответ на: комментарий от anonymous

там слишком много ненужной фигни мне нужно отслеживать файлы и папки во всей системе(операции чтения и записи над ними а также пользователь который проводит эти операции) и все это писать в своем логе допустим «файл был создан в папке в 12:00 пользователем root» что то типо этого...

kold2015 ()

ты идиот поздравляю

это уже есть и собственно входит вов се «нормальные ОС»-там есть АПИ/готовые службы отслеживания таких действий

банально-apparmor и systemd делают все то что ты написал

конечно если ты не очередной школьник которому велосипед на курсовую надо

hello322 ()
Ответ на: комментарий от kold2015

Помнится, там были нормальные фильтры событий, твоя задача должна решаться, разве что логи могут получиться избыточные и в другом формате. Впрочем, подробностей не помню, если не подходит - тогда либо модуль ядра, либо глобальный preload. Мы пробовали оба варианта, именно на МСВС, остановились на последнем. Но у нас и задача была шире чем журналирование.

anonymous ()

Но зачем, если есть libaudit и подсистема аудита в ядре?

Dark_SavanT ★★★★★ ()
Ответ на: комментарий от anonymous

кто знает как данный модуль ядра скомпилировать

#include <linux/module.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <asm/uaccess.h>

extern void *sys_call_table[];

int (*orig_open)(const char *pathname, int flag, int mode);

int own_open(const char *pathname, int flag, int mode)
{
    char *kernel_path;
    char hide[]="test.txt";
    kernel_path=(char *)kmalloc(255,GFP_KERNEL);

    copy_from_user(kernel_path, pathname, 255);
    if(strstr(kernel_path,(char *)&hide) != NULL)
    {
	kfree(kernel_path);
	return -ENOENT;

    }
    else
    {
	kfree(kernel_path);
	return orig_open(pathname, flag, mode);

    }

}
int init_module()
{
    orig_open=sys_call_table[SYS_open];
    sys_call_table[SYS_open]=own_open;
    return 0;

}

void cleanup_module()

{
    sys_call_table[SYS_open]=orig_open;
}

kold2015 ()

Стесняюсь спросить, но спрошу)

А как это сработает?

 /* Освобождение ресурсов*/
inotify_rm_watch( fd, wd );
close( fd );

return 0;

Вернее, даже, когда?

webmak ★★ ()
Последнее исправление: webmak (всего исправлений: 2)
24 апреля 2016 г.

Кто-то может разобрать для меня эту строку: struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ]; Не понимаю как она работет.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.