Automatische Updates unter Linux

Posted by Tobias on 2011-02-16 at 11:52 am

Unter den Windows Benutzern sicherlich jedem bekannt: Automatische Updates. Microsoft veröffentlicht neue Patches für die Windows Installation und diese werden wahlweise vollautomatisch installiert oder heruntergeladen und nach Bestätigung installiert. Eine feine Sache um das System schnellstmöglich gegen Sicherheitslücken abzusichern. Auch unter Linux ist es möglich automatische Updates zu aktivieren. Am Beispiel einer Debian Installation werde ich das im Folgenden näher erklären...Zunächst einmal gibt es die ganz banale Methode: Einfach einen Cronjob anzulegen, der z.B. täglich läuft und die Befehle

apt-get update && apt-get dist-upgrade

durchführt. Würde sicherlich auch den Zweck erfüllen, aber deutlich komplexer und komfortabler geht mit dem Zusatzprogramm "cron-apt". Ein großer Vorteil daran ist, dass sehr einfach auch eine E-Mail Benachrichtigung für den Administrator aktiviert werden kann (wahlweise bei jedem Durchlauf, nur nach erfolgreicher Update Installation oder bei einem Fehler).

Zunächst einmal muss die cron-apt Anwendung auf dem Linux Rechner installiert werden. Angemeldet als Systemadministrator "root" kann dies mit dem Befehl

apt-get cron-apt

erledigt werden. In der Standardeinstellung ist das Programm so eingerichtet, dass es täglich um 4 Uhr morgens nach sämtlichen neuen Updates sucht, diese herunterlädt, aber nicht selbständig installiert.

Der Zeitplan wird über einen Cronjob geregelt. Dazu gibt es im Verzeichnis "/etc/cron.d/" eine Datei Namens "cron-apt". In dieser Datei steht wie schon gesagt in der Standardkonfiguration ein Cronjob, der täglich um 4 Uhr morgens läuft. Bitte beachten, dass cron-apt die eigentliche Tätigkeit dann erst etwas später durchführt. Cron-apt warten nach dem Start einige Minuten (zufallsbasiert) um die Netzwerklast zu reduzieren, falls mehrere Server um die gleiche Uhrzeit ein Update durchführen möchten. Sollte der Zeitplan dennoch ungünstig sein, dann einfach innerhalb dieser Datei die Laufzeiten anpassen. Ändern der Datei mit einem Texteditor deiner Wahl (z.B. vim):

vim /etc/cron.d/cron-apt

Des Weiteren stellt sich die Frage welche Pakete überhaupt aktualisiert werden sollen. Es bietet sich an lediglich kritische bzw. sicherheitsrelevante Updates automatisch einzuspielen. Cron-apt kann dazu angewiesen werden eine andere "sources.list" zu nutzen, als standardmäßig die "sources.list". Hierzu legen wir unter "/etc/apt/" eine neue Source-Liste mit dem Namen "security.sources.list" an. In diese Datei schreiben wir dann nur die Quellen der Sicherheitsupdates unserer Linux Distribution - im folgenden Beispiel Debian Squeeze:

echo "deb http://security.debian.org/ squeeze/updates main" > /etc/apt/security.sources.list
echo "deb-src http://security.debian.org/ squeeze/updates main" >> /etc/apt/security.sources.list

Wenn jetzt die entsprechende Sources-Datei auch wirklich unter "/etc/apt/" liegt, dann kann die Hauptkonfiguration des cron-apt Programms angepasst werden. Diese liegt im Verzeichnis "/etc/cron-apt/" und nennt sich "config". Innerhalb dieser Konfigurationsdatei - die wieder mit einem Texteditor deiner Wahl geöffnet werden kann - gibt es drei Zeilen anzupassen. Die Zeile

#MAILTO="root"

sollte auskommentiert werden (sprich die Raute am Beginn der Zeile entfernen). Benachrichtungen würden dann an den lokalen Benutzer root per E-Mail gesendet. Sollte das ungünstig sein einfach anstelle von "root" einen anderen lokalen Benutzer oder eine E-Mail Adresse angeben. Bitte dabei beachten, dass der Server im Fall einer externen E-Mail Adresse auch technisch in der Lage sein muss E-Mails zu versenden!

Die nächste Zeile sollte nicht weit von der ersten entfernt liegen und lautet in der Standardkonfiguration

#MAILON="error"

Auch diese Zeile ist auskommentiert und sollte mit entfernen der führenden Raute aktiv geschalten werden. In diesem Fall würde dann eine E-Mail nur im Fehlerfall versendet werden. Interessant wäre hier anstelle "error" die Option "always" zu verwenden. Nach jedem Durchlauf erhält dann der zuvor eingestellte Empfänger eine Benachrichtigung, was cron-apt durchgeführt hat.

