深色模式
补丁管理:制定可执行的更新策略
摘要:补丁管理难在"既要快又要稳"。本文给出补丁分级标准、更新窗口、灰度顺序、验证与回滚的完整流程,以及 RHEL 与 Debian 两系的具体命令。
适用环境
bash
cat /etc/os-release
# RHEL
dnf check-update --security | head
# Debian/Ubuntu
apt-get update && apt list --upgradable 2>/dev/null | head
command -v unattended-upgrades && dpkg -l unattended-upgrades | tail -11
2
3
4
5
6
2
3
4
5
6
操作步骤
1. 先做资产与影响面清单
bash
ansible all -m setup -a 'filter=ansible_distribution*' 2>/dev/null | head
# 没有 Ansible 就用简单方式
for h in web1 web2 db1; do ssh "$h" 'cat /etc/os-release | head -1; ss -lntup | wc -l'; done1
2
3
2
3
清单字段:主机名、系统版本、业务角色、是否单点、负责人、维护窗口。
2. 给补丁分级,决定处理时限
| 级别 | 判定依据 | 处理时限(建议) |
|---|---|---|
| 紧急 | 在野利用 / 远程未授权 RCE / 对外可达 | 72 小时内 |
| 高 | 本地提权、核心组件 RCE(内网) | 7 天内 |
| 中 | 需登录或特定条件的漏洞 | 30 天内 |
| 低 | 信息泄露、DoS | 纳入季度批量 |
3. 配置自动安全更新(非核心/可重启主机)
bash
# RHEL 8+
dnf install -y dnf-automatic
sed -i 's/^apply_updates.*/apply_updates = yes/' /etc/dnf/automatic.conf
sed -i 's/^upgrade_type.*/upgrade_type = security/' /etc/dnf/automatic.conf
systemctl enable --now dnf-automatic.timer
systemctl list-timers | grep dnf-automatic1
2
3
4
5
6
2
3
4
5
6
bash
# Debian/Ubuntu
apt-get install -y unattended-upgrades apt-listchanges
cat >/etc/apt/apt.conf.d/50unattended-upgrades <<'EOF'
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
EOF
unattended-upgrade --dry-run --debug | tail -201
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
核心数据库与有状态服务不要开自动更新
自动重启会造成业务中断。这类主机走人工窗口 + 灰度。
4. 手动更新流程(核心主机)
bash
# 1) 先看有哪些安全更新
dnf updateinfo list security available # RHEL
apt-get -s upgrade | grep -i security # Debian(simulate)
# 2) 记录当前版本,作为回滚依据
rpm -qa > /tmp/rpm-before-$(date +%F).txt # RHEL
dpkg -l > /tmp/dpkg-before-$(date +%F).txt # Debian
# 3) 先打测试机,观察 24 小时
dnf -y update --security && reboot
# 4) 生产灰度顺序
# 无状态从节点 → 部分流量 → 全量 → 有状态从库 → 主库(切换后)1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
5. 内核更新与重启策略
bash
# 查看是否需要重启
command -v needs-restarting >/dev/null && needs-restarting -r || echo "无 needs-restarting"
# Debian
[ -f /var/run/reboot-required ] && cat /var/run/reboot-required.pkgs
# 查看已安装内核
grubby --default-kernel 2>/dev/null || grep -E '^menuentry' /boot/grub2/grub.cfg | head -31
2
3
4
5
6
2
3
4
5
6
更新内核后直接重启可能起不来
保留至少一个旧内核条目;确认 grubby --default-kernel 指向的内核存在;云主机确认有控制台访问方式。
6. 回滚预案
bash
# RHEL 支持 dnf history 回滚
dnf history list | tail -5
dnf history undo <ID> # 谨慎:仅在同一事务未被大量后续操作依赖时
# Debian 可降级指定包
apt-get install nginx=1.24.0-1~bookworm
apt-mark hold nginx # 防止被再次升级1
2
3
4
5
6
2
3
4
5
6
更可靠的回滚是"镜像/快照级别":更新前打快照,出问题直接回快照。
7. 度量与复盘
- 补丁合规率:已打补丁主机 / 应打主机。
- 平均修复时长(MTTR):从公告发布到完成修复。
- 未修复项:必须有例外审批与补偿控制。
验证
bash
dnf updateinfo list security installed 2>/dev/null | tail -5
apt-get -s upgrade | grep -c security
# 对比更新前后
diff <(rpm -qa | sort) /tmp/rpm-before-$(date +%F).txt | head -20
# 确认服务状态
systemctl is-active nginx mysql
uptime && needs-restarting -r 2>/dev/null1
2
3
4
5
6
7
2
3
4
5
6
7
判定标准:紧急补丁在时限内完成;每台主机有更新记录;核心服务更新后健康检查通过。
常见坑
全部主机开自动更新
数据库、消息中间件等有状态服务自动重启会造成数据不一致或脑裂。按角色区分策略。
只更新不重启,以为补丁生效
内核与 glibc 类更新必须重启。用 needs-restarting -r 或 /var/run/reboot-required 判断。
没有回滚点
更新前必须做快照/备份/版本记录。没有回滚点的更新等于赌博。
忽略第三方与固件补丁
Nginx/Redis/JDK/BIOS/网卡固件同样有 CVE。补丁清单要覆盖应用栈,不只是 OS。
打完补丁不做健康检查
兼容性问题(如 OpenSSL 升级导致老协议握手失败)很常见。更新后必须跑业务冒烟测试。