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