39 Capabilities
简介
和进程凭证相似,Linux 的能力也有区分进程和文件的,它们都有许可集、有效集和继承集(内核 2.6.24 才实现了文件能力,老内核只有进程能力)。
进程能力集合:
- 许可集(CapPrm): TODO
- 有效集(CapEff): TODO
- 继承集(CapInh, inheritable): TODO
可执行文件能力集合:
- 许可集: TODO
- 有效集: TODO
- 继承集: TODO
此外,进程还有边界集 CapBnd 和 CapAmb(ambient),在 /proc/PID/status 中可以看到。CapAmb 约束了非特权程序调用 exec() 之后能继续保持的能力,在 Linux 4.3 引入,因此书上没有提及。
进程的能力集合实际上是线程的属性,而不是进程的。通过 cat /proc/PID/status | grep -i ^cap
中查看到的能力集是进程主线程的能力集,而通过 cat /proc/PID/task/TID/status | grep -i ^cap
看到的是具体线程的能力集。
例子:ping
命令缺少权限
ping
命令在安装后第一次使用时,可能会提示缺少权限,并提示:
ping: socktype: SOCK_RAW
ping: socket: Operation not permitted
ping: => missing cap_net_raw+p capability or setuid?
可以根据提示使用 setcap
命令给 ping
增加 cap_net_raw 到许可集中:
sudo setcap cap_net_raw+p /bin/ping
有些教程写的是使用 =pe
而不是 =p
(这里 =
和 +
是一样的,因为初始状态下 ping
没有任何权限),是指同样开启有效集标志,这样进程在从可执行文件启动的时候就会将许可集拷贝到有效集,不需要进程自己去检查。但是 ping
是处理了 capabilities 的,所以不需要打开 e
位。
也可以给
ping
命令增加 set-user-ID 标志位,Debian 系统中 /usr/bin/ 下的可执行文件都是属于 root 的,但是刚安装的时候可能没有 set-user-ID 标志。