Debian: Automatische Updates

Muss man mehrer Linux-Container oder -VMs verwalten, so können alleine die regelmäßigen Updates recht viel Zeit kosten. Daher richte ich meine Systeme üblicherweise so ein, dass zumindest die Security-Updates automatisch installiert werden. Für Debian-Systeme gehe ich dabei folgendermaßen vor:

01| unattended-upgrades installieren

Die automatisierten Updates werden über das unattended-upgrade durchgeführt, das ich zunächst zusammen mit dem Paket apt-listchanges installiere:

apt update
apt install unattended-upgrades apt-listchanges -y

01.1| listchanges.conf anpassen

Jetzt wird zunächst die Datei /etc/apt/listchanges.conf angepasst. Dabei wird für die E-Mail-Adresse des Empfängers zunächst der Platzhalter [CHANGEME@YOURMAIL.COM] verwendet, der später durch die richtige Empfängeradresse ersetzt wird:

sed -i -E "s/(which=).*$/\1both/" /etc/apt/listchanges.conf
sed -i -E "s/(email_address=).*$/\1[CHANGEME@YOURMAIL.COM]/" /etc/apt/listchanges.conf

01.2| Update Zyklus festlegen

Im nächsten Schritt wird festgelegt wie oft das Automatische Update durchgeführt werden soll. Dazu kann entweder die Datei /etc/apt/apt.conf.d/02periodic oder die Datei /etc/apt/apt.conf.d/20auto-upgrades angelegt werden. Um auf Nummer sicher zu gehen habe ich gleich beide Dateien angepasst:

cat << EOF > /etc/apt/apt.conf.d/02periodic
// Enable the update/upgrade script (0=disable)
APT::Periodic::Enable "1";

// Do "apt-get update" automatically every n-days (0=disable)
APT::Periodic::Update-Package-Lists "1";

// Do "apt-get upgrade --download-only" every n-days (0=disable)
APT::Periodic::Download-Upgradeable-Packages "1";

// Run the "unattended-upgrade" security upgrade script
// every n-days (0=disabled)
// Requires the package "unattended-upgrades" and will write
// a log in /var/log/unattended-upgrades
APT::Periodic::Unattended-Upgrade "1";

// Do "apt-get autoclean" every n-days (0=disable)
APT::Periodic::AutocleanInterval "7";
EOF

 

cat <<EOF > /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";
EOF

01.4| 50unattended-upgrades anpassen

In der Datei /etc/apt/apt.conf.d/50unattended-upgrades kann das Verhalten von unattended-upgrades noch angepasst werden. Hier ändere ich im Wesentlichen nur folgende Punkte:

  • Es sollen nur Security-Updates automatisch durchgeführt werden
  • Empfänger der Status-Mails 
  • Absender der Status-Mails 
  • Automatischer Reboot nachts um 4:00 Uhr durchführen

Auch hier verwende ich erstmal wieder Platzhalte für die Absender und Empfänger-Adresse:

file="/etc/apt/apt.conf.d/50unattended-upgrades"
sed -i -E  's/(.*"origin=Debian,codename=\$\{distro_codename\},label=Debian";)/\/\/\1/' $file
sed -i -E  's/\/\/(Unattended-Upgrade::Mail ).*/\1 "[CHANGEME@YOURMAIL.COM]";\nUnattended-Upgrade::Sender "[CHANGEME@SENDERMAIL.COM]";/' $file
sed -i -E  's/\/\/(Unattended-Upgrade::MailReport "on-change";)/\1/' $file
sed -i -E  's/\/\/(Unattended-Upgrade::Automatic-Reboot )"false";/\1;"true"/' $file
sed -i -E  's/\/\/(Unattended-Upgrade::Automatic-Reboot-Time ).*$/\1"04:00";/' $file

01.5| E-Mail-Adressen anpassen

Jetzt werden die Platzhalter für Sender und Empfänger festgelegt. Dazu sollten zunächst die beiden Umgebungsvariablen $sender und $receiver festgelegt werden, da ich diese Informationen auch bei der Einrichtung von Exim (siehe unten) weiter verwende:

# TODO: auf eine Adresse abändern, von der Benachrichtigungsmails verschickt werden sollen
sender="DISPLAYNAME <sender@maildomain.com>"

# TODO: auf eine Adresse abändern, von der Benachrichtigungsmails verschickt werden sollen
receiver="receiver@maildomain.com"

