Eine praxisnahe Schritt-für-Schritt-Anleitung für Debian-basierte Systeme – Von Backup über Update bis Rollback inkl. Patching-Template-Markdown-File
Das regelmäßige Aktualisieren eines Linux-Servers bildet das unerschütterliche Fundament, um die Sicherheit, Stabilität, Sexiness und Effizienz des Systems zu gewährleisten. Damit die Kiste beim Patchen keine Faxen macht und der Prozess zugleich professionell, sauber und reproduzierbar bleibt, habe ich mir ein überaus detailliertes, hochskalierbares, synergiegetriebenes und maximal wertschöpfendes Enterprise-Grade Linux Patching Template (Checkliste) erstellt, das mittlerweile schon seit Jahren erfolgreich in Benutzung ist. Da ich keine vergleichbar vollständige Anleitung im Netz gefunden habe, die den kompletten Patch-Prozess von Backup über Pre-/Post-Checks bis 🧻Cleanup wirklich vollständig abbildet, dachte ich mir, ich teile es hier, visuell und als Markdown-Version, brav mit euch wie Moses das Meer.
Ursprünglich entstand dieses Template im medizinischen IT-Umfeld, einer harschen Welt, in der Fehler oder Ausfälle (technisch wie gastrointestinal 🚽) nicht nur lästig, sondern hochkritisch sind. Systeme müssen dort absolut zuverlässig funktionieren, und Updates dürfen, frei nach dem Motto „Mal ist man 🐕Hund, mal ist man🌳Baum“, kein russisches-Roulette-Game sein. Dieses Umfeld legte den Grundstone für diese umfangreiche Checkliste.
Das Template geleitet einen systematisch und sicher durch den Debian-basierten Update-Prozess (ohne vorher einen Schornsteinfeger gerubbelt haben zu müssen) und diente später sogar brav als Blaupause zur Automatisierung via Ansible-Playbook.
Warum überhaupt ein Linux Patching Template?
- Nachvollziehbarkeit: Jeder Step ist dokumentiert, Anomalien schnell erkennbar
- Standardisierung: Gleicher Ablauf auf allen Systemen, egal welcher Lolli patched
- Vorher-Nachher-Vergleich: Performance, Dienste und Security-Status fett im Blick
- Verlässlichkeit: Die Abläufe sind jedes Mal gleich, man vergisst und verzettelt nichts
- Sicherheit: Backups & Checks, bevor irgendetwas so hart wie eine Flasche Rakija knallt
- Onboarding-Erleichterung: Neue Admins können mit klaren Abläufen sofort steil gehen
- Nervenberuhigung: Man muss den „Gott des Absturzes“ nicht jedes Mal neu besänftigen
- Struktur: Kein Chaos, sondern ein klarer roter Faden um sich keinen kalten Arsch zu holen
- Nachschlagewerk: Bewährte Anlaufstelle wichtiger Befehle & Checks für Alltag und Troubleshooting
- Frühwarnsystem: Während Bots/NPCs automatisiert durchpatchen, stolpert man beim manuellen durchnudeln über die kleinen Vorboten des Chaos: volle Platten, wackelige Dienste oder nervöse Logs. Dinge, die heute noch kein Problem sind, können dich in Sekundenbruchteilen um den Titel „Mitarbeiter des Jahres“ bringen
Wichtig: Vor dem Update immer dem Chef Bescheid geben, nicht das beim Patching extrem fette Updates gezogen werden und er beim Clutchen in Counter-Strike plötzlich derbste FPS-Drops kassiert.
1️⃣ Quick-Infos
#========================================================== # Audit #========================================================== # Namensschema der Wikiseite: <hostname-fqdn>-<yyyy-mm-dd>-<purpose> Namensschema: ansible-bh-01.hsp.idh-2024-01-16-systemupgrade Author: Hackspoiler Template: Linux Patchday Template Version: 1.0 System-Purpose: Ansible Bastion Host #========================================================== # Systeminfos #========================================================== VM_IP: 10.30.10.140 VM_NAME: ansible-bh-01.hsp.idh VM_CPU: 1 VM_RAM: 12GB VM_HDD: 130GB
2️⃣ Kommunikation - Betroffene Bots/NPCs informieren
3️⃣ Monitoring
# URL - Monitoring Grafana DEV: https://dev.monitor.hsp.idh/ Grafana INT: https://int.monitor.hsp.idh/ Grafana PROD: https://prod.monitor.hsp.idh/
4️⃣ Backup
# URL - Snapshot https://proxmox.hsp.idh/
# File-Backup erstellen. Hier mit BorgBackup. Siehe Anleitung: https://hackspoiler.de/verschluesselte-ubuntu-server-backups-mit-borgbackup-und-borgmatic/ borgmatic --verbosity 2 --log-file /var/log/borg/borgmatic.log # Backup verifizieren borgmatic list # URL - Recovery-Plan: https://wiki.hsp.idh/linux/backup/borg/recovery
5️⃣ Pre-Checks
# System-Uptime & aktuelle Load uptime # Ausgabe:
# Paket-Anzahl
dpkg -l | awk '$1 == "ii" {count++} END {print count}'
# Ausgabe:
# Logfile - Systemlog grep --extended-regexp --ignore-case '(abort|alert|crit|corrupt|\bdenied\b|emerg|error|exception|fail|false|fatal|invalid|kill|not found|oom|panic|refused|segfault|timeout|unauthorized|unavailable|warn)' /var/log/syslog # Ausgabe:
# Logfile - Kernel grep --extended-regexp --ignore-case '(abort|alert|crit|corrupt|\bdenied\b|emerg|error|exception|fail|false|fatal|invalid|kill|not found|oom|panic|refused|segfault|timeout|unauthorized|unavailable|warn)' /var/log/kern.log | sort | uniq # Ausgabe:
# Logfile - Journal journalctl -b -p err --no-pager # Ausgabe:
# Logfile - Kernel Buffer dmesg -T -x | grep -E ':alert|:crit|:emerg|:err|:warn' # Ausgabe:
# Firewall ufw status numbered # Ausgabe:
# Dienste checken systemctl list-unit-files --no-pager | awk '$2 == "enabled"'; echo "Service Count: $(systemctl list-unit-files --no-pager | awk '$2 == "enabled"' | wc -l)" # Ausgabe:
# Disk-Space checken df -hlT | grep -E '^/dev/' # Ausgabe:
# System-Reboot nötig? Wenn ja zuerst rebooten [ -f /var/run/reboot-required ] && echo "Reboot required" || echo "Reboot is NOT required" # Ausgabe:
6️⃣ System-Update
# Tmux-Session starten - [Optional screen -S patchday_session] tmux new-session -s patchday_session -n "Win_1" \; split-window -h -p 40 \; select-pane -L # Falls die aktuelle Tmux-Session gecuttet wird: tmux attach oder tmux attach -t "patchday_session"
# Systemupdate apt update && apt upgrade | tee /var/log/patching_$(date +%F).log cat /var/log/patching_$(date +%F).log # Ausgabe:
7️⃣ Mid-Checks
# Logfile - Systemlog grep --extended-regexp --ignore-case '(abort|alert|crit|corrupt|\bdenied\b|emerg|error|exception|fail|false|fatal|invalid|kill|not found|oom|panic|refused|segfault|timeout|unauthorized|unavailable|warn)' /var/log/syslog # Ausgabe:
# Logfile - Kernel grep --extended-regexp --ignore-case '(abort|alert|crit|corrupt|\bdenied\b|emerg|error|exception|fail|false|fatal|invalid|kill|not found|oom|panic|refused|segfault|timeout|unauthorized|unavailable|warn)' /var/log/kern.log | sort | uniq # Ausgabe:
# Logfile - Journal journalctl -b -p err --no-pager # Ausgabe:
# Logfile - Kernel Buffer dmesg -T -x | grep -E ':alert|:crit|:emerg|:err|:warn' # Ausgabe:
# Dienste checken systemctl list-unit-files --no-pager | awk '$2 == "enabled"'; echo "Service Count: $(systemctl list-unit-files --no-pager | awk '$2 == "enabled"' | wc -l)" # Ausgabe:
8️⃣ Reboot
9️⃣ Post-Checks
# System-Uptime & aktuelle Load uptime # Ausgabe:
# Paket-Anzahl
dpkg -l | awk '$1 == "ii" {count++} END {print count}'
# Ausgabe:
# Logfile - Systemlog grep --extended-regexp --ignore-case '(abort|alert|crit|corrupt|\bdenied\b|emerg|error|exception|fail|false|fatal|invalid|kill|not found|oom|panic|refused|segfault|timeout|unauthorized|unavailable|warn)' /var/log/syslog # Ausgabe:
# Logfile - Kernel grep --extended-regexp --ignore-case '(abort|alert|crit|corrupt|\bdenied\b|emerg|error|exception|fail|false|fatal|invalid|kill|not found|oom|panic|refused|segfault|timeout|unauthorized|unavailable|warn)' /var/log/kern.log | sort | uniq # Ausgabe:
# Logfile - Journal journalctl -b -p err --no-pager # Ausgabe:
# Logfile - Kernel Buffer dmesg -T -x | grep -E ':alert|:crit|:emerg|:err|:warn' # Ausgabe:
# Firewall ufw status numbered # Ausgabe:
# Speziell genutzte Dienste checken
SERVICES="^(apache2|auditd|borg|caddy|chrony|containerd|corosync|cri-o|docker|etcd|fail2ban|grafana|haproxy|keepalived|kubelet|kube-proxy|minio|monit|mysql|nginx|node-exporter|pacemaker|podman|postgres|postfix|prometheus|redis|rsyslog|ufw)"
systemctl list-unit-files --no-pager | awk '$2 == "enabled"' | grep -E -i "${SERVICES}"; echo "Service Count: $(systemctl list-unit-files --no-pager | awk '$2 == "enabled"' | grep -E -i "${SERVICES}" | wc -l)"
# Ausgabe:
# Mounts checken mount | grep -E '^/dev/' | column -t # Ausgabe:
🔟 System-Cleanup
# Pakete aufräumen apt clean && apt autoclean && apt autoremove --purge # Ausgabe:
# Paketlisten aufräumen rm -rf /var/lib/apt/lists/* ; apt update # Ausgabe:
# Verweiste Paketreste entfernen
dpkg --list | awk '/^rc/ {print $2}' | xargs --no-run-if-empty dpkg --purge
# Ausgabe:
# Docker aufräumen docker system prune # Ausgabe:
✅ Abschluss
# Lynis Security-Check lynis audit system --quick # Ausgabe Hardening Index:
🔥 Fehler
# Kritische Fehler: Ticket:
# Unkritische Fehler: Ticket:


