真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

LinuxCapabilities概念是什么

這篇文章主要介紹“Linux Capabilities概念是什么”,在日常操作中,相信很多人在Linux Capabilities概念是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Linux Capabilities概念是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),下花園網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:下花園等地區(qū)。下花園做網(wǎng)站價(jià)格咨詢:13518219792

Linux 是一種安全的操作系統(tǒng),它把所有的系統(tǒng)權(quán)限都賦予了一個(gè)單一的 root 用戶,只給普通用戶保留有限的權(quán)限。root 用戶擁有超級(jí)管理員權(quán)限,可以安裝軟件、允許某些服務(wù)、管理用戶等。

作為普通用戶,如果想執(zhí)行某些只有管理員才有權(quán)限的操作,以前只有兩種辦法:一是通過 sudo 提升權(quán)限,如果用戶很多,配置管理和權(quán)限控制會(huì)很麻煩;二是通過 SUID(Set User ID on execution)來實(shí)現(xiàn),它可以讓普通用戶允許一個(gè) owner 為 root 的可執(zhí)行文件時(shí)具有 root 的權(quán)限。

SUID 的概念比較晦澀難懂,舉個(gè)例子就明白了,以常用的 passwd 命令為例,修改用戶密碼是需要 root 權(quán)限的,但普通用戶卻可以通過這個(gè)命令來修改密碼,這就是因?yàn)?/bin/passwd 被設(shè)置了 SUID 標(biāo)識(shí),所以普通用戶執(zhí)行 passwd 命令時(shí),進(jìn)程的 owner 就是 passwd 的所有者,也就是 root 用戶。

SUID 雖然可以解決問題,但卻帶來了安全隱患。當(dāng)運(yùn)行設(shè)置了 SUID 的命令時(shí),通常只是需要很小一部分的特權(quán),但是 SUID 給了它 root 具有的全部權(quán)限。這些可執(zhí)行文件是黑客的主要目標(biāo),如果他們發(fā)現(xiàn)了其中的漏洞,就很容易利用它來進(jìn)行安全攻擊。簡而言之,SUID 機(jī)制增大了系統(tǒng)的安全攻擊面。

為了對 root 權(quán)限進(jìn)行更細(xì)粒度的控制,實(shí)現(xiàn)按需授權(quán),Linux 引入了另一種機(jī)制叫 capabilities。

1. Linux capabilities 是什么?

Capabilities 機(jī)制是在 Linux 內(nèi)核 2.2 之后引入的,原理很簡單,就是將之前與超級(jí)用戶 root(UID=0)關(guān)聯(lián)的特權(quán)細(xì)分為不同的功能組,Capabilites 作為線程(Linux 并不真正區(qū)分進(jìn)程和線程)的屬性存在,每個(gè)功能組都可以獨(dú)立啟用和禁用。其本質(zhì)上就是將內(nèi)核調(diào)用分門別類,具有相似功能的內(nèi)核調(diào)用被分到同一組中。

這樣一來,權(quán)限檢查的過程就變成了:在執(zhí)行特權(quán)操作時(shí),如果線程的有效身份不是 root,就去檢查其是否具有該特權(quán)操作所對應(yīng)的 capabilities,并以此為依據(jù),決定是否可以執(zhí)行特權(quán)操作。

Capabilities 可以在進(jìn)程執(zhí)行時(shí)賦予,也可以直接從父進(jìn)程繼承。所以理論上如果給 nginx 可執(zhí)行文件賦予了 CAP_NET_BIND_SERVICE capabilities,那么它就能以普通用戶運(yùn)行并監(jiān)聽在 80 端口上。

