人妻少妇乱子伦精品_日韩人妻潮喷视频网站_日本最新最全无码不卡免费_日韩AV无码中文

當前位置: 首頁 > 科技新聞 >

Podman:一個更安全的運行容器的方式

時間:2019-11-13 04:53來源:網(wǎng)絡整理 瀏覽:
Podman 使用傳統(tǒng)的 fork/exec 模型(相對于客戶端/服務器模型)來運行容器。 在進入本文的主要主題 Podman 和容器

Podman:一個更安全的運行容器的方式

Podman 使用傳統(tǒng)的 fork/exec 模型(相對于客戶端/服務器模型)來運行容器。

在進入本文的主要主題 Podman 和容器之前,我需要了解一點 Linux 審計功能的技術(shù)。

什么是審計?

Linux 內(nèi)核有一個有趣的安全功能,叫做審計。它允許管理員在系統(tǒng)上監(jiān)視安全事件,并將它們記錄到audit.log 中,該文件可以本地存儲或遠程存儲在另一臺機器上,以防止黑客試圖掩蓋他的蹤跡。

/etc/shadow 文件是一個經(jīng)常要監(jiān)控的安全文件,因為向其添加記錄可能允許攻擊者獲得對系統(tǒng)的訪問權(quán)限。管理員想知道是否有任何進程修改了該文件,你可以通過執(zhí)行以下命令來執(zhí)行此操作:

 

現(xiàn)在讓我們看看當我修改了 /etc/shadow 文件會發(fā)生什么:

 

審計記錄中有很多信息,但我重點注意到它記錄了 root 修改了 /etc/shadow 文件,并且該進程的審計 UID(auid)的所有者是 dwalsh

內(nèi)核修改了這個文件了么?

跟蹤登錄 UID

登錄 UID(loginuid),存儲在 /proc/self/loginuid 中,它是系統(tǒng)上每個進程的 proc 結(jié)構(gòu)的一部分。該字段只能設(shè)置一次;設(shè)置后,內(nèi)核將不允許任何進程重置它。

當我登錄系統(tǒng)時,登錄程序會為我的登錄過程設(shè)置 loginuid 字段。

我(dwalsh)的 UID 是 3267。

 

現(xiàn)在,即使我變成了 root,我的登錄 UID 仍將保持不變。

 

請注意,從初始登錄過程 fork 并 exec 的每個進程都會自動繼承 loginuid。這就是內(nèi)核知道登錄的人是 dwalsh 的方式。

容器

現(xiàn)在讓我們來看看容器。

 

甚至容器進程也保留了我的 loginuid。 現(xiàn)在讓我們用 Docker 試試。

 

為什么不一樣?

Podman 對于容器使用傳統(tǒng)的 fork/exec 模型,因此容器進程是 Podman 進程的后代。Docker 使用客戶端/服務器模型。我執(zhí)行的 docker 命令是 Docker 客戶端工具,它通過客戶端/服務器操作與 Docker 守護進程通信。然后 Docker 守護程序創(chuàng)建容器并處理 stdin/stdout 與 Docker 客戶端工具的通信。

進程的默認 loginuid(在設(shè)置 loginuid 之前)是 4294967295(LCTT 譯注:232 - 1)。由于容器是 Docker 守護程序的后代,而 Docker 守護程序是 init 系統(tǒng)的子代,所以,我們看到 systemd、Docker 守護程序和容器進程全部具有相同的 loginuid4294967295,審計系統(tǒng)視其為未設(shè)置審計 UID。

 

怎么會被濫用?

讓我們來看看如果 Docker 啟動的容器進程修改 /etc/shadow 文件會發(fā)生什么。

 

在 Docker 情形中,auid 是未設(shè)置的(4294967295);這意味著安全人員可能知道有進程修改了 /etc/shadow 文件但身份丟失了。

如果該攻擊者隨后刪除了 Docker 容器,那么在系統(tǒng)上誰修改 /etc/shadow 文件將沒有任何跟蹤信息。

現(xiàn)在讓我們看看相同的場景在 Podman 下的情況。

 

由于它使用傳統(tǒng)的 fork/exec 方式,因此 Podman 正確記錄了所有內(nèi)容。

這只是觀察 /etc/shadow 文件的一個簡單示例,但審計系統(tǒng)對于觀察系統(tǒng)上的進程非常有用。使用 fork/exec 容器運行時(而不是客戶端/服務器容器運行時)來啟動容器允許你通過審計日志記錄保持更好的安全性。

最后的想法

在啟動容器時,與客戶端/服務器模型相比,fork/exec 模型還有許多其他不錯的功能。例如,systemd 功能包括:

  • SD_NOTIFY:如果將 Podman 命令放入 systemd 單元文件中,容器進程可以通過 Podman 返回通知,表明服務已準備好接收任務。這是在客戶端/服務器模式下無法完成的事情。
  • 套接字激活:你可以將連接的套接字從 systemd 傳遞到 Podman,并傳遞到容器進程以便使用它們。這在客戶端/服務器模型中是不可能的。

在我看來,其最好的功能是作為非 root 用戶運行 Podman 和容器。這意味著你永遠不會在宿主機上授予用戶 root 權(quán)限,而在客戶端/服務器模型中(如 Docker 使用的),你必須打開以 root 身份運行的特權(quán)守護程序的套接字來啟動容器。在那里,你將受到守護程序中實現(xiàn)的安全機制與宿主機操作系統(tǒng)中實現(xiàn)的安全機制的支配 —— 這是一個危險的主張。

【責任編輯:龐桂玉 TEL:(010)68476606】
推薦內(nèi)容