capabilities - Arch Linux 中文维基

跳至內容

# capabilities

出自 Arch Linux 中文维基

翻譯狀態：

- 本文（或部分內容）譯自 Capabilities，最近一次同步於 2025-03-04，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

能力（capability）是 POSIX 1003.1e 標準引入的功能，手冊說明參見 capabilities(7)。它允許使用更小的粒度控制超級管理員權限，可以避免 root 權限的濫用。軟體開發者應當儘可能為二進制文件賦予最小權限，而不是過度使用強大的 setuid。Arch Linux 中很多軟體包用了 capability，例如 fping包 中的 `fping` 就使用了 `CAP_NET_RAW` （能力的一種）。這樣一來，普通用戶也可以正常執行 `fping`，效果與使用 setuid 相似，同時減少了 `fping` 的潛在安全隱患。

## 實現

在 Linux 中，能力通過 security 名空間下的擴展屬性（詳見xattr(7)）實現。主流 Linux 文件系統均支持擴展屬性 ，包括Ext2，Ext3，Ext4，Btrfs，JFS，XFS 和 Reiserfs 等。

下面的示例使用 `getcap` 顯示「fping」的能力（Capabilities），以及通過 `getfattr` 顯示其編碼後的「fping」的能力信息。

    $ getcap /usr/bin/fping

    /usr/bin/fping = cap_net_raw+ep

    $ getfattr -d -m "^security\\." /usr/bin/ping

    # file: usr/bin/ping
    security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=

部分程序能夠自動保留文件的擴展屬性，但更多的情況下需要單獨指定參數，詳情可以參考頁面文件權限與屬性#保留擴展屬性。

在 Arch 中, 能力可以通過包的安裝腳本（如 fping包 中的 [1]）設置。

## 管理和維護

如果一個軟體包設置了過度寬鬆的能力，那應當被視為一個錯誤（bug）並上報, 而不是在這裡列舉出來。 同時，因為Arch不支持 MAC/RBAC ，所以設置 `CAP_SYS_ADMIN` 或 `CAP_DAC_OVERRIDE` ，不應當被視為錯誤（bug）。

警告：過多的能力會可能會導致權限問題。可以在 Brad Spengler的帖子中查看例子和解釋：False Boundaries and Arbitrary Code Execution.

## 其他從capabilities受益的程序

下面列舉的軟體中沒有使用 setuid 屬性的文件，但是他們中的部分命令需要 root 權限才能正常使用。通過設置能力，普通用戶可以在不提升權限的情況下使用這些軟體。

下文中能力後面的 `+ep` 表示相關能力標記為生效（effective）和允許（permitted）。更多信息請參閱 capabilities(7) § File capabilities

軟體 | 執行命令（以 root 權限執行）
--- | ---
beep(1) | `setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep`
chvt(1) | `setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt`
iftop(8) | `setcap cap_net_raw+ep /usr/bin/iftop`
mii-tool(8) | `setcap cap_net_admin+ep /usr/bin/mii-tool`
nethogs(8) | `setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs`
wavemon(1) | `setcap cap_net_admin+ep /usr/bin/wavemon`

在 ArchLinux 中，部分軟體（例如 mtr包）已經在其打包所使用的 `.install` 文件中配置了所需的「能力」。 因此部分軟體不需要手動執行上面的命令。

## 實用命令

找到具有 setuid-root 權限的文件:

    $ find /usr/bin /usr/lib -perm /4000 -user root

找到具有 setgid-root 權限的文件:

    $ find /usr/bin /usr/lib -perm /2000 -group root

## 為程序臨時授予能力

capsh(1)可以以指定的能力運行程序，而不需要修改文件擴展屬性。

下面的例子展示了如何為 gdb(1) 賦予 `CAP_SYS_PTRACE` 能力來調試程序：

    $ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_sys_ptrace+eip" --keep=1 --user="$USER" --addamb="cap_sys_ptrace" --shell=/usr/bin/gdb -- -p <pid>

上面的命令用 `-E` 參數是 sudo 命令中，保留當前用戶環境變量的參數。詳細說明參閱 sudo(8)。

nc(1) 監聽低埠號的例子：

    $ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_net_bind_service+eip" --keep=1 --user="$USER" --addamb="cap_net_bind_service" --shell=/usr/bin/nc -- -lvtn 123
    Listening on 0.0.0.0 123

## systemd

可以使用 `AmbientCapabilities` 和 `CapabilityBoundingSet` 為 systemd 單元分配能力，相較於在二進制文件上設置能力，這種方式更安全。參見 systemd.exec(5)。

## 參閱

- Man Pages: capabilities(7), setcap(8), getcap(8)
- Wikibooks:Grsecurity/Appendix/Capability Names and Descriptions
- Seccomp BPF (SECure COMPuting with filters)

分類：​

- 安全

capabilities
新增話題