capabilities的基础操作

书接上回,我们在上篇文章中基本了解了capabilities的概念,明白了它的存在就是为了能够细粒化的管理linux的一些进程权限。那么具体它可以用什么程序来进行控制呢?

Linux 系统中主要提供了两种工具来管理 capabilities:libcaplibcap-nglibcap 提供了 getcapsetcap 两个命令来分别查看和设置文件的 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+ipcap_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)

linux下capabilities基础操作-小白菜博客
注意看,这里的有权限的只有主线程,因为只有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 只会被添加到 permittedeffective 集合。

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 被添加到 permittedeffective 集合中”的文件。所以这里没有显示 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进行一个系统的操作,因为虽然复杂但是可以获取的信息更多,并且可以精细到文件或进程。