香港服务器内核升级实战:安全补丁应用 + Canonical Livepatch零重启内核更新

香港服务器内核升级实战:安全补丁应用 + 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 分钟内完成,对用户的影响极小。

Telegram