能力(capability) (POSIX 1003.1e, capabilities(7)) 用更小的粒度控制超級管理員權限,可以避免使用 root 權限。軟體開發者應該為二進位文件賦予最小權限,而不是使用強大的setuid。很多軟體包用了能力,比如 iputils包 提供的ping
使用了 CAP_NET_RAW
(能力的一種) ,因此 ping
可以被普通用戶執行(效果和使用 setuid 相似),同時減少了ping
的潛在安全隱患。
實現
在 Linux 中,能力通過名空間 security 下的 extended attributes(擴展屬性) (xattr(7)) 實現。主流 linux 文件系統都支持 extended attributes ,包括Ext2,Ext3,Ext4,Btrfs,JFS,XFS 和 Reiserfs。
下面的示例使用 getcap
顯示「ping」的能力(Capabilities),以及通過 getfattr
顯示編碼後的「ping」的能力信息。
$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
$ getfattr -d -m "^security\\." /usr/bin/ping
# file: usr/bin/ping security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
在進行文件複製時,諸如「能力」等文件的擴展屬性可以通過 cp -a
自動複製, 但是其他的命令可能需要一個特別的參數,例如:rsync -X
。
在Arch中, 能力可以通過包安裝腳本(如 iputils包 中的 iputils.install
)設置。
管理和維護
如果一個軟體包設置了過度寬鬆的能力,那應當被視為一個錯誤(bug)並上報, 而不是在這裡列舉出來。 同時,因為Arch不支持 MAC/RBAC ,所以設置 CAP_SYS_ADMIN
或 CAP_DAC_OVERRIDE
,不應當被視為錯誤(bug)。
其他從capabilities受益的程序
下面程序的軟體包內不包含使用 setuid 屬性的文件,但是一些命令需要 root 權限才能執行。通過設置一些能力,普通用戶就可以使用軟體。
beep
# setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep
chvt
# setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt
iftop
# setcap cap_net_raw+ep /usr/bin/iftop
mii-tool
# setcap cap_net_admin+ep /usr/bin/mii-tool
mtr
# setcap cap_net_raw+ep /usr/bin/mtr-packet
nethogs
# setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs
wavemon
# setcap cap_net_admin+ep /usr/bin/wavemon
實用命令
找到 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 賦予 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>
netcat 綁定低埠號的例子:
$ 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