Permissions

允許非超級使用者執行程序 fork 和複製自身(可能重複)

  • April 29, 2019

問題

我想啟動一個 Docker 容器,它執行一個可能會或可能不會複製自身的程序。

是否可以設置具有普通 + clone_newuts 權限的使用者,以便我的容器沒有超級使用者的登錄使用者?

最初這個問題被標記為:CLONE_NEWUTS permission only,這是不正確的。@sourcejedi 在下面真誠地回答並大大提高了我的理解。

編輯-1

我找到了 su 標誌所在的位置:/usr/include/linux/sched.h,我希望答案類似於猴子在容器創建上修補特定使用者權限。我現在要沿著那條路走,看看它會把我帶到哪裡。

編輯-2

我找到了可以設置使用者/文件功能的位置。我看到我有很多閱讀要做,但我認為可以為文件提供特定的權限(能力)(在這種情況下將是可執行的)。從功能手冊頁: Starting with kernel 2.2, Linux divides the privileges traditionally associated with superuser into distinct units, known as capabilities, which can be independently enabled and disabled. Capabilities are a per-thread attribute. 因此,應該可以將特定功能(其標誌在上面的標題中找到)應用於文件或使用者。哪一個,我還不確定,但找到它變得非常有趣和深入。

EDIT-3

正如@sourcejedi 指出的那樣,我誤解了我的需求。必要的資訊在 中man limits.conf,在這種情況下,可以在指定的使用者級別執行程序root

EDIT-4

不幸的是,我從 EDIT-3 採取的路線也不正確。這允許指定使用者在指定的 uesr 級別執行所有程序。@sourcejedi 仍然是正確的,但是我將提出一個新問題,詢問我真正需要什麼。連結:以非 root 使用者身份執行可以分叉和複製的單個程序

沒有能力專門允許使用CLONE_NEWUTS標誌呼叫 clone()。

CLONE_NEWUTS用於創建和輸入一個新的“UTS 命名空間”。所有命名空間類型都需要CAP_SYS_ADMIN創建,但有一個例外:上游 Linux 核心允許非特權使用者創建並輸入新的使用者命名空間。

當您創建使用者命名空間時,您可以在該命名空間允許自己的根/完整功能,包括CAP_SYS_ADMIN. 如果您的系統支持此功能,您可以使用unshare -r. 它在新的使用者命名空間中打開一個根 shell。

非特權使用者使用命名空間的預期方法是在一個新的使用者命名空間內。然而,一些 Linux 發行版將核心配置為禁止此功能。

CAP_SYS_ADMIN被用作沒有更具體功能的任何東西的統稱。它太強大了。您應該假設它可以用來接管其他程序並因此獲得任何其他功能。

$$ 1 $$ Docker 守護程序的預設配置不會將任何容器放置在新的使用者命名空間中。因此,您應該假設顯式授予CAP_SYS_ADMINdocker 容器允許它以完全權限轉義容器。

$$ 1 $$ 如果非特權使用者可以直接創建所有類型的命名空間,則會引發問題,即命名空間可用於混淆 setuid 程序,使其執行不應執行的特權操作。交叉引用:“為什麼取消共享掛載命名空間需要 CAP_SYS_ADMIN?

另一種選擇是使用帶有 setuid/capabilities 的輔助執行檔,它只允許執行特定任務。就像如何sudo配置為只允許執行特定的特權命令一樣。這是FlatPak 使用的bubblewrap採用的方法。

bubblewrap README 還提供了一些參考,關於導致 Linux 發行版限制使用者命名空間的安全問題。

我認為這個故事與不真正支持“Docker in Docker”的原因重疊/如果不禁用主 Docker 守護程序中的重要安全功能是不可能的。雖然不太一樣。


$$ 1 $$例如CAP_SYS_ADMIN,用於掛載塊文件系統的功能,核心開發人員認為不可能可靠地保護惡意 FS 映像。 在新的使用者命名空間內,CAP_SYS_ADMIN不允許您掛載塊文件系統。但是,如果您還創建了一個新的掛載命名空間 - 例如unshare -rm- CAP_SYS_ADMIN 將允許您創建綁定掛載、掛載proc文件系統,並且在核心 4.18 或更高版本中,您可以掛載 FUSE 文件系統。

Docker 還在可用的系統上使用基於 LSM 的安全性 - SELinux 或 AppArmor。這些層可能會CAP_SYS_ADMIN在某些方面受到限制。這比 Docker 的其他安全層要模糊得多。如果您依賴於特定 LSM 的詳細工作原理,那似乎會破壞建構方便的可移植 Docker 容器的要點之一。

引用自:https://unix.stackexchange.com/questions/515992