如果您運行Linux服務(wù)器,軟件修補(bǔ)是一項必須定期執(zhí)行的任務(wù)。雖然大多數(shù)程序可以使用needrestart等工具自動重啟,但有一個例外:內(nèi)核。
如果我們可以在沒有強(qiáng)制重啟的情況下更新內(nèi)核,那不是很好嗎?這是livepatch,Linux內(nèi)核的特性使它成為可能。讓我們發(fā)現(xiàn)它是如何工作的,以及你是否可以在你的系統(tǒng)上使用它。
使用livepatch最大化正常運行時間
什么是實時內(nèi)核修補(bǔ)?
實時內(nèi)核修補(bǔ)是將安全補(bǔ)丁應(yīng)用于正在運行的Linux內(nèi)核而無需重新啟動系統(tǒng)的過程。Linux的實現(xiàn)名為livepatch。修補(bǔ)實時內(nèi)核的過程是一個相當(dāng)復(fù)雜的過程。它可以與心臟直視手術(shù)進(jìn)行比較?;颊弑旧砭褪呛诵?,需要精確和謹(jǐn)慎才能把事情做好。一個錯誤的舉動,它是游戲結(jié)束。
實時修補(bǔ)的一個好處是能夠推遲重新啟動,直到可以完成計劃的維護(hù)。這意味著可以最大化系統(tǒng)的可用性。另一個好處是安全更新不僅安裝,而且立即生效。雖然實時修補(bǔ)有其自身的風(fēng)險,但至少可以減輕已知的漏洞。
補(bǔ)丁程序的要求
要允許實時修補(bǔ)工作,需要滿足幾個要求。首先,內(nèi)核本身需要支持livepatch。在4.x中添加了初始支持,因此您需要一個最新的內(nèi)核。其次,您的系統(tǒng)需要一個客戶端工具來檢索內(nèi)核補(bǔ)丁并加載它們。要允許加載內(nèi)核補(bǔ)丁,需要將系統(tǒng)配置為允許加載內(nèi)核模塊。內(nèi)核補(bǔ)丁通常由Linux發(fā)行版創(chuàng)建。它需要一些專業(yè)知識才能知道如何重定向指令集。
實時內(nèi)核修補(bǔ)如何工作?
有三個功能可以在內(nèi)核運行時對其進(jìn)行修補(bǔ):
- Kernel probes(Kprobes)
- Function tracing(Ftrace)
- Livepatching(livepatch)
這些功能各有各的作用,并緊密配合。由于實時修補(bǔ)過程存在風(fēng)險,因此每個都需要小心。責(zé)任將從一個傳遞到另一個,直到完整的補(bǔ)丁周期結(jié)束。
神圣的三位一體:Kprobes,F(xiàn)unction Tracer和Livepatch
讓我們來看看三個內(nèi)核功能,使修補(bǔ)過程成為可能。
Kprobes
Kprobes或內(nèi)核探測器是一種內(nèi)核功能,開發(fā)人員使用它來測量Linux內(nèi)核并執(zhí)行調(diào)試。Kprobes允許進(jìn)入內(nèi)核例程和許多代碼地址。這稱為斷點,允許開發(fā)人員采取行動。這樣的行動可能是運行一套新的指令。Ftrace
下一個功能名為Function Tracer或Ftrace。它是一個強(qiáng)大的框架,可以測量內(nèi)核中的幾個方面,如事件和中斷。例如,它可以測量特定功能的延遲,例如寫入磁盤。Livepatch
Livepatch是第三個組件。它也是內(nèi)核的最新成員。使用自定義Ftrace處理程序,它可以重定向例程并跳轉(zhuǎn)到一組修補(bǔ)的指令。
內(nèi)核補(bǔ)丁創(chuàng)建
實時修補(bǔ)從制作補(bǔ)丁開始。這意味著需要更改特定的內(nèi)核函數(shù)??梢允褂孟駅patch-build這樣的工具來創(chuàng)建補(bǔ)丁。結(jié)果是一個內(nèi)核模塊,然后分發(fā)。加載此模塊時,它確保使用特定系統(tǒng)調(diào)用的進(jìn)程正在使用其修補(bǔ)版本。它類似于交通分流。
實時修補(bǔ)(Livepatch)實現(xiàn)的歷史
雖然livepatch功能是允許實時修補(bǔ)的最后一個缺失鏈接,但是需要幾年的開發(fā)才能達(dá)到這一點。內(nèi)核修補(bǔ)的第一個工作實現(xiàn)是Ksplice。該項目是麻省理工學(xué)院大學(xué)研究的一部分。四名學(xué)生創(chuàng)建了Ksplice公司,以推廣這項新技術(shù)。Ksplice(該公司)被Oracle收購,并作為他們自己的Linux發(fā)行版的單獨服務(wù)出售。
2014年,Red Hat創(chuàng)建了kpatch并在GPLv2許可下發(fā)布了它。同年,SUSE宣布了kGraft。兩種技術(shù)非常相似,但有一些細(xì)微差別。Red Hat的實現(xiàn)阻止內(nèi)核應(yīng)用實時修補(bǔ),而kGraft執(zhí)行延遲修補(bǔ)。在kGraft需要手動創(chuàng)建補(bǔ)丁的地方,kpatch允許手動和自動補(bǔ)丁創(chuàng)建。
商業(yè)產(chǎn)品
由于該功能需求量很大,因此大多數(shù)Linux發(fā)行版僅提供付費附加選項。像Ksplice,kpatch和kGraft這樣的技術(shù)在供應(yīng)商中具有商業(yè)價值。實時修補(bǔ)功能的典型用戶愿意為此支付大量資金。雖然有一些例外,但大多數(shù)用戶無法直接訪問此技術(shù)。慢慢地這可能會改變,特別是現(xiàn)在livepatch登陸內(nèi)核。
內(nèi)核實時修補(bǔ)核心
落在Linux內(nèi)核源代碼樹中的實現(xiàn)名為livepatch。它是kpatch和kGraft這兩個世界中最好的。它被命名為Kernel Live Patch Core,因此適用于所有人。由于此功能現(xiàn)在是內(nèi)核的組件之一,因此不再需要自定義修補(bǔ)程序。
哪些發(fā)行版目前支持實時修補(bǔ)?
此時,測試livepatch并不容易,因為并非所有內(nèi)核都支持它,或者使用客戶端工具來添加和應(yīng)用補(bǔ)丁。周圍有不同的技術(shù),如kpatch,ksplice,kGraft和livepatch。以下是一些使用的技術(shù)及其狀態(tài)的快速概述。
- Arch Linux(livepatch,kpatch-git工具)
- Debian(未知,也許是Debian 9?)
- Gentoo(kpatch或ksplice)
- Oracle Linux(ksplice)
- 紅帽企業(yè)Linux 7(kpatch或ksplice)
- SUSE(kGraft)
- Ubuntu 16.04及更高版本(livepatch)
如何檢查內(nèi)核是否支持livepatch?
要檢查內(nèi)核中是否支持livepatch,請檢查是否 啟用了 CONFIG_HAVE_LIVEPATCH設(shè)置。根據(jù)您的Linux發(fā)行版,有不同的方法可以檢查此支持。
- Arch Linux(嵌入式的多用)
zcat /proc/config.gz | grep LIVEPATCH
如果它已啟用它將顯示給您CONFIG_HAVE_LIVEPATCH=y。
- Ubuntu
cat /boot/config-$(uname -r) | grep LIVEPATCH
- 通過sysfs實現(xiàn)Livepatch狀態(tài)
如果啟用了內(nèi)核中的livepatch支持,那么還有另一種方法可以檢查它??梢栽趥挝募到y(tǒng)sysfs中找到livepatch條目和修補(bǔ)程序。查找 /sys /kernel/livepatch 目錄。
ls -ld /sys/kernel/livepatch
另一個選擇是查看父內(nèi)核目錄以查看所有與內(nèi)核相關(guān)的選項。
實時修補(bǔ)Linux內(nèi)核
要啟用實時修補(bǔ),我們需要客戶端來執(zhí)行此任務(wù)??蛻舳司哂腥绾尾僮魈囟▋?nèi)核的說明。如上所述,這是一項微妙的工作,因此無法普遍適用。因此,它是Linux發(fā)行版特定的。對于這篇博文,我們將使用Ubuntu 16.04(LTS)系統(tǒng)??蛻舳藢嵱贸绦蚴巧虡I(yè)的(由Canonical提供)。幸運的是,它們允許免費用戶修補(bǔ)最多三個系統(tǒng)進(jìn)行實時修補(bǔ)。在我們使用該軟件之前,我們需要先創(chuàng)建一個令牌。
安裝客戶端
使用canonical-livepath(Ubuntu)
- 第一步是使用snap 安裝名為canonical-livepatch的livepatch實用程序。
sudo snap install canonical-livepatch
然后啟用livepatch:
sudo canonical-livepatch enable [token]
你應(yīng)該得到一個積極的回應(yīng),說“成功啟用設(shè)備。使用機(jī)器令牌:[令牌]“。如果沒有,請查看本文底部的常見問題。
現(xiàn)在已經(jīng)安裝了客戶端工具,現(xiàn)在是時候使用它了。使用status命令運行它。
canonical-livepatch status

