Linux Capabilities 簡介

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

以經常使用的 passwd 命令爲例,修改用戶密碼須要具備 root 權限,而普通用戶是沒有這個權限的。可是實際上普通用戶又能夠修改本身的密碼,這是怎麼回事?在 Linux 的權限控制機制中,有一類比較特殊的權限設置,好比 SUID(Set User ID on execution),不瞭解 SUID 的同窗請參考《Linux 特殊權限 SUID,SGID,SBIT》。由於程序文件 /bin/passwd 被設置了 SUID 標識,因此普通用戶在執行 passwd 命令時,進程是以 passwd 的全部者,也就是 root 用戶的身份運行,從而修改密碼。linux

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

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

說明:本文的演示環境爲 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 列表:socket

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,這樣普通用戶就能夠執行這些命令了。ui

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

$ 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

相關文章
相關標籤/搜索