capability 名稱描述
CAP_AUDIT_CONTROL啟用和禁用內(nèi)核審計(jì);改變審計(jì)過濾規(guī)則;檢索審計(jì)狀態(tài)和過濾規(guī)則
CAP_AUDIT_READ允許通過 multicast netlink 套接字讀取審計(jì)日志
CAP_AUDIT_WRITE將記錄寫入內(nèi)核審計(jì)日志
CAP_BLOCK_SUSPEND使用可以阻止系統(tǒng)掛起的特性
CAP_CHOWN修改文件所有者的權(quán)限
CAP_DAC_OVERRIDE忽略文件的 DAC 訪問限制
CAP_DAC_READ_SEARCH忽略文件讀及目錄搜索的 DAC 訪問限制
CAP_FOWNER忽略文件屬主 ID 必須和進(jìn)程用戶 ID 相匹配的限制
CAP_FSETID允許設(shè)置文件的 setuid 位
CAP_IPC_LOCK允許鎖定共享內(nèi)存片段
CAP_IPC_OWNER忽略 IPC 所有權(quán)檢查
CAP_KILL允許對不屬于自己的進(jìn)程發(fā)送信號(hào)
CAP_LEASE允許修改文件鎖的 FL_LEASE 標(biāo)志
CAP_LINUX_IMMUTABLE允許修改文件的 IMMUTABLE 和 APPEND 屬性標(biāo)志
CAP_MAC_ADMIN允許 MAC 配置或狀態(tài)更改
CAP_MAC_OVERRIDE忽略文件的 DAC 訪問限制
CAP_MKNOD允許使用 mknod() 系統(tǒng)調(diào)用
CAP_NET_ADMIN允許執(zhí)行網(wǎng)絡(luò)管理任務(wù)
CAP_NET_BIND_SERVICE允許綁定到小于 1024 的端口
CAP_NET_BROADCAST允許網(wǎng)絡(luò)廣播和多播訪問
CAP_NET_RAW允許使用原始套接字
CAP_SETGID允許改變進(jìn)程的 GID
CAP_SETFCAP允許為文件設(shè)置任意的 capabilities
CAP_SETPCAP參考 capabilities man page
CAP_SETUID允許改變進(jìn)程的 UID
CAP_SYS_ADMIN允許執(zhí)行系統(tǒng)管理任務(wù),如加載或卸載文件系統(tǒng)、設(shè)置磁盤配額等
CAP_SYS_BOOT允許重新啟動(dòng)系統(tǒng)
CAP_SYS_CHROOT允許使用 chroot() 系統(tǒng)調(diào)用
CAP_SYS_MODULE允許插入和刪除內(nèi)核模塊
CAP_SYS_NICE允許提升優(yōu)先級(jí)及設(shè)置其他進(jìn)程的優(yōu)先級(jí)
CAP_SYS_PACCT允許執(zhí)行進(jìn)程的 BSD 式審計(jì)
CAP_SYS_PTRACE允許跟蹤任何進(jìn)程
CAP_SYS_RAWIO允許直接訪問 /devport、/dev/mem、/dev/kmem 及原始?jí)K設(shè)備
CAP_SYS_RESOURCE忽略資源限制
CAP_SYS_TIME允許改變系統(tǒng)時(shí)鐘
CAP_SYS_TTY_CONFIG允許配置 TTY 設(shè)備
CAP_SYSLOG允許使用 syslog() 系統(tǒng)調(diào)用
CAP_WAKE_ALARM允許觸發(fā)一些能喚醒系統(tǒng)的東西(比如 CLOCK_BOOTTIME_ALARM 計(jì)時(shí)器)

2. capabilities 的賦予和繼承

Linux capabilities 分為進(jìn)程 capabilities 和文件 capabilities。對于進(jìn)程來說,capabilities 是細(xì)分到線程的,即每個(gè)線程可以有自己的capabilities。對于文件來說,capabilities 保存在文件的擴(kuò)展屬性中。

下面分別介紹線程(進(jìn)程)的 capabilities 和文件的 capabilities。

線程的 capabilities

每一個(gè)線程,具有 5 個(gè) capabilities 集合,每一個(gè)集合使用 64 位掩碼來表示,顯示為 16 進(jìn)制格式。這 5 個(gè) capabilities 集合分別是:

  • Permitted

  • Effective

  • Inheritable

  • Bounding

  • Ambient

每個(gè)集合中都包含零個(gè)或多個(gè) capabilities。這5個(gè)集合的具體含義如下:

Permitted

定義了線程能夠使用的 capabilities 的上限。它并不使能線程的 capabilities,而是作為一個(gè)規(guī)定。也就是說,線程可以通過系統(tǒng)調(diào)用 capset() 來從 EffectiveInheritable 集合中添加或刪除 capability,前提是添加或刪除的 capability 必須包含在 Permitted 集合中(其中 Bounding 集合也會(huì)有影響,具體參考下文)。 如果某個(gè)線程想向 Inheritable 集合中添加或刪除 capability,首先它的 Effective 集合中得包含 CAP_SETPCAP 這個(gè) capabiliy。

Effective

內(nèi)核檢查線程是否可以進(jìn)行特權(quán)操作時(shí),檢查的對象便是 Effective 集合。如之前所說,Permitted 集合定義了上限,線程可以刪除 Effective 集合中的某 capability,隨后在需要時(shí),再從 Permitted 集合中恢復(fù)該 capability,以此達(dá)到臨時(shí)禁用 capability 的功能。

