Linux Capabilities 簡介


為了執行權限檢查,Linux 區分兩類進程:特權進程(其有效用戶標識為 0,也就是超級用戶 root)和非特權進程(其有效用戶標識為非零)。 特權進程繞過所有內核權限檢查,而非特權進程則根據進程憑證(通常為有效 UID,有效 GID 和補充組列表)進行完全權限檢查。

以常用的 passwd 命令為例,修改用戶密碼需要具有 root 權限,而普通用戶是沒有這個權限的。但是實際上普通用戶又可以修改自己的密碼,這是怎么回事?在 Linux 的權限控制機制中,有一類比較特殊的權限設置,比如 SUID(Set User ID on execution),不了解 SUID 的同學請參考《Linux 特殊權限 SUID,SGID,SBIT》。因為程序文件 /bin/passwd 被設置了 SUID 標識,所以普通用戶在執行 passwd 命令時,進程是以 passwd 的所有者,也就是 root 用戶的身份運行,從而修改密碼。

SUID 雖然可以解決問題,卻帶來了安全隱患。當運行設置了 SUID 的命令時,通常只是需要很小一部分的特權,但是 SUID 給了它 root 具有的全部權限。因此一旦 被設置了 SUID 的命令出現漏洞,就很容易被利用。也就是說 SUID 機制在增大了系統的安全攻擊面。

Linux 引入了 capabilities 機制對 root 權限進行細粒度的控制,實現按需授權,從而減小系統的安全攻擊面。本文將介紹 capabilites 機制的基本概念和用法。

說明:本文的演示環境為 Ubuntu 18.04。

Linux capabilities 是什么?

從內核 2.2 開始,Linux 將傳統上與超級用戶 root 關聯的特權划分為不同的單元,稱為 capabilites。Capabilites 作為線程(Linux 並不真正區分進程和線程)的屬性存在,每個單元可以獨立啟用和禁用。如此一來,權限檢查的過程就變成了:在執行特權操作時,如果進程的有效身份不是 root,就去檢查是否具有該特權操作所對應的 capabilites,並以此決定是否可以進行該特權操作。比如要向進程發送信號(kill()),就得具有 capability CAP_KILL;如果設置系統時間,就得具有 capability CAP_SYS_TIME

下面是從 capabilities man page 中摘取的 capabilites 列表:

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

如何使用 capabilities?

getcap 命令和 setcap 命令分別用來查看和設置程序文件的 capabilities 屬性。下面我們演示如何使用 capabilities 代替 ping 命令的 SUID。
因為 ping 命令在執行時需要訪問網絡,這就需要獲得 root 權限,常規的做法是通過 SUID 實現的(和 passwd 命令相同):

紅框中的 s 說明應用程序文件被設置了 SUID,這樣普通用戶就可以執行這些命令了。

移除 ping 命令文件上的 SUID 權限:

$ sudo chmod 755 /bin/ping

在移除 SUID 權限后,普通用戶在執行 ping 命令時碰到了 "ping: socket: Operation not permitted" 錯誤。

為 ping 命令文件添加 capabilities
執行 ping 命令所需的 capabilities 為 cap_net_admin 和 cap_net_raw,通過 setcap 命令可以添加它們:

$ sudo setcap cap_net_admin,cap_net_raw+ep /bin/ping

被賦予合適的 capabilities 后,ping 命令又可以正常工作了,相比 SUID 它只具有必要的特權,在最大程度上減小了系統的安全攻擊面。

如果要移除剛才添加的 capabilities,執行下面的命令:

命令中的 ep 分別表示 Effective 和 Permitted 集合(接下來會介紹),+ 號表示把指定的 capabilities 添加到這些集合中,- 號表示從集合中移除(對於 Effective 來說是設置或者清除位)。

程序文件的 capabilities

在上面的示例中我們通過 setcap 命令修改了程序文件 /bin/ping 的 capabilities。在可執行文件的屬性中有三個集合來保存三類 capabilities,它們分別是:

  • Permitted
  • Inheritable
  • Effective

在進程執行時,Permitted 集合中的 capabilites 自動被加入到進程的 Permitted 集合中。
Inheritable 集合中的 capabilites 會與進程的 Inheritable 集合執行與操作,以確定進程在執行 execve 函數后哪些 capabilites 被繼承。
Effective 只是一個 bit。如果設置為開啟,那么在執行 execve 函數后,Permitted 集合中新增的 capabilities 會自動出現在進程的 Effective 集合中。

進程的 capabilities

進程中有五種 capabilities 集合類型,分別是:

  • Permitted
  • Inheritable
  • Effective
  • Bounding
  • Ambient

相比文件的 capabilites,進程的 capabilities 多了兩個集合,分別是 Bounding 和 Ambient。
/proc/[pid]/status 文件中包含了進程的五個 capabilities 集合的信息,我們可以通過下面的命名查看當前進程的 capabilities 信息:

$ cat /proc/$$/status | grep 'Cap'

但是這中方式獲得的信息無法閱讀,我們需要使用 capsh 命令把它們轉義為可讀的格式:

$ capsh --decode=0000003fffffffff

總結

把特權用戶僅僅分為 root 和普通用戶顯然是過於粗糙了,這會帶來安全問題。Capabilities 為解決這一問題而生,它能提供精細粒度的特權集,從而有效的減小系統的安全攻擊面。

參考:
capability man page
Linux的capabilities機制
How Linux Capability Works in 2.6.25
getcap, setcap and file capabilities
Linux capabilities 101
getcap man page
setcap man page


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM