Skip to main content

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:

♻️ Rollback (nur bei Problemen)




Repository – Linux Debian-basiertes Patchting Template

Markdown Linux Debian-basiertes Patching Template