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

為什么 strace 在 Docker 中不起作用?

開發 前端
在編輯“容器如何工作”愛好者雜志的能力頁面時,我想試著解釋一下為什么 strace 在 Docker 容器中無法工作。這里的問題是 —— 如果我在筆記本上的 Docker 容器中運行 strace,就會出現這種情況......

在編輯“容器如何工作”愛好者雜志的能力頁面時,我想試著解釋一下為什么 strace 在 Docker 容器中無法工作。

這里的問題是 —— 如果我在筆記本上的 Docker 容器中運行 strace,就會出現這種情況:

  1. $ docker run  -it ubuntu:18.04 /bin/bash 
  2. $ # ... install strace ... 
  3. [email protected]:/# strace ls 
  4. strace: ptrace(PTRACE_TRACEME, ...): Operation not permitted 

strace 通過 ptrace 系統調用起作用,所以如果不允許使用 ptrace,它肯定是不能工作的! 這個問題很容易解決 —— 在我的機器上,是這樣解決的:

  1. docker run --cap-add=SYS_PTRACE -it ubuntu:18.04 /bin/bash 

但我對如何修復它不感興趣,我想知道為什么會出現這種情況。為什么 strace 不能工作,為什么--cap-add=SYS_PTRACE 可以解決這個問題?

假設 1:容器進程缺少 CAP_SYS_PTRACE 能力。

我一直以為原因是 Docker 容器進程默認不具備 CAP_SYS_PTRACE 能力。這和它可以被 --cap-add=SYS_PTRACE 修復是一回事,是吧?

但這實際上是不合理的,原因有兩個。

