成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

系統 Linux
Podman 使用傳統的 fork/exec 模型(相對于客戶端/服務器模型)來運行容器。在進入本文的主要主題 Podman 和容器之前,我需要了解一點 Linux 審計功能的技術。

[[274929]]

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

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

什么是審計?

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

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

  1. # auditctl -w /etc/shadow

現在讓我們看看當我修改了 /etc/shadow 文件會發生什么:

  1. # touch /etc/shadow
  2. # ausearch -f /etc/shadow -i -ts recent
  3.  
  4. 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)`

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

內核修改了這個文件了么?

跟蹤登錄 UID

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

當我登錄系統時,登錄程序會為我的登錄過程設置 loginuid 字段。

我(dwalsh)的 UID 是 3267。

  1. $ cat /proc/self/loginuid
  2. 3267

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

  1. $ sudo cat /proc/self/loginuid
  2. 3267

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

容器

現在讓我們來看看容器。

  1. sudo podman run fedora cat /proc/self/loginuid
  2. 3267

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

  1. sudo docker run fedora cat /proc/self/loginuid
  2. 4294967295

為什么不一樣?

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

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

  1. cat /proc/1/loginuid
  2. 4294967295

怎么會被濫用?

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

  1. $ sudo docker run --privileged -v /:/host fedora touch /host/etc/shadow
  2. $ 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 是未設置的(4294967295);這意味著安全人員可能知道有進程修改了 /etc/shadow 文件但身份丟失了。

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

現在讓我們看看相同的場景在 Podman 下的情況。

  1. $ sudo podman run --privileged -v /:/host fedora touch /host/etc/shadow
  2. $ 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)

由于它使用傳統的 fork/exec 方式,因此 Podman 正確記錄了所有內容。

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

最后的想法

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

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

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

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2022-04-27 10:51:00

PythonMLCubePodman

2020-11-20 10:50:01

Docker容器

2021-07-31 12:58:53

PodmanLinux虛擬機

2015-01-14 13:07:03

2019-08-26 19:24:55

Podman容器Linux

2021-09-02 05:37:22

Containerd Kubernetes 容器

2021-06-23 16:40:58

JavaTomcatWeb

2010-03-02 13:45:28

2022-01-18 17:57:21

PodmanLinux容器

2019-07-24 09:39:55

容器安全IT

2018-10-26 16:20:27

PodmanrootLinux

2020-11-09 06:38:00

ninja構建方式構建系統

2013-12-24 07:22:22

2021-02-17 09:16:58

PodmanLinuxDocker

2017-06-06 15:34:55

2021-05-17 12:54:04

AnsiblePodman開源

2017-03-06 17:14:24

2022-03-16 11:06:05

區塊鏈支付安全

2024-09-11 17:28:39

2022-10-31 07:09:15

拷貝代碼項目
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 性一交一乱一透一a级 | 久久国产精品偷 | 日韩一区二区三区在线观看 | 欧美精品一区二区三区在线播放 | 欧美日韩在线一区二区 | 精品日韩一区 | 国产精品久久久久久久久动漫 | 一区二区三区在线观看视频 | 日韩欧美三区 | 亚洲一区免费 | 国产精品国产自产拍高清 | 91精品一区二区三区久久久久久 | 日韩欧美字幕 | 国产乱码精品一区二区三区中文 | 日本一二区视频 | 羞羞视频网站免费看 | 91香蕉嫩草 | www.久久久久久久久久久久 | 日本免费一区二区三区视频 | 日韩av电影院 | 日本手机看片 | 久久久久久久久毛片 | 久久久成人网 | 国产精品久久7777777 | 成人免费三级电影 | 正在播放国产精品 | 国产99精品| 国产一二三视频在线观看 | 久久久久黑人 | 亚洲精品久久久一区二区三区 | 国产a爽一区二区久久久 | 成人综合久久 | 网站一区二区三区 | 在线色 | 一二三四在线视频观看社区 | 成人在线精品视频 | 中文av在线播放 | 伊人狠狠操 | 国产日韩一区二区三区 | 久久国产精品一区二区 | 国产欧美日韩一区二区三区 |