Das Einspielen von Sicherheitsaktualisierungen ist ein wichtiger Bestandteil bei der Wartung von Computersoftware, besonders wenn es um das Betriebssystem geht. Für lange Zeit war dieser Prozess unter FreeBSD nicht einfach. Fehlerbehebungen mussten auf den Quellcode angewendet werden, danach wurde der Code zu neuen Binärdateien übersetzt und schliesslich mussten diese Dateien neu installiert werden.
Das ist seit längerem nicht mehr der Fall, da FreeBSD jetzt ein
Werkzeug namens freebsd-update
enthält. Dieses
Werkzeug bringt zwei getrennte Funktionen mit sich. Die erste Funktion
ermöglicht die Anwendung von Sicherheitsaktualisierungen im
Binärformat auf das FreeBSD Basissystem, ohne dieses neu zu
übersetzen und zu installieren. Die zweite Funktion
unterstützt Aktualisierungen zwischen Haupt- und
Unterversionen.
Binäre Aktualisierungen sind für alle Architekturen und
Releases verfügbar, die aktuell vom FreeBSD Security Team betreut
werden. Vor
der Aktualisierung auf eine neue Release-Version sollten die aktuellen
Ankündigungen zu dem Release gelesen werden, da diese wichtige
Informationen zu der gewünschten Version enthalten. Release
Ankündigungen finden Sie unter http://www.FreeBSD.org/releases/
.
Wenn eine crontab
existiert, welche die
Eigenschaften von freebsd-update(8) verwendet, muss diese
deaktiviert werden, bevor die folgende Aktion gestartet wird.
Manche Anwender möchten sicherlich Einstellungen in der
Standard-Konfigurationsdatei unter
/etc/freebsd-update.conf
vornehmen, um
bessere Kontrolle über den
gesamten Prozess zu besitzen. Die Optionen sind gut dokumentiert,
jedoch benötigen die folgenden ein paar zusätzliche
Erklärungen:
# Components of the base system which should be kept updated. Components src world kernel
Dieser Parameter kontrolliert, welche Teile von FreeBSD auf dem
aktuellen Stand gehalten werden sollen. In der Voreinstellung
wird der Quellcode, das gesamte Basissystem sowie der Kernel
aktualisiert. Die Komponenten sind die gleichen wie während
der Installation. Das hinzufügen von
world/games
erlaubt es,
Aktualisierungen für Spiele anzuwenden.
Die Verwendung von src/bin
erlaubt es, den
Quellcode in src/bin
aktuell zu
halten.
Die beste Einstellung ist, diese Option so zu belassen, da eine Änderung es bedingt, dass man als Benutzer jede Komponente auflisten muss, die aktualisiert werden soll. Dies könnte katastrophale Folgen nach sich ziehen, da der Quellcode und die Binärdateien dadurch nicht mehr synchron wären.
# Paths which start with anything matching an entry in an IgnorePaths # statement will be ignored. IgnorePaths
Fügen Sie Pfade wie /bin
oder /sbin
hinzu, um diese speziellen
Verzeichnisse während des Aktualisierungsprozesses unberührt
zu lassen. Diese Option kann verwendet werden, um zu verhindern, dass
freebsd-update
lokale Änderungen
überschreibt.
# Paths which start with anything matching an entry in an UpdateIfUnmodified # statement will only be updated if the contents of the file have not been # modified by the user (unless changes are merged; see below). UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile
Aktualisiert nur unmodifizierte Konfigurationsdateien in
den angegebenen Verzeichnissen. Jede
Änderung, die der Benutzer daran vorgenommen hat, wird die
automatische Aktualisierung dieser Dateien ungültig machen.
Es gibt eine weitere Option KeepModifiedMetadata
,
die freebsd-update
instruiert, die Änderungen
während der Zusammenführung zu speichern.
# When upgrading to a new FreeBSD release, files which match MergeChanges # will have any local changes merged into the version from the new release. MergeChanges /etc/ /var/named/etc/
Eine Liste von Verzeichnissen mit Konfigurationsdateien, in denen
freebsd-update
Zusammenführungen versuchen
soll. Dieser Verschmelzungsprozess von Dateien ist eine Serie von
diff(1)-Korrekturen, ähnlich wie mergemaster(8), aber
mit weniger Optionen. Die Änderungen werden entweder akzeptiert,
oder öffnen einen Editor, oder freebsd-update
bricht
ab. Im Zweifelsfall sichern Sie /etc
und
akzeptieren einfach die Änderungen. Lesen Sie Abschnitt 24.7.12.1, „mergemaster
“, um Informationen über
mergemaster
zu erhalten.
# Directory in which to store downloaded updates and temporary # files used by FreeBSD Update. # WorkDir /var/db/freebsd-update
In diesem Verzeichnis werden alle Korrekturen und temporären Dateien abgelegt. Im Falle einer Versionsaktualisierung sollte diesem Verzeichnis mindestens ein Gigabyte Festplattenspeicher zur Verfügung stehen.
# When upgrading between releases, should the list of Components be # read strictly (StrictComponents yes) or merely as a list of components # which *might* be installed of which FreeBSD Update should figure out # which actually are installed and upgrade those (StrictComponents no)? # StrictComponents no
Wenn diese Option auf yes
gesetzt ist, wird
freebsd-update
annehmen, dass die
Components
-Liste vollständig ist und nicht
versuchen, Änderungen ausserhalb dieser Liste zu tätigen.
Tatsächlich wird freebsd-update
versuchen, jede
Datei zu aktualisieren, die zu der Components
-Liste
gehört.
Sicherheitsaktualisierungen für FreeBSD können wie folgt heruntergeladen und installiert werden:
#
freebsd-update fetch
#
freebsd-update install
Wenn während Aktualisierung Korrekturen am Kernel
angewendet werden, muss das System neu gestartet werden, damit
der korrigierte Kernel gebootet wird. Andernfalls sollte das
System aktualisiert sein und freebsd-update
kann als nächtlicher cron(8)-Job laufen, indem folgender
Eintrag in /etc/crontab
hinzugefügt
wird:
@daily root freebsd-update cron
Dieser Eintrag besagt, dass
freebsd-update
einmal am Tag ausgeführt
wird. Wenn es über cron
ausgeführt wird,
prüft freebsd-update
lediglich, ob
Aktualisierungen vorliegen. Wenn Korrekturen existieren,
werden diese automatisch auf die lokale Festplatte
heruntergeladen, aber nicht eingespielt. Der root
-Benutzer bekommt eine
Nachricht, damit die Korrekturen überprüft und manuell
installiert werden können.
Wenn etwas schief geht, kann
freebsd-update
den letzten Satz von
Änderungen mit folgendem Befehl rückgängig machen:
#
freebsd-update rollback
Sobald dieser Vorgang abgeschlossen ist, sollte das System neu gestartet werden, wenn der Kernel oder ein beliebiges Kernelmodul geändert wurde. Dies ermöglicht es FreeBSD, die neuen Binärdateien in den Hauptspeicher zu laden.
Das freebsd-update
-Werkzeug kann nur den
GENERIC
-Kernel automatisch aktualisieren. Wenn
ein angepasster Kernel verwendet wird, muss dieser neu
erstellt und installiert werden, nachdem
freebsd-update
den Rest der Aktualisierungen
durchgeführt hat. Allerdings wird
freebsd-update
den
GENERIC
-Kernel in
/boot/GENERIC
erkennen und aktualisieren,
selbst wenn dies nicht der aktuell verwendete Kernel des
Systems ist.
Es ist eine gute Idee, immer eine Kopie des
GENERIC
-Kernels in /boot/GENERIC
aufzubewahren. Das wird
bei der Diagnose von verschiedenen Problemen eine grosse Hilfe sein,
sowie bei der Durchführung von Versionsaktualisierungen mit
freebsd-update
, wie in Abschnitt 24.2.3, „Aktualisierungen an Haupt- und Unterversionen“ beschrieben ist.
Solange die Standardkonfiguration in
/etc/freebsd-update.conf
nicht geändert
wurde, wird freebsd-update
die aktualisierten
Quellcodedateien des Kernels zusammen mit dem Rest der Neuerungen
installieren. Die erneute Übersetzung und Installation eines
neuen, angepassten Kernels kann dann auf die übliche
Art und Weise durchgeführt werden.
Die Aktualisierungen, die über
freebsd-update
verteilt werden, betreffen nicht
immer den Kernel. Es ist nicht notwendig, den angepassten
Kernel neu zu erstellen, wenn die Kernelquellen nicht durch die
Ausführung von freebsd-update install
geändert wurden. Allerdings wird
freebsd-update
immer
/usr/src/sys/conf/newvers.sh
aktualisieren.
Der aktuelle Patch-Level, der mit der
-p
-Nummer bei uname -r
ausgegeben wird, wird aus dieser Datei ausgelesen.
Die Neuinstallation des angepassten Kernels, selbst wenn
sich daran nichts geändert hat, erlaubt es uname(1), den
aktuellen Patch-Level des Systems korrekt wiederzugeben. Dies ist
besonders hilfreich, wenn mehrere Systeme gewartet werden, da es
eine schnelle Einschätzung der installierten Aktualisierungen in
jedem einzelnen System ermöglicht.
Aktualisierungen einer Unterversion zur nächsten in FreeBSD ist beispielsweise die Aktualisierung von FreeBSD 9.0 auf FreeBSD 9.1. In der Regel funktionieren die installierten Anwendungen weiterhin problemlos nach der Aktualisierung einer Unterversion.
Eine Aktualisierung der Hauptversion ist besipielsweise die Aktualisierung von FreeBSD 8.X auf FreeBSD 9.X. Dieser Prozess entfernt alte Objekt-Dateien und Bibliotheken, was dazu führt, dass die meisten Anwendungen von Drittherstellern nicht mehr funktionieren. Nach der Aktualisierung auf eine neue Hauptversion wird empfohlen, dass alle installierten Ports entweder entfernt und neu installiert werden, oder mit einem Werkzeug wie ports-mgmt/portmaster aktualisiert werden. Um die Neuerstellung aller installierten Anwendungen zu erwzingen, benutzen Sie folgenden Befehl:
#
portmaster -af
Dies sorgt dafür, dass alles korrekt neu installiert wird.
Beachten Sie, dass das Setzen der
BATCH
-Umgebungsvariable auf yes
während dieses Prozesses auf jede Eingabe mit
ja
antwortet, was es nicht mehr notwendig macht,
manuell eingreifen zu müssen.
Wenn ein angepasster Kernel verwendet wird, ist der Aktualisierungsprozess ein wenig aufwändiger und das Vorgehen variiert je nach Version von FreeBSD.
Eine Kopie des GENERIC
-Kernel
wird benötigt und sollte in
/boot/GENERIC
abgelegt sein. Wenn
der GENERIC
-Kernel nicht im
System vorhanden ist, kann er über eine der folgenden
Methoden bezogen werden:
Wenn ein angepasster Kernel erstmalig gebaut
wurde, ist der Kernel in
/boot/kernel.old
in Wirklichkeit
der GENERIC
-Kernel. Benennen Sie
dieses Verzeichnis in
/boot/GENERIC
um.
Angenommen, ein direkter Zugriff auf die
Maschine ist möglich, so kann eine Kopie des
GENERIC
-Kernels von den
Installationsmedien installiert werden. Benutzen
Sie dazu folgende Befehle:
#
mount /cdrom
#
cd /cdrom/X.Y-RELEASE/kernels
#
./install.sh GENERIC
Ersetzen Sie X.Y-RELEASE
durch die aktuelle Version des verwendeten Releases. Der
GENERIC
-Kernel wird standardmäßig
in /boot/GENERIC
installiert.
Falls alle obigen Schritte fehlschlagen, kann der
GENERIC
-Kernel folgendermaßen
aus den Quellen neu gebaut und installiert
werden:
#
cd /usr/src
#
env DESTDIR=/boot/GENERIC make kernel __MAKE_CONF=/dev/null SRCCONF=/dev/null
#
mv /boot/GENERIC/boot/kernel/* /boot/GENERIC
#
rm -rf /boot/GENERIC/boot
Damit dieser Kernel als
GENERIC
-Kernel von
freebsd-update
erkannt wird, darf
die GENERIC
-Konfigurationsdatei
in keiner Weise geändert worden sein. Es wird
ebenfalls empfohlen, dass dieser ohne irgendwelche
speziellen Optionen erstellt wird.
Der Neustart in den
GENERIC
-Kernel ist zu diesem
Zeitpunkt nicht notwendig.
Wenn ein angepasster Kernel erstmalig gebaut
wurde, ist der Kernel in
/boot/kernel.old
in Wirklichkeit
der GENERIC
-Kernel. Benennen Sie
einfach dieses Verzeichnis in
/boot/GENERIC
um.
Angenommen, ein direkter Zugriff auf die Maschine
ist möglich, so kann eine Kopie des
GENERIC
-Kernels von den
Installationsmedien installiert werden. Benutzen Sie
dazu folgende Befehle:
#
mount /cdrom
#
cd /cdrom/usr/freebsd-dist
#
tar -C/ -xvf kernel.txz boot/kernel/kernel
Wenn die oben genannten Optionen nicht verwendet
werden können, kann der
GENERIC
-Kernel aus den Quellen
neu gebaut und installiert werden:
#
cd /usr/src
#
make kernel __MAKE_CONF=/dev/null SRCCONF=/dev/null
Damit dieser Kernel als
GENERIC
-Kernel von
freebsd-update
erkannt wird, darf
die GENERIC
-Konfigurationsdatei
in keiner Weise geändert worden sein. Es wird
ebenfalls empfohlen, dass dieser ohne irgendwelche
speziellen Optionen erstellt wird.
Der Neustart in den
GENERIC
-Kernel ist zu diesem
Zeitpunkt nicht notwendig.
Aktualisierungen an Haupt- und Unterversionen können
durchgeführt werden, wenn man
freebsd-update
eine Release-Version als
Ziel übergibt. Beispielsweise wird das folgende Kommando
das System auf FreeBSD 9.1 aktualisieren:
#
freebsd-update -r 9.1-RELEASE upgrade
Nachdem das Kommando empfangen wurde, überprüft
freebsd-update
die Konfigurationsdatei
und das aktuelle System, um die nötigen Informationen für
die Systemaktualisierung zu sammeln. Eine Bildschirmausgabe
wird anzeigen, welche Komponenten erkannt und welche nicht
erkannt wurden. Zum Beispiel:
Looking up update.FreeBSD.org mirrors... 1 mirrors found. Fetching metadata signature for 9.0-RELEASE from update1.FreeBSD.org... done. Fetching metadata index... done. Inspecting system... done. The following components of FreeBSD seem to be installed: kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin world/base world/info world/lib32 world/manpages The following components of FreeBSD do not seem to be installed: kernel/generic world/catpages world/dict world/doc world/games world/proflibs Does this look reasonable (y/n)? y
An diesem Punkt wird freebsd-update
versuchen, alle notwendigen Dateien für die Aktualisierung
herunter zu laden. In manchen Fällen wird der Benutzer mit
Fragen konfrontiert, um festzustellen, was installiert
werden soll oder auf welche Art und Weise fortgesetzt
werden soll.
Wenn ein angepasster Kernel benutzt wird, produziert der vorherige Schritt eine Warnung ähnlich zu der folgenden:
WARNING: This system is running a "
MYKERNEL
" kernel, which is not a
kernel configuration distributed as part of FreeBSD 9.0-RELEASE.
This kernel will not be updated: you MUST update the kernel manually
before running "/usr/sbin/freebsd-update install"
Diese Warnung kann an dieser Stelle problemlos ignoriert
werden. Der aktualisierte
GENERIC
-Kernel wird als ein
Zwischenschritt im Aktualisierungsprozess verwendet.
Nachdem alle Korrekturen auf das lokale System
heruntergeladen wurden, werden diese eingespielt.
Dieser Prozess kann eine gewisse Zeit in Anspruch nehmen,
abhängig von der Geschwindigkeit und Auslastung der
Maschine. Konfigurationsdateien werden ebenfalls
zusammengefügt. Dieser Teil der Prozedur
verlangt einige Benutzereingaben, da eine Datei
möglicherweise von Hand zusammengefasst werden muss oder ein
Editor erscheint auf dem Bildschirm zum manuellen
bearbeiten. Die Ergebnisse von jeder erfolgreichen
Zusammenfassung werden dem Benutzer angezeigt, während der
Prozess weiter läuft. Eine fehlgeschlagene oder ignorierte
Zusammenfassung wird den Prozess sofort beenden. Benutzer
sollten eine Sicherung von /etc
anlegen
und wichtige Dateien später manuell vereinen, beispielsweise
master.passwd
oder
group
.
Das System ist zu diesem Zeitpunkt noch nicht verändert worden, da alle Korrekturen und Vereinigungen in einem anderen Verzeichnis vorgenommen wurden. Wenn alle Korrekturen erfolgreich eingespielt, alle Konfigurationsdateien zusammengefügt wurden und es den Anschein hat, dass der Prozess problemlos verlaufen wird, müssen die Änderungen vom Anwender noch angewendet und auf die Platte geschrieben werden:
#
freebsd-update install
Der Kernel und die Module werden zuerst aktualisiert.
Zu diesem Zeitpunkt muss die Maschine neu gestartet werden.
Wenn das System einen angepassten Kernel verwendet, benutzen
Sie nextboot(8), um den Kernel für den nächsten
Neustart auf /boot/GENERIC
zu
setzen:
#
nextboot -k GENERIC
Bevor das System mit dem
GENERIC
-Kernel neu gestartet wird,
vergewissern Sie sich, dass für den Neustart alle
benötigten Treiber enthalten sind. Falls auf die
Maschine aus der Ferne zugegriffen wird, stellen Sie
sicher, dass das System ordnungsgemäß an das Netzwerk
angeschlossen ist. Achten Sie besonders darauf, dass wenn
der angepasste Kernel Funktionalität beinhaltet, die
normalerweise von Kernelmodulen zur Verfügung gestellt
werden, dass diese temporär über
/boot/loader.conf
in den
GENERIC
-Kernel übernommen werden.
Zudem wird empfohlen, nicht benötigte Dienste, eingehängte
Platten und verbundene Netzlaufwerke zu deaktivieren, bis
der Aktualisierungsprozess abgeschlossen ist.
Die Maschine sollte nun mit dem aktualisierten Kernel neu gestartet werden:
#
shutdown -r now
Sobald das System wieder online ist, muss
freebsd-update
erneut gestartet werden.
Der Zustand des Prozesses wurde zuvor gesichert und deshalb
wird freebsd-update
nicht von vorne
beginnen, jedoch alle alten gemeinsam genutzten
Bibliotheken und Objektdateien löschen.
#
freebsd-update install
Abhängig davon, ob irgendwelche Bibliotheksversionen erhöht wurden, kann es sein, dass nur zwei Installationsphasen anstatt drei durchlaufen werden.
Nach der Aktualisierung auf eine Hauptversion, muss jegliche Drittanbieter-Software neu erstellt und installiert werden. Dies ist notwendig, da die installierte Software möglicherweise Abhängigkeiten zu Bibliotheken enthält, die während der Aktualisierung entfernt wurden. Dieser Prozess kann mit einem Werkzeug wie ports-mgmt/portmaster automatisiert werden:
#
portmaster -f
Sobald dies abgeschlossen ist, beenden Sie den
Aktualisierungsprozess mit einem letzten Aufruf von
freebsd-update
. Geben Sie den folgenden
Befehl ein, um alle losen Enden des Aktualisierungsprozesses
miteinander zu verknüpfen:
#
freebsd-update install
Wenn der GENERIC
-Kernel temporär
Verwendung fand, ist dies der richtige Zeitpunkt, einen neuen,
angepassten Kernel zu bauen und über die übliche
Methode zu installieren.
Booten Sie anschließend die Maschine in die neue FreeBSD-Version. Der Prozess ist damit abgeschlossen.
freebsd-update
kann verwendet werden,
um den Zustand der installierten FreeBSD-Version gegenüber
einer bekannten und funktionierenden Kopie zu vergleichen.
Diese Option vergleicht die aktuelle Version von
Systemwerkzeugen, Bibliotheken und Konfigurationsdateien. Um
diesen Vergleich zu starten, geben Sie den folgenden Befehl
ein:
#
freebsd-update IDS >> outfile.ids
Obwohl der Befehlsname IDS lautet,
ist dies kein Ersatz für ein echtes Intrusion Detection
System wie security/snort. Da
freebsd-update
seine Daten auf Platte
ablegt, ist die Möglichkeit von Verfälschungen
offensichtlich. Obwohl diese Möglichkeit durch die
Verwendung von kern.securelevel
oder die
Ablage von Daten auf einem Nur-Lese Dateisystem eingedämmt
werden kann, besteht eine bessere Lösung darin, das System
gegen ein gesichertes Medium, wie eine
DVD oder einen externen, separat
aufbewahrten USB-Plattenspeicher, zu
vergleichen.
Das System wird nun überprüft, und eine lange Liste
von Dateien zusammen mit den sha256(1)-Hashwerten, sowohl
der von der Release-Version bekannte Wert als auch der des
aktuell installierten Systems, in
outfile.ids
geschrieben.
Die Zeilen in der Ausgabe sind extrem lang, aber das Ausgabeformat kann einfach verarbeitet werden. Um beispielsweise eine Liste von allen Dateien zu erhalten, die sich vom aktuellen Release unterscheiden, geben Sie das folgende Kommando ein:
#
cat outfile.ids | awk '{ print $1 }' | more
/etc/master.passwd /etc/motd /etc/passwd /etc/pf.conf
Diese Beispielausgabe wurde abgeschnitten, da noch viele
weitere Dateien vorhanden sind. Einige Dateien wurden auf
natürliche Art verändert. /etc/passwd
wurde beispielsweise geändert, um Benutzer zum System
hinzuzufügen. Andere Dateien, wie Kernelmodule, unterscheiden
sich, weil freebsd-update
diese
aktualisiert hat. Um bestimmte Dateien oder Verzeichnisse
auszuschließen, fügen Sie diese an die
IDSIgnorePaths
-Option in
/etc/freebsd-update.conf
an.
Diese Vorgehensweise kann als Teil einer ausgeklügelten Aktualisierungsmethode benutzt werden, unabhängig von der zuvor angesprochenen Variante.
Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an
<de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an
<de-bsd-translators@de.FreeBSD.org>.