Capabilities

如何使用 setcap 命令設置功能?

  • June 16, 2020

我想將 wpa_supplicant 和openvpn設置為以非 root 使用者身份執行,就像為wireshark推薦的設置一樣。我找不到任何文件說明 +eip此範例中的含義:

sudo setcap cap_net_raw,cap_net_admin,cap_dac_override+eip /usr/bin/dumpcap

Linux 中功能的工作方式記錄在man 7 capabilities.

有效集中的程序能力是針對其進行權限檢查的。在execv呼叫期間使用文件功能(當您想要執行另一個程序1時會發生這種情況)來計算程序的新功能集。

文件有兩組功能,允許的、可繼承的和有效的位

流程具有三個能力集:有效允許可繼承。還有一個邊界集,它限制了以後可以將哪些能力添加到程序的繼承集中,並影響在呼叫execv期間如何計算能力。能力只能從邊界集中刪除,不能添加。

程序的權限檢查是根據程序的有效集來檢查的。程序可以將其能力從允許集提升到有效集(使用 capgetcapset系統呼叫,推薦的 API 分別是cap_get_proccap_set_proc)。

可繼承邊界集以及文件功能在**execv系統呼叫期間發揮作用。在execv期間,計算新的有效集和允許集,繼承集和邊界集保持不變。該算法在capabilities手冊頁中描述:

P'(permitted) = (P(inheritable) & F(inheritable)) |
                (F(permitted) & cap_bset)

P'(effective) = F(effective) ? P'(permitted) : 0

P'(inheritable) = P(inheritable)    [i.e., unchanged]

其中P是舊的能力集,**P’**是execv之後的能力集,F是文件能力集。

如果能力同時在程序的可繼承集和文件的可繼承集(交集/邏輯與)中,則將其添加到允許集。文件的允許集被添加(聯合/邏輯或)到它(如果它在邊界集中)。

如果設置了文件功能中的有效位,則在**execv之後將所有允許的功能提升為有效

核心中的功能實際上是為執行緒設置的,但是對於文件功能,這種區別通常只有在程序改變自己的功能時才相關。

在您的範例功能cap_net_raw中,cap_net_admincap_dac_override被添加到繼承允許的集合中,並且設置了有效位。當你的二進製文件被執行時,如果程序不受邊界集的限制,它們將在有效集和允許集中具有這些功能。

$$ 1 $$對於fork系統呼叫,所有功能和邊界集都是從父程序複製的。uid 中的更改也有自己的語義,用於在有效允許集中如何設置功能。

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