11 使用 KLP 的在线内核修补 #
本文档介绍内核实时修补 (KLP) 技术的基本原理,并提供 SLE Live Patching 服务的使用准则。
KLP 让您无需重引导便可应用 Linux 内核的最新安全性更新。如此可最大限度地提高系统正常运行时间和可用性,这对于任务关键型系统而言尤为重要。
本文档中提供的信息与 AMD64/Intel 64、POWER 和 IBM Z 体系结构相关。
11.1 内核实时修补的优势 #
KLP 提供了多项优势。
对于需获得或维护特定合规认证的组织而言,确保大量服务器自动保持最新状态至关重要。KLP 可在帮助实现合规的同时,减少对费用高昂的维护期的需求。
签订了服务级别协议合同的公司必须保证其系统可用性和正常运行时间达到特定的级别。实时修补可在不产生停机时间的情况下修补系统。
由于 KLP 是标准系统更新机制的一部分,因此无需专门培训或引入复杂的维护例程。
11.2 内核实时修补概述 #
内核在线补丁通过内含经过修改的代码的软件包提供,此类软件包与主内核软件包不同。在线补丁具有累积性,因此最新的补丁包含内核软件包先前补丁的所有修复。每个内核在线软件包都与为其发布的确切内核修订版关联。每新增一个修复,在线补丁软件包版本号都会相应增加。
在线补丁仅包含关键修复,不会替代常规的内核更新,后者需要重引导系统。可以将在线补丁视为在执行适当的内核更新和重引导前用于暂时保护内核的措施。
下图阐述了在线补丁与内核更新之间的总体关系。使用 klp -v
patches
命令可以查看当前有效的在线补丁所解决的 CVE 列表和缺陷报告。
您可以安装多个版本的内核软件包及其在线补丁。这些软件包不会冲突。您可以为正在运行的内核安装更新的内核软件包及在线补丁。在此情况下,您可能会收到重引导系统的提示。订阅了 SLE Live Patching 的用户有权获享技术支持,只要正在运行的内核存在在线补丁更新(请参见第 11.5.1 节 “检查在线补丁的失效日期”)。
激活 KLP 后,每个内核更新都会附带在线补丁软件包。此在线补丁不包含任何修复,而是充当相应内核未来在线补丁的种子。这些空种子补丁称为 initial patches
。
11.2.1 内核实时修补范围 #
SLE Live Patching 的修补范围包括 SUSE 通用漏洞评分系统(CVSS;SUSE CVSS 基于 CVSS v3.1 系统开发)7 级以上系统稳定或数据损害相关漏洞和 bug 修复。但从技术上而言,为属于指定类别的所有修复都创建在线补丁可能并不现实。因此,SUSE 保留在因技术原因而无法创建内核在线补丁的情况下跳过相应修复的权利。目前超过 95% 的合格修复都是以在线补丁的形式发布的。有关 CVSS(SUSE CVSS 评分基础)的详细信息,请参见 Common Vulnerability Scoring System SIG。
11.2.2 内核实时修补局限性 #
KLP 涉及替换功能和妥善处理相互依赖的功能集的替换。这通过将旧代码调用重定向到不同内存位置的更新代码来完成。数据结构的变化使情况变得更加复杂,因为数据会保持原状,无法扩展或重新解译。尽管使用某些技术可以间接更改数据结构,但某些修复无法转换为实时补丁。在此情况下,只能通过系统重启动来应用修复。
11.3 使用 YaST 激活内核实时修补 #
要在您的系统上激活 KLP,您需要拥有有效的 SLES 和 SLE Live Patching 订阅。请访问 SUSE Customer Center 检查您的订阅的状态,并获取 SLE Live Patching 订阅的注册代码。
要在您的系统上激活内核实时修补,请执行以下步骤:
运行
yast2 registration
命令并单击 。在可用扩展列表中选择
,然后单击 。确认许可条款并单击
。输入您的 SLE Live Patching 注册代码并单击
。检查
和选定的 。系统应该会自动选择安装Live Patching
和SLE Live Patching Lifecycle Data
软件集以及一些其他软件包,以满足依赖关系。单击
完成安装。这样会在您的系统上安装基础内核实时修补组件、初始实时补丁,以及所需的依赖项。
11.4 从命令行激活内核实时修补 #
要激活内核实时修补,您需要拥有有效的 SLES 和 SLE Live Patching 订阅。请访问 SUSE Customer Center 查看您的订阅的状态,并获取 SLES Live Patching 订阅的注册代码。
运行
sudo SUSEConnect --list-extensions
.请记住 SLES Live Patching 的确切激活命令。示例命令输出(缩略版):$ SUSEConnect --list-extensions ... SUSE Linux Enterprise Live Patching 15 SP5 x86_64 Activate with: SUSEConnect -p sle-module-live-patching/15.5/x86_64 \ -r ADDITIONAL REGCODE
使用获得的命令后跟
-r LIVE_PATCHING_REGISTRATION_CODE
激活 SLES Live Patching,例如:SUSEConnect -p sle-module-live-patching/15.5/x86_64 \ -r LIVE_PATCHING_REGISTRATION_CODE
使用
zypper install -t pattern lp_sles
命令安装所需的软件包和依赖项。
至此,系统已完成实时修补。
后台进行的过程如下:当软件包安装系统检测到某个安装的内核可以实时修补,并且软件通道中存在相应的实时补丁时,系统会选择安装该实时补丁。然后内核会在软件包安装过程中接收到在线补丁修复。在产品安装完成前,内核就会进行实时修补。
11.5 执行内核实时修补 #
内核在线补丁是在常规的系统更新过程中安装的。但您应了解以下几点。
如果已为正在运行的内核安装 kernel-livepatch-* 软件包,内核会进行实时修补。您可以使用
zypper se --details kernel-livepatch-*
命令来检查您的系统上安装了哪些内核实时补丁软件包。如果安装了 kernel-default 软件包,更新管理器会提示您重引导系统。为避免此消息显示,您可以将内核更新从修补操作中筛除。这可以通过使用 Zypper 添加软件包锁来实现。您也可以使用 SUSE Manager 过滤通道内容(请参见 Live Patching with SUSE Manager)。
可以使用
klp status
命令来检查修补状态。要检查安装的补丁,请运行klp -v patches
命令。请记住,虽然系统上可能会安装多个内核软件包,但任何时间只有一个软件包在运行。同样,虽然系统上可能会安装多个在线补丁软件包,但只有一个在线补丁会装载到内核中。
有效的在线补丁包含在
initrd
中。这表示如果发生了意外重引导,系统启动时会应用在线补丁修复,因此不需要再次执行修补。
11.5.1 检查在线补丁的失效日期 #
确保lifecycle-data-sle-module-live-patching 已安装,然后运行 zypper lifecycle
命令。在输出的 Package end of support if
different from product
部分应该可以看到实时补丁的失效日期。
每个在线补丁自底层内核软件包发布起一年内都会收到更新。您可以使用 Maintained kernels, patch updates and lifecycle 页面根据运行的内核版本检查失效日期,无需安装产品扩展。
11.6 内核实时修补问题查错 #
11.6.1 手动降级补丁 #
如果您发现了最新的在线补丁有问题,可以将当前安装的在线补丁降级回之前的版本。我们建议在系统开始显现出问题前执行补丁降级。请注意,在系统日志中跟踪内核警告或内核错误的系统可能不适合使用补丁降级过程。如果您不确定系统是否满足补丁降级的要求,请联系 SUSE 技术支持部门获得帮助。
使用
klp -v patches
命令确定正在运行的实时补丁。以RPM:
开头的行中显示的就是当前正在运行的补丁。例如:RPM: kernel-livepatch-5_3_18-24_29-default-2-2.1.x86_64
上例中的
5_3_18-24_29-default
指的就是正在运行的内核版本。使用
zypper search -s kernel-livepatch-RUNNING_KERNEL_VERSION-default
命令搜索补丁的先前版本。该命令会返回可用软件包版本列表。请注意,每个新在线补丁软件包发行版的版本号会加 1。请务必选择版本号低于当前版本号的发行版。使用
zypper in --oldpackage kernel-livepatch-RUNNING_KERNEL_VERSION-default=DESIRED_VERSION
命令安装所需的版本。