Die letzte Zeile ist sehr wichtig. Hier gibt es einige Beispiele in der Konfigurationdatei, die alle auskommentiert sind. Diese Zeile muss also einfach irgendwo (am Besten in der Nähe der auskommentierten passenden Zeilen) eingefügt werden:

OPTIONS="-o quiet=1 -o Dir::Etc::SourceList=/etc/apt/security.sources.list"

Dies sorgt dann dafür, dass nur die Source-Datei verwendet wird, die wir zuvor angelegt haben und nur die kritischen sicherheitsrelevanten Updates beinhaltet.

Zuletzt muss eine Entscheidung getroffen werden. Sollen verfügbare Updates nur heruntergeladen oder auch direkt installiert werden. Im Falle des nur Herunterladen sind wir mit der Konfiguration fertig. Falls das unaufgeforderte Installieren auch erwünscht sein sollte muss noch in der Datei "/etc/cron-apt/action.d/3-download" der Parameter "-d" aus der zweiten Zeile entfernt werden. Die zweite Zeile sollte dann wie folgt aussehen:

dist-upgrade -y -o APT::Get::Show-Upgraded=true

Das war es mit der Konfiguration und wir können entweder warten bis der entsprechende Conjob cron-apt startet oder wir können mit dem folgenden Befehl einen Testlauf starten:

cron-apt -s

Die Ausgabe am Bildschirm sollte dann auch (je nach Konfiguration) per E-Email versendet werden:

CRON-APT RUN [/etc/cron-apt/config]: Wed Feb 16 04:00:01 CET 2011
CRON-APT SLEEP: 671, Wed Feb 16 04:11:12 CET 2011
CRON-APT ACTION: 0-update
CRON-APT LINE: /usr/bin/apt-get update -o quiet=2
CRON-APT ACTION: 3-download
CRON-APT LINE: /usr/bin/apt-get autoclean -y
Reading package lists...
Building dependency tree...
Reading state information...
CRON-APT LINE: /usr/bin/apt-get dist-upgrade -y -o APT::Get::Show-Upgraded=true
Reading package lists...
Building dependency tree...
Reading state information...
The following packages will be upgraded:
login passwd
2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 1815 kB of archives. After this operation, 893 kB of additional disk space will be used.
Get:1 http://security.debian.org/ squeeze/updates/main login i386 1:4.1.4.2+svn3283-2+squeeze1 [782 kB]
Get:2 http://security.debian.org/ squeeze/updates/main passwd i386 1:4.1.4.2+svn3283-2+squeeze1 [1033 kB]
Reading changelogs...
Fetched 1815 kB in 0s (3009 kB/s)
(Reading database ... 35871 files and directories currently installed.)
Preparing to replace login 1:4.1.4.2+svn3283-2 (using .../login_1%3a4.1.4.2+svn3283-2+squeeze1_i386.deb) ...
Unpacking replacement login ...
Processing triggers for man-db ...
Setting up login (1:4.1.4.2+svn3283-2+squeeze1) ...
(Reading database ... 35871 files and directories currently installed.)
Preparing to replace passwd 1:4.1.4.2+svn3283-2 (using .../passwd_1%3a4.1.4.2+svn3283-2+squeeze1_i386.deb) ...
Unpacking replacement passwd ...
Processing triggers for man-db ...
Setting up passwd (1:4.1.4.2+svn3283-2+squeeze1) ...
ServerSecurity
4 comments
Posted by Dorkas on 2011-08-10 at 6:46 pm
Dein Befehl zum erstellen der security.sources.list ist nicht vollständig:

echo "deb-src http://security.debian.org/ squeeze/updates main" >> /etc/apt/security.sources.list
-- anstatt --
echo "deb-src http://security.debian.org/ squeeze/updates" >> /etc/apt/security.sources.list
Posted by Tobias on 2011-08-10 at 6:50 pm
Hallo Dorkas,
vielen Dank. Habe ich im Post bearbeitet.

Grüße Tobi
Posted by Christopher Dosin on 2012-02-04 at 2:16 pm
Vielen Dank für das Tutorial.
Wo genau ist die Email festgelegt, wo die Berichte hingesendet werden ?
Posted by Tobias on 2012-02-04 at 2:38 pm
Hallo Christopher,
du kannst dem Parameter MAILTO eine beliebige EMail Adresse zuweisen. Standardmäßig werden die Mails an root gesendet:
MAILTO="root"
Diesen Wert kannst du aber durch deine Mail Adresse ersetzen.
Comment on This Post