Wie ich immer alle Internet-Dienste aktualisiert halte

Regelmäßige Updates sind entscheidend, um Sicherheitslücken zu schließen. Dieser Beitrag zeigt den Updateprozess meiner Docker- und Host-Systeme.

Wie ich immer alle Internet-Dienste aktualisiert halte
Photo by Markus Winkler / Unsplash

Die regelmäßige Aktualisierung der installierten Software gehört zu den zentralen Aufgaben eines Administrators. Um potenzielle Sicherheitslücken schnell zu schließen, ist es entscheidend, auf aktuelle Updates zu achten. Hierbei können wir auf bereits integrierte Systemfunktionen zurückgreifen, die in vielen Plattformen vorhanden sind.

Docker

Im Post über meinen Webserver habe ich es bereits thematisiert. Für diesen Zweck war der Ordner /var/docker/admin/ vorgesehen.

Eigener Webserver mit offiziellen Zertifikaten
Der Basis-Artikel für alle folgenden Services, die ich hier demonstrieren werde…

Hier lege ich folgendes docker-compose.yml-File an, um watchtower dazu zu nutzen, Dockercontainer aktuell zu halten:

version: '3'

services:
  watchtower:
    container_name: watchtower
    image: containrrr/watchtower:latest
    command: --cleanup --label-enable --schedule "0 3 * * *"
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_NOTIFICATIONS=email
      - WATCHTOWER_NOTIFICATIONS_HOSTNAME=[Sender-Host]
      - WATCHTOWER_NOTIFICATION_EMAIL_SUBJECTTAG=[Sender-Host]
      - WATCHTOWER_NOTIFICATION_EMAIL_FROM=[From-Address]
      - WATCHTOWER_NOTIFICATION_EMAIL_TO=[To-Address]
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=[Mailserver-Hostname]
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=465
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=[user-on-mailserver]
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=[and-his-password]
    labels:
      - com.centurylinklabs.watchtower.enable=true

In dieser Konfiguration werden nur die Container aktualisiert, denen man den Label com.centurylinklabs.watchtower.enable=true mitgibt. Da watchtower selbst diesen Label enthält, wird er selbst ebenfalls aktualisiert, sobald es eine neue Version gibt. In dieser Konfiguration erfolgt die Überprüfung immer um 3:00 Uhr. 😉

Eine Email informiert über Aktualisierungen, falls ein Update durchgeführt wurde:

Von: Watchtower <mmlxc@xxxxxxxx.de>
An: michael@yyyyyyyyyy.de
Betreff: [mmlxc] Watchtower updates on mmlxc
Datum: 12/20/23 11:20:49

Found new grafana/grafana:latest image (8387f19108f9)
Stopping /grafana (688d23bb5f1e) with SIGTERM
Creating /grafana
Removing image 06e5d59b720d

Der Host selbst

Es ist relativ einfach, auf dem Host sicherzustellen, dass das System stets auf dem neuesten Stand ist. Da wir bereits E-Mail-Benachrichtigungen für solche Fälle eingerichtet haben, erhalten wir automatisch eine Information, sollte ein zusätzlicher Neustart notwendig sein. Im Folgenden sind die erforderlichen Schritte aufgeführt:

apt update && apt upgrade -y
apt install unattended-upgrades apt-listchanges apt-utils
dpkg-reconfigure -plow unattended-upgrades

In der Datei /etc/apt/apt.conf.d/50unattended-upgrades muss eine Email-Adresse hinterlegt werden und eine Reboot-Policy:

Unattended-Upgrade::Mail "[YOUR_MAIL_HERE]";
Unattended-Upgrade::Automatic-Reboot "false";

Ich reboote offensichtlich meine Server selbst, sobald ich dazu aufgefordert werde. Wer diese Aufgabe auch automatisieren will, kann dies hier natürlich leicht ändern.

Auch in /etc/apt/listchanges.conf muss noch eine Email-Adresse eingetragen werden:

email_address=[YOUR_MAIL_HERE]

Wenn man testen will, ob alles funktioniert, kann man unattended-upgrades --dry-run ausführen.

Wurde dann eine Aktualisierung vorgenommen, erhält man auch hier eine Email:

Von: mmlxc@xxxxxxxxxx.de
An: michael@yyyyyyyyyyyyyy.de
Betreff: [reboot required] unattended-upgrades result for mmlxc.xxxxxx.world: SUCCESS
Datum: 12/20/23 06:08:56

Unattended upgrade result: All upgrades installed

Warning: A reboot is required to complete this upgrade, or a previous one.

Unattended-upgrades log:
Starting unattended upgrades script
Allowed origins are: o=Ubuntu,a=jammy, o=Ubuntu,a=jammy-security, o=UbuntuESMApps,a=jammy-apps-security, o=UbuntuESM,a=jammy-infra-security
Initial blacklist:
Initial whitelist (not strict):
Packages that will be upgraded: libssh-4 libssh-gcrypt-4 openssh-client openssh-server openssh-sftp-server
Writing dpkg log to /var/log/unattended-upgrades/unattended-upgrades-dpkg.log
All upgrades installed

Fazit

Automatische Updates übernehmen zeitraubende, wiederkehrende Aufgaben auf effiziente Weise. Mit der hier vorgestellten Konfiguration reicht es aus, den Vorgang zu überwachen. Sollte ein Neustart erforderlich sein, wird man entsprechend benachrichtigt, und es besteht die Möglichkeit, diesen automatisch durchführen zu lassen oder manuell zu erledigen.

In den Templates meiner VMs und LXC-Container in meiner kleinen Cloud ist diese Konfiguration bereits integriert, sodass ich beim Erstellen neuer Maschinen sofort mit ihrer eigentlichen Aufgabe beginnen kann. Auf diese Weise dauert das Aufsetzen eines sicher konfigurierten Hosts nur etwa 10 Sekunden.