Linux內(nèi)核完全修補(bǔ)了Ubuntu
您還可以使用-verbose選項查看有關(guān)任何已應(yīng)用修補(bǔ)程序的更多信息。例如,涉及哪個CVE。
如何知道內(nèi)核是否正確修補(bǔ)?
因此它表示它正在完成它的工作,因為它已完全修補(bǔ)。很好,但我們怎么知道?由于這是一個舊內(nèi)核,我們知道有一些補(bǔ)丁可用。
1.使用livepatch目錄
第一個選項是查看前面提到的目錄/sys/kernel/livepatch并查看其中是否有任何條目。
因此它表示它正在完成它的工作,因為它已完全修補(bǔ)。很好,但我們怎么知道?由于這是一個舊內(nèi)核,我們知道有一些補(bǔ)丁可用。早期引用的目錄 /sys/kernel/livepatch有答案。

我們可以看到應(yīng)用了補(bǔ)丁。它具有相同的內(nèi)核版本。目錄名稱中的最后一個數(shù)字是指canonical-livepatch輸出中顯示的版本號。
2.使用污點標(biāo)志
另一種知道內(nèi)核已被修補(bǔ)的方法是通過/proc/sys/kernel/tainted檢查內(nèi)核是否“被污染”(值大于零)。這告訴調(diào)試器和其他工具內(nèi)核已被更改或調(diào)整。
cat /proc/sys/kernel/tainted
要獲取更多有關(guān)內(nèi)核污染的信息,請使用dmesg 命令。
dmesg -T | grep tainted
我們可以使用相同的命令來查看有關(guān)livepatch和相關(guān)詳細(xì)信息的更多信息。有趣的是,它顯示我們的測試期間驗證失敗。