Inheritable

當(dāng)執(zhí)行exec() 系統(tǒng)調(diào)用時(shí),能夠被新的可執(zhí)行文件繼承的 capabilities,被包含在 Inheritable 集合中。這里需要說明一下,包含在該集合中的 capabilities 并不會(huì)自動(dòng)繼承給新的可執(zhí)行文件,即不會(huì)添加到新線程的 Effective 集合中,它只會(huì)影響新線程的 Permitted 集合。

Bounding

Bounding 集合是 Inheritable 集合的超集,如果某個(gè) capability 不在 Bounding 集合中,即使它在 Permitted 集合中,該線程也不能將該 capability 添加到它的 Inheritable 集合中。

Bounding 集合的 capabilities 在執(zhí)行 fork() 系統(tǒng)調(diào)用時(shí)會(huì)傳遞給子進(jìn)程的 Bounding 集合,并且在執(zhí)行 execve 系統(tǒng)調(diào)用后保持不變。

  • 當(dāng)線程運(yùn)行時(shí),不能向 Bounding 集合中添加 capabilities。

  • 一旦某個(gè) capability 被從 Bounding 集合中刪除,便不能再添加回來。

  • 將某個(gè) capability 從 Bounding 集合中刪除后,如果之前 Inherited 集合包含該 capability,將繼續(xù)保留。但如果后續(xù)從 Inheritable 集合中刪除了該 capability,便不能再添加回來。

Ambient

Linux 4.3 內(nèi)核新增了一個(gè) capabilities 集合叫 Ambient ,用來彌補(bǔ) Inheritable 的不足。Ambient 具有如下特性:

  • PermittedInheritable 未設(shè)置的 capabilities,Ambient 也不能設(shè)置。

  • 當(dāng) PermittedInheritable 關(guān)閉某權(quán)限(比如 CAP_SYS_BOOT)后,Ambient 也隨之關(guān)閉對應(yīng)權(quán)限。這樣就確保了降低權(quán)限后子進(jìn)程也會(huì)降低權(quán)限。

  • 非特權(quán)用戶如果在 Permitted 集合中有一個(gè) capability,那么可以添加到 Ambient 集合中,這樣它的子進(jìn)程便可以在 AmbientPermittedEffective 集合中獲取這個(gè) capability?,F(xiàn)在不知道為什么也沒關(guān)系,后面會(huì)通過具體的公式來告訴你。

Ambient 的好處顯而易見,舉個(gè)例子,如果你將 CAP_NET_ADMIN 添加到當(dāng)前進(jìn)程的 Ambient 集合中,它便可以通過 fork()execve() 調(diào)用 shell 腳本來執(zhí)行網(wǎng)絡(luò)管理任務(wù),因?yàn)?CAP_NET_ADMIN 會(huì)自動(dòng)繼承下去。

文件的 capabilities

文件的 capabilities 被保存在文件的擴(kuò)展屬性中。如果想修改這些屬性,需要具有 CAP_SETFCAP 的 capability。文件與線程的 capabilities 共同決定了通過 execve() 運(yùn)行該文件后的線程的 capabilities。

文件的 capabilities 功能,需要文件系統(tǒng)的支持。如果文件系統(tǒng)使用了 nouuid 選項(xiàng)進(jìn)行掛載,那么文件的 capabilities 將會(huì)被忽略。

類似于線程的 capabilities,文件的 capabilities 包含了 3 個(gè)集合:

  • Permitted

  • Inheritable

  • Effective

這3個(gè)集合的具體含義如下:

Permitted

這個(gè)集合中包含的 capabilities,在文件被執(zhí)行時(shí),會(huì)與線程的 Bounding 集合計(jì)算交集,然后添加到線程的 Permitted 集合中。

Inheritable

這個(gè)集合與線程的 Inheritable 集合的交集,會(huì)被添加到執(zhí)行完 execve() 后的線程的 Permitted 集合中。

Effective

這不是一個(gè)集合,僅僅是一個(gè)標(biāo)志位。如果設(shè)置開啟,那么在執(zhí)行完 execve() 后,線程 Permitted 集合中的 capabilities 會(huì)自動(dòng)添加到它的 Effective 集合中。對于一些舊的可執(zhí)行文件,由于其不會(huì)調(diào)用 capabilities 相關(guān)函數(shù)設(shè)置自身的 Effective 集合,所以可以將可執(zhí)行文件的 Effective bit 開啟,從而可以將 Permitted 集合中的 capabilities 自動(dòng)添加到 Effective 集合中。

