Windows has Patch Tuesday. Linux has every day. Ubuntu USNs, Debian DSAs, RHEL RHSAs, SUSE SUs, and kernel.org releases land continuously. For a small team running dozens or hundreds of boxes, the firehose of advisories quickly becomes noise — and noise gets ignored. This guide lays out a repeatable weekly workflow for turning that stream of advisories into a disciplined patch cadence without drowning in it.
1. The problem with ad-hoc patching
Week 10 of 2026 alone saw security updates across every major distribution: Ubuntu published USN-8067 through USN-8080 covering the kernel, curl, PostgreSQL, NSS, QEMU, ImageMagick, and Intel microcode. Red Hat shipped over 90 RHSAs including critical libpng buffer overflows (RHSA-2026:3551, RHSA-2026:3573–3577), kernel patches (RHSA-2026:3488, RHSA-2026:3685), and PostgreSQL fixes (RHSA-2026:3887). Debian pushed DSAs for lxd, php8.2, chromium, and spip. SUSE released kernel live patches and critical Go/OpenSSL updates.
Without a process, a small team handles this one of two ways: either someone runs apt upgrade whenever they remember, or nobody does because they are afraid of breaking production. Both paths end in the same place: unpatched systems.
2. Advisory sources: where to look
Consolidate your intake to a short list of authoritative feeds. Check these weekly:
- Ubuntu:
ubuntu.com/security/notices— USN feed with CVE cross-references. Subscribe toubuntu-security-announcemailing list. - Debian:
security-tracker.debian.organd DSA announcements ondebian-security-announce. - RHEL/CentOS/Alma/Rocky:
access.redhat.com/security/security-updates/for RHSAs. AlmaLinux and Rocky mirror these as ALSA/RLSA advisories. - SUSE:
suse.com/support/update/for SUSE SU advisories. - Cross-distro roundups:
linuxcompatible.orgpublishes weekly security roundups aggregating advisories across distributions — useful for a fast scan of what landed. - CVE databases:
nvd.nist.govandcve.orgfor CVSS scores and exploit status.
Set up RSS or email filters so advisories land in one place. A shared Slack channel or mailing list alias works. The goal is that one person can scan the week's advisories in under 15 minutes.
3. The weekly workflow
Pick a day. Tuesday works (hence the title), but any consistent day is fine. The workflow has six phases:
Phase 1: Intake (15 minutes)
Pull the week's advisories from your consolidated feed. On each system, check what is actually pending:
# Ubuntu/Debian: list security updates only sudo apt update apt list --upgradable 2>/dev/null | grep -i security # Show details for a specific USN package apt changelog <package-name> | head -30 # RHEL/Alma/Rocky: list security updates sudo dnf check-update --security # Show advisory details sudo dnf updateinfo list --security sudo dnf updateinfo info RHSA-2026:3551
Capture output to a shared document or ticket. Include the package name, current version, available version, and advisory ID.
Phase 2: Prioritization (10 minutes)
Not all advisories are equal. Triage by severity and exposure:
- Critical / actively exploited: Patch within 24–48 hours. Skip staging if necessary. Examples from Week 10: libpng stack buffer overflows (RHSA-2026:3551), kernel vulnerabilities (USN-8070), lxd arbitrary command execution (DSA-6153).
- Important / high CVSS (>7.0): Patch within the weekly cycle. Includes most kernel updates, browser patches (Firefox, Chromium), and language runtime fixes (Python CVE-2026-0865, PostgreSQL).
- Moderate / low: Batch with next weekly cycle or monthly rollup. Includes gnutls moderate fixes (RHSA-2026:3477), nfs-utils (RHSA-2026:3940).
Check CVSS scores and whether a public exploit exists. A moderate-severity advisory with a Metasploit module is more urgent than a high-severity advisory that requires local access on a box with no user accounts.
# Quick CVSS lookup for a CVE on RHEL sudo dnf updateinfo info --cve CVE-2026-0865 # Ubuntu: check CVE status apt-cache policy python3 | head -5
Phase 3: Staging tests (30–60 minutes)
Apply updates to a non-production environment first. If you do not have a dedicated staging environment, a single VM that mirrors your production stack is sufficient.
# Ubuntu/Debian: apply security updates only
sudo apt update
sudo apt upgrade -y -o Dpkg::Options::="--force-confold"
# RHEL/Alma/Rocky: apply security updates only
sudo dnf update --security -y
# Record what changed
dpkg -l | grep ^ii | awk '{print $2, $3}' > /tmp/post-patch-versions.txt # Debian
rpm -qa --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' > /tmp/post-patch-versions.txt # RHELAfter patching staging, run your smoke tests:
- Services start cleanly:
systemctl is-failed '*'should return nothing. - Application health endpoints respond:
curl -sf http://localhost/health - Kernel boots successfully if a kernel update is included. Reboot staging and verify.
- TLS certificates still load. Database connections succeed. Log rotation works.
If a regression surfaces (as happened with Apache mod_md in USN-7968-2, or Python IMAP handling in USN-8018-2), you catch it here and not in production.
Phase 4: Production rollout (varies)
Roll out in batches. If you manage 20 servers, do not patch all 20 simultaneously. A canary approach works well:
- Batch 1 (canary): 1–2 non-critical servers. Monitor for 1–2 hours.
- Batch 2: Half of remaining fleet. Monitor for 1 hour.
- Batch 3: Remainder.
# Parallel patching with SSH (simple approach) for host in web01 web02; do ssh "$host" 'sudo apt update && sudo apt upgrade -y -o Dpkg::Options::="--force-confold"' & done wait # Or with Ansible (better for larger fleets) ansible webservers -b -m apt -a "upgrade=safe update_cache=yes" --limit batch1
For kernel updates that require a reboot, schedule a maintenance window. On Ubuntu, check if a reboot is pending:
# Check if reboot is required
[ -f /var/run/reboot-required ] && echo "REBOOT NEEDED" || echo "No reboot needed"
cat /var/run/reboot-required.pkgs 2>/dev/null # Which packages triggered it
# RHEL: check if running kernel matches installed kernel
RUNNING=$(uname -r)
INSTALLED=$(rpm -q kernel --queryformat '%{VERSION}-%{RELEASE}.%{ARCH}\n' | tail -1)
[ "$RUNNING" != "$INSTALLED" ] && echo "REBOOT NEEDED for kernel $INSTALLED"Consider live patching to avoid reboots for kernel fixes. Ubuntu Pro provides Livepatch; RHEL provides kpatch. Week 10 saw multiple kpatch releases (RHSA-2026:3865, 3866, 3848, 3886) specifically for applying kernel fixes without downtime.
Phase 5: Verification (15 minutes)
After rollout, verify the patches actually landed:
# Ubuntu/Debian: verify specific package version dpkg -l libpng16-16 | tail -1 apt list --installed 2>/dev/null | grep postgresql # RHEL: verify advisory is applied sudo dnf updateinfo list --installed | grep RHSA-2026:3551 # Check that no security updates remain pending apt list --upgradable 2>/dev/null | grep -c security # Should be 0 sudo dnf check-update --security; echo "Exit: $?" # Exit 0 = fully patched # Verify services are running systemctl is-active nginx postgresql sshd systemctl is-failed '*'
Log the patch run: which hosts were patched, which advisories were addressed, and whether any issues were encountered. A shared spreadsheet or wiki page is fine. The audit trail matters when someone asks "are we patched against CVE-X?"
Phase 6: Rollback plan
Every patch run needs a rollback path before you start. Options vary by distro:
# RHEL/Alma/Rocky: dnf history makes rollback straightforward sudo dnf history list --reverse | tail -5 sudo dnf history undo last -y # Ubuntu/Debian: apt does not have native history undo, so plan ahead # Option 1: snapshot the VM/LV before patching sudo lvcreate --snapshot --name pre-patch --size 5G /dev/vg0/root # Option 2: pin a package to prevent upgrade, then remove pin later sudo apt-mark hold libpng16-16 sudo apt-mark unhold libpng16-16 # Option 3: downgrade a specific package sudo apt install libpng16-16=1.6.43-5build1
- VM/cloud: Take a snapshot before patching. Revert if something breaks.
- Bare metal with LVM: Create an LV snapshot. Roll back by merging the snapshot.
- Containers: Roll back to the previous image tag.
- Kernel: Boot the previous kernel from GRUB if the new one causes issues.
Test your rollback mechanism before you need it. A rollback plan you have never tested is not a plan.
4. Handling kernel updates specifically
Kernel updates are the most disruptive because they typically require a reboot. Week 10 of 2026 showed the typical volume: Ubuntu published USN-8070 (multiple kernel variants including FIPS and cloud-specific builds), RHEL shipped RHSA-2026:3464, 3488, 3520, 3685, and SUSE released eight separate kernel live patches.
Strategies for kernel patching:
- Live patching: Ubuntu Livepatch (free for up to 5 machines with Ubuntu Pro) and RHEL kpatch apply critical kernel fixes without rebooting. Evaluate these for uptime-sensitive systems.
- Rolling reboots: For clustered services, drain one node, reboot, verify, re-add, then move to the next.
- Scheduled maintenance windows: For standalone servers, schedule a monthly reboot window for kernel updates that live patching cannot cover.
# Ubuntu: check Livepatch status
canonical-livepatch status --verbose
# RHEL: list applied kpatches
sudo kpatch list
# Check running vs installed kernel
uname -r
dpkg -l 'linux-image-*' | grep ^ii | awk '{print $2, $3}' # Debian/Ubuntu
rpm -qa kernel | sort -V # RHEL5. Automating the boring parts
Manual weekly patching works for 5–10 servers. Beyond that, automate what you can while keeping human judgment in the loop for prioritization and rollout decisions.
Unattended security updates for non-disruptive patches:
# Ubuntu/Debian: enable unattended-upgrades for security only sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades # Verify config: only security pocket should be enabled grep -A2 'Allowed-Origins' /etc/apt/apt.conf.d/50unattended-upgrades # RHEL: dnf-automatic for security updates sudo dnf install dnf-automatic sudo sed -i 's/upgrade_type = default/upgrade_type = security/' /etc/dnf/automatic.conf sudo systemctl enable --now dnf-automatic-install.timer
Advisory monitoring script — a simple cron job that emails you when security updates are pending:
#!/bin/bash
# /usr/local/bin/check-security-updates.sh
# Run via cron: 0 8 * * 2 /usr/local/bin/check-security-updates.sh
HOSTNAME=$(hostname -f)
if command -v apt >/dev/null 2>&1; then
apt update -qq 2>/dev/null
UPDATES=$(apt list --upgradable 2>/dev/null | grep -i security)
elif command -v dnf >/dev/null 2>&1; then
UPDATES=$(dnf check-update --security 2>/dev/null)
fi
if [ -n "$UPDATES" ]; then
echo -e "Security updates pending on $HOSTNAME:\n\n$UPDATES" | \
mail -s "[$HOSTNAME] Security updates available" [email protected]
fi6. Real-world advisory example: Week 10, 2026
To make this concrete, here is how a small team would process the advisories from the week of March 2–8, 2026:
- Immediate (24h): libpng stack buffer overflows (RHSA-2026:3551, ALSA-2026:3551, DSA equivalent) — Important severity, widely used library. Arbitrary command execution via lxd images (DSA-6153) if you run lxd.
- This week: Kernel updates (USN-8070, RHSA-2026:3464/3488/3685), Firefox/Thunderbird (RHSA-2026:3491–3497, RHSA-2026:3515–3517), PostgreSQL (USN-8072, RHSA-2026:3887), curl (USN-8062-2), Intel microcode (USN-8068).
- Next cycle: gnutls moderate fix (RHSA-2026:3477), nginx 1.24 moderate fix (RHSA-2026:3638), nfs-utils (RHSA-2026:3938–3942).
- Watch for regressions: Apache mod_md OCSP regression (USN-7968-2 fix), Python IMAP/POP3 regression (USN-8018-2). Check if your systems run affected versions before applying blindly.
7. Weekly patch checklist
[ ] Review advisory feeds (USNs, DSAs, RHSAs) for the past week [ ] Run dnf check-update --security / apt list --upgradable on all hosts [ ] Classify: critical (24h) / important (this week) / moderate (next cycle) [ ] Check for known regressions in advisory notes before applying [ ] Snapshot or checkpoint staging environment [ ] Apply updates to staging, run smoke tests [ ] Verify no service failures: systemctl is-failed '*' [ ] Apply to production canary (1-2 hosts), monitor 1 hour [ ] Roll out to remaining fleet in batches [ ] Verify patches landed: dnf updateinfo list --installed / dpkg -l [ ] Check for pending reboots: /var/run/reboot-required [ ] Log patch run: hosts, advisories addressed, issues encountered [ ] Schedule kernel reboot window if needed
References
- Ubuntu Security Notices:
ubuntu.com/security/notices - Debian Security Tracker:
security-tracker.debian.org - Red Hat Security Advisories:
access.redhat.com/security/security-updates/ - SUSE Security Updates:
suse.com/support/update/ - Linux Compatible Weekly Roundups:
linuxcompatible.org - NVD (CVSS scores):
nvd.nist.gov man unattended-upgrades,man dnf-automatic,man kpatch
The goal is not perfection. It is consistency. A team that patches every Tuesday with a simple checklist will outperform a team that patches "whenever we get to it" with the most sophisticated tooling. Start with the process, automate incrementally, and never skip verification.
This work is licensed under a Creative Commons Attribution-NonCommercial 2.5 License .