Описание:Мне для обеспечения безопасности потребовался следующий иструмент: он должен проверять не изменялись ли файлы - всякие конфиги, содержимое системных каталогов.
Для этой цели я решил использовать "композитную" технику - часть инструмента написано на 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 сервере.
@музыка:
X-Japan - X
@настроение:
Что такое не везет? А как бороться не подскажете?
@темы:
bash,
безопасность,
FreeBSD,
perl