為什么Podman運(yùn)行容器更安全?

Podman 使用傳統(tǒng)的 fork/exec 模型(相對(duì)于客戶(hù)端/服務(wù)器模型)來(lái)運(yùn)行容器。

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

成都創(chuàng)新互聯(lián)公司專(zhuān)注于金城江網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供金城江營(yíng)銷(xiāo)型網(wǎng)站建設(shè),金城江網(wǎng)站制作、金城江網(wǎng)頁(yè)設(shè)計(jì)、金城江網(wǎng)站官網(wǎng)定制、微信小程序定制開(kāi)發(fā)服務(wù),打造金城江網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供金城江網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。

什么是審計(jì)?

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

/etc/shadow 文件是一個(gè)經(jīng)常要監(jiān)控的安全文件,因?yàn)橄蚱涮砑佑涗浛赡茉试S攻擊者獲得對(duì)系統(tǒng)的訪問(wèn)權(quán)限。管理員想知道是否有任何進(jìn)程修改了該文件,你可以通過(guò)執(zhí)行以下 命令來(lái)執(zhí)行此操作:

# auditctl -w /etc/shadow

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

# touch /etc/shadow 
# ausearch -f /etc/shadow -i -ts recent
type=PROCTITLE msg=audit(10/10/2018 09:46:03.042:4108) : proctitle=touch /etc/shadow type=SYSCALL msg=audit(10/10/2018 09:46:03.042:4108) : arch=x86_64 syscall=openat success=yes exit=3 a0=0xffffff9c a1=0x7ffdb17f6704 a2=O_WRONLY|O_CREAT|O_NOCTTY| O_NONBLOCK a3=0x1b6 items=2 ppid=2712 pid=3727 auid=dwalsh uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts1 ses=3 comm=touch exe=/usr/bin/touch subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null)`

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

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

跟蹤登錄 UID

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

當(dāng)我登錄系統(tǒng)時(shí),登錄程序會(huì)為我的登錄過(guò)程設(shè)置 loginuid 字段。

我(dwalsh)的 UID 是 3267。

$ cat /proc/self/loginuid
3267

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

$ sudo cat /proc/self/loginuid
3267

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

容器

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

sudo podman run fedora cat /proc/self/loginuid
3267

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

sudo docker run fedora cat /proc/self/loginuid 
4294967295

為什么Podman運(yùn)行容器更安全?

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

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

cat /proc/1/loginuid 
4294967295
為什么不一樣?

讓我們來(lái)看看如果 Docker 啟動(dòng)的容器進(jìn)程修改 /etc/shadow 文件會(huì)發(fā)生什么。

$ sudo docker run --privileged -v /:/host fedora touch /host/etc/shadow 
$ sudo ausearch -f /etc/shadow -i type=PROCTITLE msg=audit(10/10/2018 10:27:20.055:4569) : proctitle=/usr/bin/coreutils --coreutils-prog-shebang=touch /usr/bin/touch /host/etc/shadow type=SYSCALL msg=audit(10/10/2018 10:27:20.055:4569) : arch=x86_64 syscall=openat success=yes exit=3 a0=0xffffff9c a1=0x7ffdb6973f50 a2=O_WRONLY|O_CREAT|O_NOCTTY| O_NONBLOCK a3=0x1b6 items=2 ppid=11863 pid=11882 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=touch exe=/usr/bin/coreutils subj=system_u:system_r:spc_t:s0 key=(null)

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

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

怎么會(huì)被濫用?

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

$ sudo podman run --privileged -v /:/host fedora touch /host/etc/shadow 
$ sudo ausearch -f /etc/shadow -i type=PROCTITLE msg=audit(10/10/2018 10:23:41.659:4530) : proctitle=/usr/bin/coreutils --coreutils-prog-shebang=touch /usr/bin/touch /host/etc/shadow type=SYSCALL msg=audit(10/10/2018 10:23:41.659:4530) : arch=x86_64 syscall=openat success=yes exit=3 a0=0xffffff9c a1=0x7fffdffd0f34 a2=O_WRONLY|O_CREAT|O_NOCTTY| O_NONBLOCK a3=0x1b6 items=2 ppid=11671 pid=11683 auid=dwalsh uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=3 comm=touch exe=/usr/bin/coreutils subj=unconfined_u:system_r:spc_t:s0 key=(null)

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

這只是觀察  /etc/shadow 文件的一個(gè)簡(jiǎn)單示例,但審計(jì)系統(tǒng)對(duì)于觀察系統(tǒng)上的進(jìn)程非常有用。使用 fork/exec 容器運(yùn)行時(shí)(而不是客戶(hù)端/服務(wù)器容器運(yùn)行時(shí))來(lái)啟動(dòng)容器允許你通過(guò)審計(jì)日志記錄保持更好的安全性。

最后的想法

在啟動(dòng)容器時(shí),與客戶(hù)端/服務(wù)器模型相比,fork/exec 模型還有許多其他不錯(cuò)的功能。例如,systemd 功能包括:

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

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

原文鏈接: https://www.linuxprobe.com/podman-docker.html

本文名稱(chēng):為什么Podman運(yùn)行容器更安全?
標(biāo)題路徑:http://www.muchs.cn/article48/pgdhep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、網(wǎng)站策劃、自適應(yīng)網(wǎng)站、小程序開(kāi)發(fā)用戶(hù)體驗(yàn)、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)