Как перечислить все файлы, используемые при загрузке Linux

Я хотел бы получить список файлов, которые используются во время загрузки Linux. Мы разрабатываем защищенную корпоративную систему на основе RHEL 6.4. Целостность указанных файлов будет проверяться специальным оборудованием.

Поэтому возникает вопрос: как получить список этих файлов (с разрешенными зависимостями, поступающими от разных служб загрузки и демонов).

Настройте подсистему аудита для записи вызовов для open .

 auditctl -a exit,always -S open,openat,creat,execve 

Сделайте это из initramfs, чтобы правило было на месте, когда начинается основная система ( /sbin/init в реальной корневой файловой системе).

Обратите внимание, что то, что вы предлагаете сделать, не приведет к реальной безопасности при типичной настройке. Любой, кто может заменить эти файлы другими версиями, имеет root-доступ и также может подавать фиктивные данные в систему ведения журнала.

Если загрузочный носитель защищен извне, так что root не может его изменить (например, потому что он доступен только для чтения или под исключительным контролем безопасного загрузчика), и если загрузка модулей ядра заблокирована, то измерение файлов может быть надежным, если это делается правильно , Однако, если все, что вы делаете с этими мерами, сравнивает их с эталонными значениями, это сложнее и менее эффективно, чем использование защищенной от целостности корневой файловой системы (т.е. на практике на dmcrypt с Trusted Grub для загрузчика).

Хорошим стартовым местом будет /etc/rci.d где i – число, представляющее уровень запуска, который вы загружаете. Например, если ваш сервер безгласен, i , как правило, будет 3. В разделе /etc/rc3.d будет показано, какие службы запускаются при загрузке в уровень запуска 3.

Убедитесь, что atime включен для ваших корневых и загрузочных файловых систем в вашем ядре (или это noatime не установлено), после загрузки вы можете использовать stat чтобы проверить время доступа для каждого файла и посмотреть, какие из них были доступны во время загрузки.

Благодаря поддержке RHEL было обнаружено четкое решение. Он основан на использовании модуля ядра systemtap. Цитируется здесь, чтобы избежать гниения ссылок. И еще раз спасибо за все ваши советы 🙂

Я даже не мог себе представить, что системная карта может запускаться даже до скрипта init и отслеживать процесс загрузки. Я очень ценю поддержку Red Hat и лично Pushpendra Chavan за помощь в этом идеальном инструменте (к сожалению, я не знаю разработчиков, к которым этот метод относится именно так, иначе я бы их зачислил в первую очередь).

Поэтому нам нужно создать два простых скрипта:

bootinit.sh :

 #!/bin/sh # Use tmpfs to collect data /bin/echo "Mounting tmpfs to /tmp/stap/data" /bin/mount -n -t tmpfs -o size=40M none /tmp/stap/data # Start systemtap daemon & probe /bin/echo "Loading bootprobe2.ko in the background. Pid is :" /usr/bin/staprun \ /root/bootprobe2.ko \ -o /root/bootprobe2.log -D # Give daemon time to start collecting... /bin/echo "Sleeping a bit.." sleep 5 # Hand off to real init /bin/echo "Starting." exec /sbin/init 3 

и bootprobe2.1.stp написанные на встроенном языке скриптов systemtap:

 global ident function get_usertime:long() { return task_utime() + @cast(task_current(), "task_struct", "kernel<linux/sched.h>")->signal->utime; } function get_systime:long() { return task_stime() + @cast(task_current(), "task_struct", "kernel<linux/sched.h>")->signal->stime; } function timestamp() { return sprintf("%d %s", gettimeofday_s(), ident[pid()]) } function proc() { return sprintf("%d \(%s\)", pid(), execname()) } function push(pid, ppid) { ident[ppid] = indent(1) ident[pid] = sprintf("%s", ident[ppid]) } function pop(pid) { delete ident[pid] } probe syscall.fork.return { ret = $return printf("%s %s forks %d \n", timestamp(), proc(), ret) push(ret, pid()) } probe syscall.execve { printf("%s %s execs %s \n", timestamp(), proc(), filename) } probe syscall.open { if ($flags & 1) { printf("%s %s writes %s \n", timestamp(), proc(), filename) } else { printf("%s %s reads %s \n", timestamp(), proc(), filename) } } probe syscall.exit { printf("%s %s exit with user %d sys %d \n", timestamp(), proc(), get_usertime(), get_systime()) pop(pid()) } <linux sched.h=""><linux sched.h=""> </linux></linux> 

Чтобы получить список файлов, доступных во время процесса загрузки в формате журнала системного журнала, мы должны реализовать следующее:

Загрузите и установите PROPERLY именованные версии systemtap и kernel debuginfo (мне была предоставлена эта ссылка , но вам лучше использовать ее, если вы находитесь в CentOS);

Создать /tmp/stap и /tmp/stap/data

 mkdir -p /tmp/stap/data 

Поместите bootprobe2.1.stp и bootinit.sh в /root и сделайте их исполняемыми: chmod + x / root / boot *

Измените bootinit.sh и измените 'exec / sbin / init 3' на 'exec / sbin / init 5', если 5 – ваш уровень запуска по умолчанию.

Создайте модуль .ko из bootprobe2.stp

  cd /root stap bootprobe2.1.stp -m bootprobe2 -p4 

Перезагружать.

Остановите grub (нажмите Esc или Shift) и нажмите 'a' в ядре по умолчанию. В конце строки ядра введите следующее и нажмите клавишу ввода:

 init=/root/bootinit.sh, 

Обычная загрузка возобновится. После входа в систему, stapio процесс stapio , скопируйте bootprobe2.log из bootprobe2.log tmpfs /tmp/stap/data и отключите его.

 killall stapio cp /tmp/stap/data/bootprobe2.log /tmp/stap/ umount /tmp/stap/data 

Теперь проверьте файл /tmp/stap/bootprobe2.log файл для списка всех файлов, которые читаются во время загрузки.