詳情請參考 Linux capabilities 的 man page。

3. 運(yùn)行 execve() 后 capabilities 的變化

上面介紹了線程和文件的 capabilities,你們可能會(huì)覺得有些抽象難懂。下面通過具體的計(jì)算公式,來說明執(zhí)行 execve() 后 capabilities 是如何被確定的。

我們用 P 代表執(zhí)行 execve() 前線程的 capabilities,P' 代表執(zhí)行 execve() 后線程的 capabilities,F 代表可執(zhí)行文件的 capabilities。那么:

> P'(ambient) = (file is privileged) ? 0 : P(ambient) > > P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & P(bounding))) | P'(ambient) > > P'(effective)   = F(effective) ? P'(permitted) : P'(ambient) > > P'(inheritable) = P(inheritable) [i.e., unchanged] > > P'(bounding) = P(bounding) [i.e., unchanged]

我們一條一條來解釋:

  • 如果用戶是 root 用戶,那么執(zhí)行 execve() 后線程的 Ambient 集合是空集;如果是普通用戶,那么執(zhí)行 execve() 后線程的 Ambient 集合將會(huì)繼承執(zhí)行 execve() 前線程的 Ambient 集合。

  • 執(zhí)行 execve() 前線程的 Inheritable 集合與可執(zhí)行文件的 Inheritable 集合取交集,會(huì)被添加到執(zhí)行 execve() 后線程的 Permitted 集合;可執(zhí)行文件的 capability bounding 集合與可執(zhí)行文件的 Permitted 集合取交集,也會(huì)被添加到執(zhí)行 execve() 后線程的 Permitted 集合;同時(shí)執(zhí)行 execve() 后線程的 Ambient 集合中的 capabilities 會(huì)被自動(dòng)添加到該線程的 Permitted 集合中。

  • 如果可執(zhí)行文件開啟了 Effective 標(biāo)志位,那么在執(zhí)行完 execve() 后,線程 Permitted 集合中的 capabilities 會(huì)自動(dòng)添加到它的 Effective 集合中。

  • 執(zhí)行 execve() 前線程的 Inheritable 集合會(huì)繼承給執(zhí)行 execve() 后線程的 Inheritable 集合。

這里有幾點(diǎn)需要著重強(qiáng)調(diào):

  1. 上面的公式是針對系統(tǒng)調(diào)用 execve() 的,如果是 fork(),那么子線程的 capabilities 信息完全復(fù)制父進(jìn)程的 capabilities 信息。

  2. 可執(zhí)行文件的 Inheritable 集合與線程的 Inheritable 集合并沒有什么關(guān)系,可執(zhí)行文件 Inheritable 集合中的 capabilities 不會(huì)被添加到執(zhí)行 execve() 后線程的 Inheritable 集合中。如果想讓新線程的 Inheritable 集合包含某個(gè) capability,只能通過 capset() 將該 capability 添加到當(dāng)前線程的 Inheritable 集合中(因?yàn)?P'(inheritable) = P(inheritable))。

  3. 如果想讓當(dāng)前線程 Inheritable 集合中的 capabilities 傳遞給新的可執(zhí)行文件,該文件的 Inheritable 集合中也必須包含這些 capabilities(因?yàn)?P'(permitted)   = (P(inheritable) & F(inheritable))|...)。

  4. 將當(dāng)前線程的 capabilities 傳遞給新的可執(zhí)行文件時(shí),僅僅只是傳遞給新線程的 Permitted 集合。如果想讓其生效,新線程必須通過 capset() 將 capabilities 添加到 Effective 集合中?;蛘唛_啟新的可執(zhí)行文件的 Effective 標(biāo)志位(因?yàn)?P'(effective)   = F(effective) ? P'(permitted) : P'(ambient))。

  5. 在沒有 Ambient 集合之前,如果某個(gè)腳本不能調(diào)用 capset(),但想讓腳本中的線程都能獲得該腳本的 Permitted 集合中的 capabilities,只能將 Permitted 集合中的 capabilities 添加到 Inheritable 集合中(P'(permitted)  = P(inheritable) & F(inheritable)|...),同時(shí)開啟 Effective 標(biāo)志位(P'(effective)   = F(effective) ? P'(permitted) : P'(ambient))。有 有 Ambient 集合之后,事情就變得簡單多了,后續(xù)的文章會(huì)詳細(xì)解釋。

  6. 如果某個(gè) UID 非零(普通用戶)的線程執(zhí)行了 execve(),那么 PermittedEffective 集合中的 capabilities 都會(huì)被清空。

  7. 從 root 用戶切換到普通用戶,那么 PermittedEffective 集合中的 capabilities 都會(huì)被清空,除非設(shè)置了 SECBIT_KEEP_CAPS 或者更寬泛的 SECBIT_NO_SETUID_FIXUP。