sed -i -E "s/\[CHANGEME@YOURMAIL.COM\]/$receiver/g" /etc/apt/apt.conf.d/50unattended-upgrades
sed -i -E "s/\[CHANGEME@SENDERMAIL.COM\]/$sender/g" /etc/apt/apt.conf.d/50unattended-upgrades
sed -i -E "s/\[CHANGEME@YOURMAIL.COM\]/$receiver/g" /etc/apt/listchanges.conf

02| E-Mail einrichten

Damit der Host E-Mails über erfolgreiche oder fehlgeschlagene Updates verschicken kann muss ein Mail Transfer Agent (MTA) installiert und eingerichtet werden. In diesem Fall verwende ich Exim, der folgendermaßen installiert wird:

apt install exim4 -y

02.1| Exim konfigurieren

Bei der Konfiguration brauchen wir einige Informationen immer mal wieder. Diese speichern wir vorübergehend am besten in Umgebungsvariablen:

# Folgende Umgebungsvariablen müssen gesetzt werden, damit die Exim-Konfiguration
# durchgeführt werden kann:

SMTP_HOST=""           # z.B. v01234567.kasserver.com
SMTP_PORT=""           # z.B. 587
SMTP_USER=""           # z.B. m0c12345
SMTP_PASS=""           # your SMTP pwd
IP_ADDR=""             # z.B. 192.168.5.3
HOST_NAME=""           # z.B. pi-hole
DOMAIN=""              # z.B. nerdig.es

Jetzt werden die unterschiedlichen Konfigurationsdateien angepasst:

HOST_FQDN="${HOST_NAME}.${DOMAIN}"

# update update-exim4.conf.conf
sed -i -E "s/(dc_eximconfig_configtype=').*'/\1satellite'/" /etc/exim4/update-exim4.conf.conf
sed -i -E "s/(dc_readhost=').*'/\1$HOST_FQDN'/" /etc/exim4/update-exim4.conf.conf
sed -i -E "s/(dc_smarthost=').*'/\1$SMTP_HOST::$SMTP_PORT'/" /etc/exim4/update-exim4.conf.conf
sed -i -E "s/(dc_hide_mailname=').*'/\1true'/" /etc/exim4/update-exim4.conf.conf

# add passwd_client
echo "${SMTP_HOST}:${SMTP_USER}:${SMTP_PASS}" >> /etc/exim4/passwd.client

# Prepare exim conf to rewrite From: field
sed -E 's/(^ .*\{\$value\}fail\}" Ffrs)/\1w/' /etc/exim4/exim4.conf.template
update-exim4.conf

# configure /etc/mailname
echo $HOST_FQDN > /etc/mailname

# Forward mails for root to your E-Mail-Address
echo "root: $receiver" >> /etc/aliases
exim_dbmbuild /etc/aliases /etc/aliases.db

# Hostname setzen
hostname -b $HOST_NAME
echo $HOST_FQDN > /etc/hostname
grep -E "${HOST_FQDN//\./\\.}\s.*${HOST_NAME}" /etc/hosts ||  echo -e "${IP_ADDDR}\t$HOST_FQDN $HOST_NAME" >> /etc/hosts

Über einen Eintrag in der Datei /etc/email-addresses kann der Absender (From:) für allgemeiner System-Mails angepasst werden:

echo "root: $sender" >> /etc/email-addresses 

Jetzt kann der Exim-Dienst aktiviert werden:

# restart and enable Exim4
systemctl restart exim4
systemctl enable exim4

02.1| Test der Mail-Konfig

Ob der Eintrag in /etc/email-addresses funktioniert, kann mit folgendem Kommando überprüft werden:

exim -brw root

Sieht alles gut aus können wir zwei Mails versenden. Die erste Mail geht direkt an den externen Empfänger und sollte zugestellt werden, wenn alle Daten (vor allem die SMTP-Zugangsdaten) passen:

echo "Diese Mail wurde direkt an $receiver gesendet" | mail -s "Testmail 1" $receiver

Die zweiten Mail wird an das lokale root-Konto gesendet und sollte dank des Eintrags in /etc/alises ebenfalls bei $receiver landen:

echo "Diese Mail wurde an root gesendet" | mail -s "Testmail 2" root

Wenn alles funktioniert sollte zumindest die Umgebungsvariable mit dem E-Mail-Passwort wieder aus dem Speicher gelöscht werden:

unset SMTP_PASS

Kommentare

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page