linux下capabilities基础操作
capabilities的基础操作
书接上回,我们在上篇文章中基本了解了capabilities的概念,明白了它的存在就是为了能够细粒化的管理linux的一些进程权限。那么具体它可以用什么程序来进行控制呢?
Linux 系统中主要提供了两种工具来管理 capabilities:libcap
和 libcap-ng
。libcap
提供了 getcap
和 setcap
两个命令来分别查看和设置文件的 capabilities,同时还提供了 capsh
来查看当前 shell 进程的 capabilities。libcap-ng
更易于使用,使用同一个命令 filecap
来查看和设置 capabilities。
1.libcap
注:本文示例环境为centos7
1.1 查看capabilities信息
#1.安装libcap
yum install -y libcap
#2.查看当前shell进程的capabilities
capsh --print
关于current和bounding set内容的解释:
- Current : 表示当前 shell 进程的 Effective capabilities 和 Permitted capabilities。可以包含多个分组,每一个分组的表示形式为
capability[,capability…]+(e|i|p)
,其中e
表示 effective,i
表示 inheritable,p
表示 permitted。不同的分组之间通过空格隔开,例如:Current: = cap_sys_chroot+ep cap_net_bind_service+eip
。再举一个例子,cap_net_bind_service+e cap_net_bind_service+ip
和cap_net_bind_service+eip
等价。- Bounding set : 这里仅仅表示 Bounding 集合中的 capabilities,不包括其他集合,所以分组的末尾不用加上
+...
。
#3.查看更加详细的信息---这里是直接从/proc文件系统内部查看的信息
[root@blackstone ~]# cat /proc/$$/status
#如果觉得相对杂乱一些,可以在前面添加grep查看想要的信息
#例如,过滤出cap相关的权限,并使用capsh的decode功能转码显示权限
[root@blackstone ~]# grep Cap /proc/$$/status
CapInh: 0000000000000000
CapPrm: 0000001fffffffff
CapEff: 0000001fffffffff
CapBnd: 0000001fffffffff
CapAmb: 0000000000000000
[root@blackstone ~]# capsh --decode=0000001fffffffff
1.2 管理capabilities
#1.查看capabilities
# 1.1 查看单个文件的capabilities
[root@blackstone ~]# getcap /usr/bin/ping
/usr/bin/ping = cap_net_admin,cap_net_raw+p
#1.2 递归查看capabilities
[root@blackstone ~]# getcap -r /usr/
/usr/bin/ping = cap_net_admin,cap_net_raw+p
/usr/sbin/arping = cap_net_raw+p
/usr/sbin/clockdiff = cap_net_raw+p
/usr/sbin/suexec = cap_setgid,cap_setuid+ep
/usr/local/nginx/sbin/nginx = cap_net_bind_service+eip
#1.3 查看进程的capabilities
[root@blackstone ~]# getpcaps 1085
Capabilities for `1085': =
#1.4 查看一组相互关联的线程的 capabilities(比如 nginx)
[root@blackstone ~]# getpcaps $(pgrep nginx)
注意看,这里的有权限的只有主线程,因为只有master线程需要特殊权限比如监听端口之类的。而其他线程仅仅需要响应请求即可。
#2.设置文件的capabilities
setcap CAP+set filename
# 示例
[root@blackstone ~]# touch file1
[root@blackstone ~]# getcap file1
[root@blackstone ~]# setcap cap_chown,cap_net_raw+ep file1
[root@blackstone ~]# getcap file1
file1 = cap_chown,cap_net_raw+ep
2. libcap-ng
2.1 安装
yum install libcap-ng-utils
2.2 使用方法
libcap-ng 使用 filecap
命令来管理文件的 capabilities。有几个需要注意的地方:
- filecap 添加删除或查看 capabilities 时,capabilities 的名字不需要带
CAP_
前缀(例如,使用NET_ADMIN
代替CAP_NET_ADMIN
);- filecap 不支持相对路径,只支持绝对路径;
- filecap 不允许指定 capabilities 作用的集合,capabilities 只会被添加到
permitted
和effective
集合。
2.2.1 查看
查看文件的capabilities
filecap /full/path/to/file
递归查看某个目录下所有文件的 capabilities
filecap /full/path/to/dir
示例:
#查看根目录下所有capabilities
[root@blackstone ~]# filecap /
file capabilities
/root/file1 chown, net_raw
/usr/sbin/suexec setgid, setuid
/usr/local/nginx/sbin/nginx net_bind_service
注:filecap 只会显示“capabilities 被添加到 permitted
和 effective
集合中”的文件。所以这里没有显示 ping 和 arping。
2.2.2 修改
#1.设置文件的 capabilities
filecap /full/path/to/file cap_name
#2.移除某个文件的 capabilities
filecap /full/path/to/file none
3.总结
相较于libcap-ng我更推荐使用前者对capabilities进行一个系统的操作,因为虽然复杂但是可以获取的信息更多,并且可以精细到文件或进程。