關(guān)于上述計(jì)算公式的邏輯流程圖如下所示(不包括 Ambient 集合):

Linux Capabilities概念是什么

4. 簡單示例


下面我們用一個(gè)例子來演示上述公式的計(jì)算邏輯,以 ping 文件為例。如果我們將 CAP_NET_RAW capability添加到 ping 文件的 Permitted 集合中(F(Permitted)),它就會(huì)添加到執(zhí)行后的線程的 Permitted 集合中(P'(Permitted))。由于 ping 文件具有 capabilities 意識(shí),即能夠調(diào)用 capset()capget() ,它在運(yùn)行時(shí)會(huì)調(diào)用 capset()CAP_NET_RAW capability 添加到線程的 Effective 集合中。

換句話說,如果可執(zhí)行文件不具有 capabilities 意識(shí),我們就必須要開啟 Effective 標(biāo)志位(F(Effective)),這樣就會(huì)將該 capability 自動(dòng)添加到線程的 Effective 集合中。具有capabilities 意識(shí)的可執(zhí)行文件更安全,因?yàn)樗鼤?huì)限制線程使用該 capability 的時(shí)間。

我們也可以將 capabilities 添加到文件的 Inheritable 集合中,文件的 Inheritable 集合會(huì)與當(dāng)前線程的 Inheritable 集合取交集,然后添加到新線程的 Permitted 集合中。這樣就可以控制可執(zhí)行文件的運(yùn)行環(huán)境。

看起來很有道理,但有一個(gè)問題:如果可執(zhí)行文件的有效用戶是普通用戶,且沒有 Inheritable 集合,即 F(inheritable) = 0,那么 P(inheritable) 將會(huì)被忽略(P(inheritable) & F(inheritable))。由于絕大多數(shù)可執(zhí)行文件都是這種情況,因此 Inheritable 集合的可用性受到了限制。我們無法讓腳本中的線程自動(dòng)繼承該腳本文件中的 capabilities,除非讓腳本具有 capabilities 意識(shí)

要想改變這種狀況,可以使用 Ambient 集合。Ambient 集合會(huì)自動(dòng)從父線程中繼承,同時(shí)會(huì)自動(dòng)添加到當(dāng)前線程的 Permitted 集合中。舉個(gè)例子,在一個(gè) Bash 環(huán)境中(例如某個(gè)正在執(zhí)行的腳本),該環(huán)境所在的線程的 Ambient 集合中包含 CAP_NET_RAW capability,那么在該環(huán)境中執(zhí)行 ping 文件可以正常工作,即使該文件是普通文件(沒有任何 capabilities,也沒有設(shè)置 SUID)。

5. 終極案例

最后拿 docker 舉例,如果你使用普通用戶來啟動(dòng)官方的 nginx 容器,會(huì)出現(xiàn)以下錯(cuò)誤:

bind() to 0.0.0.0:80 failed (13: Permission denied)

因?yàn)?nginx 進(jìn)程的 Effective 集合中不包含 CAP_NET_BIND_SERVICE capability,且不具有 capabilities 意識(shí)(普通用戶),所以啟動(dòng)失敗。要想啟動(dòng)成功,至少需要將該 capability 添加到 nginx 文件的 Inheritable 集合中,同時(shí)開啟 Effective 標(biāo)志位,并且在 Kubernetes Pod 的部署清單中的 securityContext --> capabilities 字段下面添加 NET_BIND_SERVICE(這個(gè) capability 會(huì)被添加到 nginx 進(jìn)程的 Bounding 集合中),最后還要將 capability 添加到 nginx 文件的 Permitted 集合中。如此一來就大功告成了,參考公式:P'(permitted) = ...|(F(permitted) & P(bounding)))|...P'(effective) = F(effective) ? P'(permitted) : P'(ambient)。

如果容器開啟了 securityContext/allowPrivilegeEscalation,上述設(shè)置仍然可以生效。如果 nginx 文件具有 capabilities 意識(shí),那么只需要將 CAP_NET_BIND_SERVICE capability 添加到它的 Inheritable 集合中就可以正常工作了。

到此,關(guān)于“Linux Capabilities概念是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


分享標(biāo)題:LinuxCapabilities概念是什么
文章地址:http://weahome.cn/article/jecsji.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部