原因 1:在實驗中,作為一個普通用戶,我可以對我的用戶運行的任何進程進行 strace。但如果我檢查我的當前進程是否有 CAP_SYS_PTRACE 能力,則沒有:

  1. $ getpcaps $$ 
  2. Capabilities for `11589': = 

原因 2:capabilities 的手冊頁對 CAP_SYS_PTRACE 的介紹是:

  1. CAP_SYS_PTRACE 
  2.        * Trace arbitrary processes using ptrace(2); 

所以,CAP_SYS_PTRACE 的作用是讓你像 root 一樣,可以對任何用戶擁有的任意進程進行 ptrace。你不需要用它來對一個只是由你的用戶擁有的普通進程進行 ptrace 。

我用第三種方法測試了一下(LCTT 譯注:此處可能原文有誤) —— 我用 docker run --cap-add=SYS_PTRACE -it ubuntu:18.04 /bin/bash 運行了一個 Docker 容器,去掉了 CAP_SYS_PTRACE 能力,但我仍然可以跟蹤進程,雖然我已經沒有這個能力了。什么?為什么?!

假設 2:關于用戶命名空間的事情?

我的下一個(沒有那么充分的依據的)假設是“嗯,也許這個過程是在不同的用戶命名空間里,而 strace 不能工作,因為某種原因而行不通?”這個問題其實并不相關,但這是我觀察時想到的。

容器進程是否在不同的用戶命名空間中?嗯,在容器中:

  1. root@e27f594da870:/# ls /proc/$$/ns/user -l 
  2. ... /proc/1/ns/user -> 'user:[4026531837]' 

在宿主機:

  1. bork@kiwi:~$ ls /proc/$$/ns/user -l 
  2. ... /proc/12177/ns/user -> 'user:[4026531837]' 

因為用戶命名空間 ID(4026531837)是相同的,所以容器中的 root 用戶和主機上的 root 用戶是完全相同的用戶。所以,絕對沒有理由不能夠對它創建的進程進行 strace!

這個假設并沒有什么意義,但我(之前)沒有意識到 Docker 容器中的 root 用戶和主機上的 root 用戶同一個,所以我覺得這很有意思。

假設 3:ptrace 系統的調用被 seccomp-bpf 規則阻止了

我也知道 Docker 使用 seccomp-bpf 來阻止容器進程運行許多系統調用。而 ptrace 在被 Docker 默認的 seccomp 配置文件阻止的系統調用列表中!(實際上,允許的系統調用列表是一個白名單,所以只是ptrace 不在默認的白名單中。但得出的結果是一樣的。)

這很容易解釋為什么 strace 在 Docker 容器中不能工作 —— 如果 ptrace 系統調用完全被屏蔽了,那么你當然不能調用它,strace 就會失敗。

讓我們來驗證一下這個假設 —— 如果我們禁用了所有的 seccomp 規則,strace 能在 Docker 容器中工作嗎?

  1. $ docker run --security-opt seccomp=unconfined -it ubuntu:18.04  /bin/bash 
  2. $ strace ls 
  3. execve("/bin/ls", ["ls"], 0x7ffc69a65580 /* 8 vars */) = 0 
  4. ... it works fine ... 

是的,很好用!很好。謎底解開了,除了…..

為什么 --cap-add=SYS_PTRACE 能解決問題?

我們還沒有解釋的是:為什么 --cap-add=SYS_PTRACE 可以解決這個問題?

docker run 的手冊頁是這樣解釋 --cap-add 參數的。

  1. --cap-add=[] 
  2.    Add Linux capabilities 

這跟 seccomp 規則沒有任何關系! 怎么回事?

我們來看看 Docker 源碼

當文檔沒有幫助的時候,唯一要做的就是去看源碼。

Go 語言的好處是,因為依賴關系通常是在一個 Go 倉庫里,你可以通過 grep 來找出做某件事的代碼在哪里。所以我克隆了 github.com/moby/moby,然后對一些東西進行 grep,比如 rg CAP_SYS_PTRACE。

我認為是這樣的。在 containerd 的 seccomp 實現中,在 contrib/seccomp/seccomp/seccomp_default.go 中,有一堆代碼來確保如果一個進程有一個能力,那么它也會(通過 seccomp 規則)獲得訪問權限,以使用與該能力相關的系統調用。

  1. case "CAP_SYS_PTRACE"
  2.        s.Syscalls = append(s.Syscalls, specs.LinuxSyscall{ 
  3.            Names: []string{ 
  4.                "kcmp"
  5.                "process_vm_readv"
  6.                "process_vm_writev"
  7.                "ptrace"
  8.            }, 
  9.            Action: specs.ActAllow, 
  10.            Args:   []specs.LinuxSeccompArg{}, 
  11.        }) 

在 moby 中的 profile/seccomp/seccomp.go 和 默認的 seccomp 配置文件中,也有一些其他的代碼似乎做了一些非常類似的事情,所以有可能就是這個代碼在做這個事情。

所以我想我們有答案了!

Docker 中的 --cap-add 做的事情比它說的要多

結果似乎是,--cap-add 并不像手冊頁里說的那樣,它更像是 --cap-add-and-also-whiteelist-some-extra-system-calls-if-required。這很有意義! 如果你具有一個像 --CAP_SYS_PTRACE 這樣的能力,可以讓你使用 process_vm_readv 系統調用,但是該系統調用被 seccomp 配置文件阻止了,那對你沒有什么幫助!

所以當你給容器 CAP_SYS_PTRACE 能力時,允許使用 process_vm_readv 和 ptrace 系統調用似乎是一個合理的選擇。

就這樣!

這是個有趣的小事情,我認為這是一個很好的例子,說明了容器是由許多移動的部件組成的,它們以不完全顯而易見的方式一起工作。

責任編輯:未麗燕 來源: Linux.cn
相關推薦

2019-05-07 14:03:53

鼠標中鍵Windows 10Windows

2021-05-07 07:50:44

Numactl內存代碼

2019-07-11 10:30:58

USBWindows 10 快速修復

2018-07-20 10:50:43

WindowsWindows 10Shift

2021-06-08 08:52:18

Makefile編譯c 文件

2025-05-26 08:35:00

2021-04-06 11:46:18

比特幣加密貨幣資產

2025-06-11 04:25:00

上下文窗口系統

2025-06-04 01:44:00

z-indexCSS堆疊

2019-03-13 10:45:21

憑據Windows 10遠程桌面

2024-06-04 16:42:45

2018-11-20 13:52:54

2022-12-01 08:09:05

SQLOracleSPM

2021-09-08 17:27:54

神經網絡AI算法

2023-03-20 09:42:06

2016-12-06 10:30:39

JavaScriptWriteWriteln

2022-12-27 14:43:15

模型GPT

2024-09-11 08:38:02

JavaScriptC#語言編程

2021-04-16 20:47:42

Go 指令函數

2025-02-27 09:30:00

MySQLLog Buffer數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜寂寞福利视频 | 波多野结衣av中文字幕 | 日韩精品视频网 | 日本a在线| 一区二区三区免费 | 综合久久综合久久 | 亚洲一区精品视频 | 国产成人免费在线观看 | 精品久久国产 | 日本高清视频在线播放 | 欧美亚洲视频 | 一区二区三区回区在观看免费视频 | 午夜羞羞 | 美日韩视频 | 日韩视频在线观看 | 亚洲激情综合网 | 国产高清免费视频 | 国产中文一区二区三区 | 精品国产乱码久久久久久影片 | 本地毛片 | 国产最好的av国产大片 | 国产精品久久久久久52avav | 久久综合激情 | 亚洲精品视频在线观看免费 | 九九久久精品视频 | 91精品国产乱码久久久久久久 | 国产精品久久久久久久久久不蜜臀 | 国产成人精品免高潮在线观看 | 日日夜夜影院 | 国产色网 | 国产精品一区二区三区四区 | 国产传媒在线播放 | 亚洲精选一区二区 | www.精品一区 | 黄色一级大片在线免费看产 | 91精品国产91久久综合桃花 | 国产欧美日韩一区 | 亚洲成人av | 亚洲在线| 国产精品一区二区无线 | 亚洲欧美另类在线观看 |