alacarte
программа.Main Menu
).Это работает на установленную программу всего руководства в оболочке гнома.
Благодаря поддержке RHEL было обнаружено ясное решение. Это основано на systemtap использовании модуля ядра. Заключенный в кавычки отсюда до избегают гнили ссылки. И еще раз спасибо за весь Ваш совет :)
Я даже не мог предположить, что 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>
Для получения списка файлов, к которым получают доступ во время процесса начальной загрузки в systemtap формате журнала, мы должны реализовать следующее:
Загрузите и установите ПРАВИЛЬНО именованные версии 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
и измените 'должностное лицо/sbin/init 3 ' на 'должностное лицо/sbin/init 5 ', если 5 Ваше значение по умолчанию runlevel.
Создайте .ko модуль из bootprobe2.stp
cd /root
stap bootprobe2.1.stp -m bootprobe2 -p4
Перезагрузка.
Останов grub
(нажмите Esc или Shift), и нажмите на ядре по умолчанию. В конце ядра строка вводит следующее и нажимает Enter:
init=/root/bootinit.sh,
Нормальная начальная загрузка возобновится. После входа в систему, kill
stapio
процесс, копия bootprobe2.log
из tmpfs
/tmp/stap/data
каталог и размонтирование это.
killall stapio
cp /tmp/stap/data/bootprobe2.log /tmp/stap/
umount /tmp/stap/data
Теперь проверьте файл /tmp/stap/bootprobe2.log
файл для списка всех файлов, которые читаются во время начальной загрузки.
Настройте контрольную подсистему для записи вызовов к open
.
auditctl -a exit,always -S open,openat,creat,execve
Сделайте это от initramfs, так, чтобы правило существовало когда основная система (/sbin/init
в реальной корневой файловой системе), запускается.
Обратите внимание, что то, что Вы предлагаете сделать, не принесет реальной безопасности на типичной установке. Любой, кто может заменить эти файлы другими версиями, имеет корневой доступ и может также подать поддельные данные к системе регистрации.
Если загрузочный носитель защищен внешне так, чтобы корень не мог изменить его (например, потому что это только для чтения или под эксклюзивным управлением безопасного загрузчика), и если загрузка модулей ядра заблокирована, то измерение файлов может быть надежным, если это сделало правильно. Однако, если все, что Вы делаете с мерами, сравнивает их со ссылочными значениями, это более трудно и менее эффективно, чем использование защищенной от целостности корневой файловой системы (т.е. на практике на dmcrypt с Доверяемой Личинкой для загрузчика).
openat
и execve
также (по крайней мере). Теперь это также зависит, что предназначено используемым и файлом, поскольку может случиться так, что также необходимо зарегистрироваться creat
, truncate
, access
, stat
, mkdir
, connect
...
– Stéphane Chazelas
07.11.2013, 00:58
/usr/share/initramfs-tools
(путь может отличаться на RH), затем восстановите initramfs (на Debian, который это update-initramfs
) и перезагрузка.
– Gilles 'SO- stop being evil'
25.11.2013, 14:12
Хорошее стартовое место было бы /etc/rci.d
где i
число, представляющее runlevel, в который Вы загружаетесь. Например, если Ваш сервер является бездисплейным, i
обычно будет 3. Взгляд под /etc/rc3.d
покажет, какие сервисы запускаются, когда Вы загружаетесь в runlevel 3.
upstart
- базирующиеся init системы используют /etc/rci.d
схема каталога также?
– Joseph R.
07.11.2013, 00:18
Удостовериться atime
включен для Вашего корня и файловых систем начальной загрузки в Вашем ядре (или это noatime
не установлен), затем после начальной загрузки Вас может использовать stat
проверять время доступа на каждый файл и видеть, к которым получили доступ во время начальной загрузки.