Auflisten aller beim Linux-Start verwendeten Dateien

7

Ich möchte die Liste der Dateien erhalten, die während des Linux-Startvorgangs verwendet werden. Wir entwickeln das geschützte Unternehmenssystem basierend auf RHEL 6.4. Die Integrität der angegebenen Dateien wird von einer speziellen Hardware überprüft.

Die Frage ist also, wie man die Liste dieser Dateien erhält (mit aufgelösten Abhängigkeiten, die von verschiedenen Bootdiensten und Dämonen stammen).

Vitaly Isaev
quelle
6
Vielleicht können Sie die Option find with atime verwenden. Aber ... wenn Sie so etwas wollen, sollten Sie wissen, was Ihr System tut. Sie können eine Frage jederzeit direkt an Red Hat richten.
Jirib
Ich habe ein ähnliches Problem unter OpenBSD gelöst und festgestellt, dass ich auch die Datei master.passwd (Shadow unter Linux) benötige, da der Einzelbenutzer-Start nach dem Root-Passwort fragen kann, bevor Sie die Shell erhalten. Das heißt ... Sie müssen alle Details wissen, wie das System mit allen Möglichkeiten startet.
Jirib
Die Zugriffszeit ist hierfür keine geeignete Lösung. Sie sollten diese Aufgabe dem Kernel überlassen, da dies die einzige Funktion in (nicht systemd) Systemen ist, die in der Lage ist, alle geöffneten Dateien wirklich zu verfolgen.
Elias Probst
1
Definieren Sie zunächst, was "booten" umfassen soll. Wird nur der Kernel geladen und rootfs gemountet? Dann sind initramfs und was auch immer Grub verwendet, alles, was Sie sehen müssen. Ist alles bis zur Anmeldeaufforderung? Alles bis zum X-Anmeldebildschirm? Möglicherweise ist eine Art Early-Boot-Systemtap verfügbar. Andernfalls müssen Sie das System wahrscheinlich auf einer VM oder einem Kernel-Debugger ausführen, um alle Dateien anzuzeigen, auf die zugegriffen wird.
Mark Plotnick
1
Wäre die Prüfung eine Option oder wird sie beim Booten zu spät beginnen?
Jippie

Antworten:

7

Richten Sie das Überwachungssubsystem für die Aufzeichnung von Anrufen ein open.

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

Führen Sie dies über initramfs aus, damit die Regel beim Starten des Hauptsystems ( /sbin/initauf dem realen Root-Dateisystem) vorhanden ist.

Beachten Sie, dass das, was Sie vorschlagen, bei einem typischen Setup keine echte Sicherheit bringt. Jeder, der diese Dateien durch andere Versionen ersetzen kann, hat Root-Zugriff und kann auch falsche Daten an das Protokollierungssystem weiterleiten.

Wenn das Startmedium extern geschützt ist, sodass root es nicht ändern kann (z. B. weil es schreibgeschützt ist oder ausschließlich von einem sicheren Bootloader gesteuert wird) und wenn das Laden von Kernelmodulen blockiert ist, kann das Messen der Dateien zuverlässig sein, wenn es richtig durchgeführt wird . Wenn Sie die Maßnahmen jedoch nur mit Referenzwerten vergleichen, ist dies schwieriger und weniger effektiv als die Verwendung eines integritätsgeschützten Root-Dateisystems (dh in der Praxis bei dmcrypt mit Trusted Grub für den Bootloader).

Gilles 'SO - hör auf böse zu sein'
quelle
1
Sie können protokolliert werden sollen openatund execveauch (zumindest). Nun hängt es auch , was gemeint ist , verwendet und Datei , wie es sein kann , dass Sie auch angemeldet sein creat, truncate, access, stat, mkdir, connect...
Stéphane Chazelas
Könnten Sie bitte einige zusätzliche Erklärungen zu den von Ihnen genannten Methoden geben? Wo soll diese Codezeile platziert werden? Sollte ich die Datei /boot/initramfs-xxxxx.img entpacken, neu konfigurieren und als archieve wieder in / boot ablegen?
Vitaly Isaev
1
@VitalyIsaev Ich kenne Redhats Initramfs-Struktur nicht. Wenn es etwas wie Debian ist, würden Sie irgendwo unter ein Skript hinzufügen /usr/share/initramfs-tools(der Pfad kann bei RH unterschiedlich sein), dann die initramfs neu erstellen (bei Debian ist es update-initramfs) und neu starten.
Gilles 'SO - hör auf böse zu sein'
1

