香港服务器内核升级实战:安全补丁应用 + Canonical Livepatch零重启内核更新
内核漏洞是服务器最高危的安全风险之一——2024 年曝光的 nf_tables 提权漏洞(CVE-2024-1086)可以让普通用户获得 root 权限,影响数亿台 Linux 服务器。但很多运维人员因为担心升级导致服务中断而长期拖延内核更新,让服务器暴露在已知漏洞中。本文覆盖从漏洞识别到安全升级的完整流程,以及如何用 Livepatch 实现关键安全补丁的零停机应用。
一、检查当前内核版本与漏洞状态
<code"># 查看当前内核版本 uname -r # 例如:5.15.0-105-generic # 查看已安装的内核列表 dpkg --list | grep linux-image # 检查可用的内核更新 apt list --upgradable 2>/dev/null | grep linux-image # 查看安全通告(Ubuntu Security Notices) apt-get update apt-get upgrade --dry-run 2>/dev/null | grep linux
<code"># 检查当前内核是否受已知漏洞影响 # 方法一:访问 Ubuntu CVE Tracker # https://ubuntu.com/security/cves?package=linux # 方法二:使用 unattended-upgrades 检查 apt install -y unattended-upgrades unattended-upgrades --dry-run -d 2>&1 | grep -i "security\|kernel" # 方法三:检查特定 CVE(如 CVE-2024-1086) apt-cache changelog linux-image-$(uname -r) | grep -i "CVE-2024-1086"
二、内核升级前的准备工作
<code"># ── 步骤1:备份关键数据 ──
# 升级前务必确保最新备份存在
/opt/backup/restic-backup.sh
# ── 步骤2:记录当前系统状态 ──
uname -r > /root/kernel-upgrade-pre.txt
lsmod >> /root/kernel-upgrade-pre.txt # 已加载的内核模块
df -h >> /root/kernel-upgrade-pre.txt
ss -tnlp >> /root/kernel-upgrade-pre.txt # 监听端口
# ── 步骤3:检查自定义内核模块 ──
# 如果有第三方驱动(GPU/RAID),升级后可能需要重新安装
lsmod | grep -v "^Module" | awk '{print $1}' | while read mod; do
modinfo "$mod" 2>/dev/null | grep -l "vermagic" | grep -v "$(uname -r)" && \
echo "⚠️ 第三方模块:$mod 可能在升级后失效"
done
# ── 步骤4:通知用户/团队维护窗口 ──
echo "服务器将于今晚 2:00 进行内核升级,预计重启时间约 3~5 分钟"三、执行内核升级
<code"># 方法一:标准升级(包含所有安全更新) apt update apt upgrade -y # 升级所有软件包 # 或只升级内核: apt install -y linux-image-generic linux-headers-generic # 验证新内核已安装 dpkg --list | grep linux-image # 应看到新版本,如 linux-image-6.5.0-45-generic # 重启系统(必须重启才能加载新内核) # 选择维护窗口(建议凌晨低流量时段) shutdown -r +5 "系统将在5分钟后重启进行内核升级" # 或立即重启 reboot
<code"># 重启后验证 uname -r # 确认已运行新内核 # 检查服务是否正常启动 systemctl status nginx mysql redis-server docker ss -tnlp # 确认端口监听正常 # 与升级前状态对比 diff /root/kernel-upgrade-pre.txt <(ss -tnlp) # 清理旧内核(节省磁盘空间) apt autoremove --purge # 自动移除旧内核(保留最近两个)
四、自动安全更新(Unattended Upgrades)
<code"># 配置自动应用安全更新(推荐)
apt install -y unattended-upgrades
# /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};
# 自动重启(仅在需要时,并在指定时间段)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-WithUsers "false"; # 有用户登录时不重启
Unattended-Upgrade::Automatic-Reboot-Time "03:00"; # 凌晨3点重启
# 邮件通知
Unattended-Upgrade::Mail "admin@yourdomain.com";
Unattended-Upgrade::MailReport "on-change";
# 启用
echo 'APT::Periodic::Update-Package-Lists "1";' > /etc/apt/apt.conf.d/20auto-upgrades
echo 'APT::Periodic::Unattended-Upgrade "1";' >> /etc/apt/apt.conf.d/20auto-upgrades五、Canonical Livepatch(零重启内核安全补丁)
<code"># Livepatch 可以在不重启的情况下应用关键安全补丁 # Ubuntu Pro 订阅包含 Livepatch(个人和小型商业可免费使用 5 台服务器) # 获取 Ubuntu Pro 令牌(免费注册) # 访问:https://ubuntu.com/pro # 附加 Ubuntu Pro 订阅 ubuntu-pro attach your_pro_token # 启用 Livepatch ubuntu-pro enable livepatch # 查看 Livepatch 状态 canonical-livepatch status --verbose # 输出示例: # kernel: 5.15.0-105.115-generic # fully-patched: true # state: applied # patches applied: # - CVE-2024-1086: applied (nf_tables privilege escalation) # - CVE-2024-0582: applied (io_uring race condition)
<code"># 监控 Livepatch 补丁状态(加入 Crontab)
cat > /usr/local/bin/check-livepatch.sh << 'EOF' #!/bin/bash STATUS=$(canonical-livepatch status 2>/dev/null)
if echo "$STATUS" | grep -q "fully-patched: false"; then
PENDING=$(echo "$STATUS" | grep "CVE" | grep "pending")
curl -s -X POST "https://open.feishu.cn/open-apis/bot/v2/hook/your_webhook" \
-d "{\"msg_type\":\"text\",\"content\":{\"text\":\"⚠️ Livepatch待应用补丁\n服务器:$(hostname)\n$PENDING\"}}"
fi
EOF
chmod +x /usr/local/bin/check-livepatch.sh
echo "0 8 * * * root /usr/local/bin/check-livepatch.sh" >> /etc/crontab六、高风险升级:处理 DKMS 模块
<code"># DKMS(动态内核模块支持)管理第三方驱动 # 内核升级时 DKMS 自动为新内核重新编译模块 # 查看 DKMS 模块状态 dkms status # 如果某个模块构建失败(如 NVIDIA 驱动): # 重新安装该模块 dkms install nvidia/550.90.07 -k $(uname -r) # 或重新安装驱动包 apt install -y --reinstall nvidia-driver-550
七、内核回滚(升级出问题时)
<code"># 如果新内核导致问题,在 GRUB 菜单选择旧内核启动: # 重启时按住 Shift 键进入 GRUB 菜单 # 选择 "Advanced options for Ubuntu" # 选择旧内核版本 # 启动后确认旧内核正常运行 uname -r # 将旧内核设为默认(临时方案) # /etc/default/grub GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-102-generic" update-grub # 提交 Bug 报告并等待修复 ubuntu-bug linux
八、内核升级检查清单
| 阶段 | 检查项 |
|---|---|
| 升级前 | 最新备份已完成 / 通知维护窗口 / 记录当前状态 |
| 升级中 | 选择低流量时段 / 使用 screen/tmux 防断线 |
| 重启后 | 确认新内核版本 / 检查所有服务状态 / 验证端口监听 |
| 升级后 | 清理旧内核 / 更新 GRUB 默认项 / 记录升级日志 |
九、总结
内核安全更新不应该被无限期推迟——Livepatch 为高危漏洞提供了零停机的即时修复能力,让「安全与稳定」不再是对立的选择。对于无法应用 Livepatch 的普通版本升级,选择业务低谷期的维护窗口,做好升级前备份和状态记录,按本文流程操作,整个内核升级加重启过程通常在 10 分钟内完成,对用户的影响极小。