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 -y01.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.conf01.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";
EOF01.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";/' $file01.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.conf02| 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 -y02.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.esJetzt 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 exim402.1| Test der Mail-Konfig
Ob der Eintrag in /etc/email-addresses funktioniert, kann mit folgendem Kommando überprüft werden:
exim -brw rootSieht 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" $receiverDie 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" rootWenn alles funktioniert sollte zumindest die Umgebungsvariable mit dem E-Mail-Passwort wieder aus dem Speicher gelöscht werden:
unset SMTP_PASS
Kommentare