Ein guter Ausgangspunkt wäre , /etc/rci.dwo ieine Zahl darstellt , die Runlevel Sie booten in. Wenn Ihr Server beispielsweise kopflos ist, iist dies normalerweise 3. Wenn Sie unter sehen, /etc/rc3.dwerden die Dienste gestartet, die beim Starten von Runlevel 3 gestartet werden.

Joseph R.
quelle
Vielen Dank! Aber was sind die weiteren Schritte? Wie kann ich die Aktivität der in /etc/rc.d angegebenen Dienste verfolgen (= die Liste der Dateien abrufen, auf die sie zugreifen)?
Vitaly Isaev
RHEL6 basiert auch auf Emporkömmlingen ...
Jirib
@JiriXichtkniha Bitte korrigieren Sie mich, wenn ich falsch liege, aber verwenden nicht- upstartbasierte Init-Systeme auch das /etc/rci.dVerzeichnisschema?
Joseph R.
1
Ja, sie haben Legacy-Kompatibilität, da sie "Hook" haben, um SysV-Skripte aufzurufen :)
Jirib
1

Stellen Sie sicher, dass atimefür Ihre Root- und Boot-Dateisysteme in Ihrem Kernel aktiviert ist (oder dass dies noatimenicht festgelegt ist). Nach dem Booten können Sie statdie Zugriffszeit für jede Datei überprüfen und feststellen, auf welche während des Bootens zugegriffen wurde.

Sparr
quelle
Könnten Sie bitte erklären, wie ich das machen kann? Mein fstab hat keine Noatime- Option, aber die Zugriffszeit wird immer noch nicht in die Metadaten der Systemdateien geschrieben
Vitaly Isaev
1

Dank der RHEL-Unterstützung wurde die klare Lösung gefunden. Es basiert auf der Verwendung des Systemtap-Kernelmoduls. Zitiert von hier , um Link Rot zu vermeiden. Und nochmals vielen Dank für all Ihre Ratschläge :)

Ich konnte mir nicht einmal vorstellen, dass systemtap noch vor dem Init-Skript starten und den Bootvorgang verfolgen kann. Ich schätze den Red Hat Support und persönlich Pushpendra Chavan sehr für die Hilfe bei diesem perfekten Tool (leider weiß ich nicht, zu welchen Entwicklern diese Methode gehört - sonst würde ich sie überhaupt gutschreiben).

Wir müssen also zwei einfache Skripte erstellen:

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

und bootprobe2.1.stpin eingebetteter Systemtap-Skriptsprache geschrieben:

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>

Um die Liste der Dateien zu erhalten, auf die während des Startvorgangs im Systemtap-Protokollformat zugegriffen wird, sollten Sie Folgendes implementieren:

Herunterladen und Installieren der RICHTIG genannten Versionen systemtapund kernel debuginfoPakete (ich habe gegeben worden auf diesen Link , aber Sie würden besser nutzen diese , wenn Sie auf CentOS sind);

Erstellen /tmp/stapund/tmp/stap/data

mkdir -p /tmp/stap/data

Platziere bootprobe2.1.stpund bootinit.shin /rootund mache sie ausführbar: chmod + x / root / boot *

Bearbeiten bootinit.shund ändern Sie 'exec / sbin / init 3' in 'exec / sbin / init 5', wenn 5 Ihr Standard-Runlevel ist.

Erstellen Sie das .ko-Modul aus bootprobe2.stp

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

Starten Sie neu.

Halten Sie an grub(drücken Sie Esc oder Shift) und drücken Sie 'a' auf dem Standardkernel. Geben Sie am Ende der Kernelzeile Folgendes ein und drücken Sie die Eingabetaste:

init=/root/bootinit.sh,

Der normale Startvorgang wird fortgesetzt. Kopieren Sie nach dem Anmelden killden stapioVorgang bootprobe2.logaus dem tmpfs /tmp/stap/dataVerzeichnis und heben Sie die Bereitstellung auf.

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

Überprüfen Sie nun die Datei /tmp/stap/bootprobe2.logauf die Liste aller Dateien, die beim Booten gelesen werden.

Vitaly Isaev
quelle