Мне для обеспечения безопасности потребовался следующий иструмент: он должен проверять не изменялись ли файлы - всякие конфиги, содержимое системных каталогов.
Для этой цели я решил использовать "композитную" технику - часть инструмента написано на Shell, часть на Perl. Все свои скрипты я писал на FreeBSD поэтому формально, что бы все работало as is нужна FreeBSD с Bash и Perl. Нет, конечно измените пути с интерпретаторам и все заработает где угодно.
Часть1:
Это скрипт написанный на Shell, он берет список файлов из list и складыват их имена и md5 хеши в отдельный файл. Файл list представляет из себя список файлов которые необходимо проверить, по одному файлу на строке, или можно разделять пробелами.
#!/usr/local/bin/bash
out="md5s" #имя файла по умолчанию
if [ "$1" != "" ]
then
out=$1
fi
files=$(sed "s/\n/\ /" list) #преобразуем входной файл в строку значений
for file in $files
do
md5 $file > /tmp/mmd
echo $file" "$(sed "s/.*\=\ //" "/tmp/mmd") >> "$out" #записываем хеш в файл
done
rm /tmp/mmd #удалим временный файлик
Часть2:
Скрипт на Perl, скрипт вызывает предидущий, что бы создать массив текущих хешей. А массив эталонных хешей читается из файла md5s.original, по умолчанию.
#!/usr/local/bin/perl
system ("rm md5s");
system ("./c_md5.sh");
$orig="md5s.original";
open (UN, "md5s") || die ("Cant open md5s!");
open (OR, "$orig") || die ("Cant open $orig!");
while ($onm=) {
$i++;
chomp ($onm);
@a=split (/ /, $onm);
$filesM[$i] = $a[0];
$omassive[$i] = $a[1];
}
while ($unm=){
$j++;
chomp ($unm);
@a=split (/ /, $unm);
if ($filesM[$j] ne $a[0])
{ #pizdec priehali
print "incompare of files list!\n";
close (OR);
close (UN);
exit;
}#endif
if ($omassive[$j] ne $a[1])
{#chto to v etom mire izmenilos'
print "$a[0] has changed!\n";
$flag=1;
}#endif
}#end while
if ($flag != 1) {
print "All is OK!\n";
}
close (OR);
close (UN);
Окончание:
Программа работает, но если скомпрометирован пароль root'а она не поможет. Злоумышленник сможет изменить или пересоздать таблицу хешей. Что бы этого не произошло, следует базу хешей и программу хранить отдельно, на не перезаписываемом носителе или на внешнем http/ftp сервере.
3 комментария:
Есть еще интересная программа md5deep, может создавать хэши неограниченного числа файлов + рекурсивно.
Например создать хеши всех файлов из твоего list можно так
#!/bin/bash
LIST=`cat list`
md5deep $LIST > md5s
Файл в формате
4897fa7b583f6521e03c77c6a23d5ac5 /etc/file
(опция -l может сделать пути относительными)
А проверить можно так
#!/bin/bash
md5sum --status -c md5s
if [ $? -eq 0 ]; then echo OK; fi
--status - не выводить на экран, результат в виде кода выхода.
$? - код выхода предыдущей команды. 0 - все хорошо, не 0 - какая то ошибка
Ну и еще, надо контролировать не только целостность файлов, но и что бы лишних не было. типа что бы в init не добавили новый адский_вирусный_скрипт.
md5deep штука наверно хорошая, но не везде установлена к сожалению. Что бы ее поставить - придется плодить зависимости. Мое решение требует всего стандартного. Насчет новых файлов сейчас чего нибудь подумаем.
количество файлов котролировать просто - достаточно в list добавить например
/etc/rc.d/*
Отправить комментарий