Livepatch警告
如果您的系統(tǒng)經(jīng)過良好加固并禁用加載內(nèi)核模塊,那么livepatch將無法運行。這是因為加載了內(nèi)核模塊以應(yīng)用修補(bǔ)。

要確定您的內(nèi)核是否允許加載模塊,請查看文件/proc/sys/kernel/modules_disabled。
cat /proc/sys/kernel/modules_disabled
如果這給你一個'1',那么就無法加載內(nèi)核模塊而且livepatch將無法工作。
對livepatch錯誤進(jìn)行故障排除
與守護(hù)程序的連接失?。║buntu)
$ canonical-livepatch
2016/10/19 17:01:26執(zhí)行啟用時出錯。
與守護(hù)程序的連接失敗:獲取http://127.0.0.1/enable:撥打unix /var/snap/canonical->livepatch/15/livepatchd.sock:connect:沒有這樣的文件或目錄
此問題很可能是因為您的snapd軟件包已過時而導(dǎo)致的。首先升級它sudo apt install snapd。
命令未找到(Ubuntu)
sudo:canonical-livepatch:找不到命令
很可能用于快照的二進(jìn)制目錄不在您定義的PATH變量中。解決方法是指工具的完整路徑(/ snap / bin / canonical-livepatch)。
相關(guān)讀物
有興趣了解有關(guān)實時修補(bǔ)的更多信息嗎?這里有一些很好的資源:
- Linux內(nèi)核文檔
- Canonical livepatch服務(wù)(由Dustin Kirkland提供)
- Kpatch
- LWN關(guān)于內(nèi)核實時修補(bǔ)的文章
有興趣了解有關(guān)內(nèi)核及其功能的更多信息嗎?我們正在開展一個項目,讓他們列出我們的Linux安全功能頁面。
喜歡這篇文章并喜歡做一些回報嗎?與他人分享,以便更多人閱讀。快樂補(bǔ)?。?/em>
原文:
https://linux-audit.com/livepatch-linux-kernel-updates-without-rebooting/