Livepatch:Linux內(nèi)核更新,無需重新啟動

如果您運行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
image.png

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有答案。

image.png

我們可以看到應(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ì)信息的更多信息。有趣的是,它顯示我們的測試期間驗證失敗。

image.png

Livepatch警告

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

image.png

要確定您的內(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ǔ)的更多信息嗎?這里有一些很好的資源:

有興趣了解有關(guān)內(nèi)核及其功能的更多信息嗎?我們正在開展一個項目,讓他們列出我們的Linux安全功能頁面。

喜歡這篇文章并喜歡做一些回報嗎?與他人分享,以便更多人閱讀。快樂補(bǔ)?。?/em>

原文:

https://linux-audit.com/livepatch-linux-kernel-updates-without-rebooting/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文 這是關(guān)于這個話題的全部,最終的文件。 它包含有關(guān)如何成為Linux內(nèi)核開發(fā)人員以及如何學(xué)習(xí)如何與Linux內(nèi)...
    御淺永夜閱讀 869評論 0 3
  • 1.描述計算機(jī)的組成及其功能 (一)計算機(jī)的組成 1.CPU 2.CPU風(fēng)扇 3.BIOS 4.內(nèi)存 5.硬盤 6...
    whamai閱讀 1,642評論 0 1
  • feisky云計算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 4,346評論 0 5
  • 實時或動態(tài)內(nèi)核修補(bǔ)允許您修補(bǔ)正在運行的內(nèi)核,而不會影響正在運行的應(yīng)用程序,也無需重新啟動系統(tǒng)。自Linux內(nèi)核版本...
    jpyin閱讀 3,904評論 0 0
  • 前言 相信現(xiàn)在很多公有云包括企業(yè)內(nèi)部已經(jīng)開始使用Linux內(nèi)核熱補(bǔ)丁Livepatch,沒人喜歡重啟機(jī)器但現(xiàn)實是還...
    王奧OX閱讀 18,110評論 3 3

友情鏈接更多精彩內(nèi)容