1、Linux能力机制概述

在以往的UNIX系统上,为了做进程的权限检查,把进程分为两类:特权进程(有效用户ID是0)和非特权进程(有效用户ID是非0)。特权进程可以通过内核所有的权限检查,而非特权进程的检查则是基于进程的身份(有效ID,有效组及补充组信息)进行。

从linux内核2.2开始,Linux把超级用户不同单元的权限分开,可以单独的开启和禁止,称为能力(capability)。可以将能力赋给普通的进程,使其可以做root用户可以做的事情。

此时内核在检查进程是否具有某项权限的时候,不再检查该进程的是特权进程还是非特权进程,而是检查该进程是否具有其进行该操作的能力。例如当进程设置系统时间,内核会检查该进程是否有设置系统时间(CAP_SYS_TIME)的能力,而不是检查进程的ID是否为0;

当前Linux系统中共有37项特权,可在/usr/include/linux/capability.h文件中查看

2、Linux能力机制的实现

一个完整的能力机制需要满足以下三个条件:

1、对进程的所有特权操作,linux内核必须检查该进程该操作的特权位是否使能。

2、Linux内核必须提供系统调用,允许进程能力的修改与恢复。

3、文件系统必须支持能力机制可以附加到一个可执行文件上,但文件运行时,将其能力附加到进程当中。

到linux内核版本2.6.24为止,上述条件的1、2可以满足。从linux内核2.6.24开始,上述3个条件可以都可以满足

每个进程包括三个能力集,含义如下:

Permitted: 它是effective capabilities和Inheritable capability的超集。如果一个进程在Permitted集合中丢失一个能力,它无论如何不能再次获取该能力(除非特权用户再次赋予它)

Inheritable: 它是表明该进程可以通过execve继承给新进程的能力。

Effecitive: Linux内核真正检查的能力集。

从2.6.24开始,Linux内核可以给可执行文件赋予能力,可执行文件的三个能力集含义如下:

Permitted:该能力当可执行文件执行时自动附加到进程中,忽略Inhertiable capability。

Inheritable:它与进程的Inheritable集合做与操作,决定执行execve后新进程的Permitted集合。

Effective: 文件的Effective不是一个集合,而是一个单独的位,用来决定进程成的Effective集合。

有上述描述可知,Linux系统中的能力分为两部分,一部分是进程能力,一部分是文件能力,而Linux内核最终检查的是进程能力中的Effective。而文件能力和进程能力中的其他部分用来完整能力继承、限制等方面的内容。

3、Linux能力机制的继承

在linux终端查看capabilities的man手册,其中有继承关系公式如下

P'(permitted) = (P(inheritable) & F(inheritable)) |

(F(permitted) &cap_bset) //新进程的permitted有老进程的和新进程的inheritable和可执行文件的permitted及cap_bset运算得到.

P'(effective) = F(effective) ? P'(permitted) : 0 //新进程的effective依赖可执行文件的effective位,使能:和新进程的permitted一样,负责为空P'(inheritable) = P(inheritable) [i.e., unchanged] //新进程的inheritable直接继承老进程的Inheritable

说明:

P 在执行execve函数前,进程的能力

P'在执行execve函数后,进程的能力F 可执行文件的能力cap_bset 系统能力的边界值,在此处默认全为1

有测试程序如下:

father.c

#include #include#include#include#include#include

voidlist_capability()

{struct__user_cap_header_struct cap_header_data;

cap_user_header_t cap_header= &cap_header_data;struct__user_cap_data_struct cap_data_data;

cap_user_data_t cap_data= &cap_data_data;

cap_header->pid =getpid();

cap_header->version =_LINUX_CAPABILITY_VERSION_1;if (capget(cap_header, cap_data) < 0) {

perror("Failed capget");

exit(1);

}

printf("Cap data permitted: 0x%x, effective: 0x%x, inheritable:0x%x",

cap_data->permitted, cap_data->effective,cap_data->inheritable);

}int main(void)

{

cap_t caps=cap_init();

cap_value_t capList[2] ={CAP_DAC_OVERRIDE, CAP_SYS_TIME};

unsigned num_caps= 2;

//cap_set_flag(caps, CAP_EFFECTIVE, num_caps, capList, CAP_SET);

cap_set_flag(caps, CAP_INHERITABLE, num_caps, capList, CAP_SET);

cap_set_flag(caps, CAP_PERMITTED, num_caps, capList, CAP_SET);if(cap_set_proc(caps))

{

perror("cap_set_proc");

}

list_capability();

execl("/home/xlzh/code/capability/child", NULL);

sleep(1000);

}

child.c

#include #include#include#include#include#include

voidlist_capability()

{struct__user_cap_header_struct cap_header_data;

cap_user_header_t cap_header= &cap_header_data;struct__user_cap_data_struct cap_data_data;

cap_user_data_t cap_data= &cap_data_data;

cap_header->pid =getpid();

cap_header->version =_LINUX_CAPABILITY_VERSION_1;if (capget(cap_header, cap_data) < 0) {

perror("Failed capget");

exit(1);

}

printf("childCap data permitted: 0x%x, effective: 0x%x, inheritable:0x%x", cap_data->permitted, cap_data->effective,cap_data->inheritable);

}int main(void)

{

list_capability(); sleep(1000);

}

执行结果分析

xlzh@cmos:~/code/capability$ gcc child.c -o child

xlzh@cmos:~/code/capability$ gcc father.c -o father -lcap

xlzh@cmos:~/code/capability$ sudo setcap cap_dac_override,cap_sys_time+ei child

xlzh@cmos:~/code/capability$ sudo setcap cap_dac_override,cap_sys_time+ip father/* 单独执行,child文件有E(effective)I(inheritable)的能力,执行child的终端没有任何能力, 套用公式(cap_bset默认全1)* P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & cap_bset) // P'(permitted) = (0x0 & 0x2000002) | (0x0 & 全1),结果为0

* P'(effective) = F(effective) ? P'(permitted) : 0 // P'(effective) = 1 ? P'(permitted) : 0, 结果为P'(permitted),即0

* P'(inheritable) = P(inheritable) // P'(inheritable) = 0

* 执行结果如下所示

*/xlzh@cmos:~/code/capability$ ./child

child Cap data permitted:0x0, effective: 0x0, inheritable 0x0

/* 单独执行,child文件有E(effective)I(inheritable)的能力,执行child的father文件有E(inheritable)和P(permitted)能力, 套用公式* P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & cap_bset) // P'(permitted) = (0x2000002 & 0x2000002) | (0x2000002 & 全1),结果为0

* P'(effective) = F(effective) ? P'(permitted) : 0 // P'(effective) = 1 ? P'(permitted) : 0, 结果为P'(permitted),即0x2000002

* P'(inheritable) = P(inheritable) // P'(inheritable) = 0x2000002

* 执行结果如下所示

*/

xlzh@cmos:~/code/capability$ ./father

father Cap data permitted:0x2000002, effective: 0x0, inheritable: 0x2000002child Cap data permitted:0x2000002, effective: 0x2000002, inheritable 0x2000002

上述单独运行child可执行程序,其进程没有任何能力。但是有father进程来启动运行child可执行程序,其进程则有相应的能力。

上例中father和child的能力都设置的cap_dac_override和cap_sys_time两个能力。其实两个可执行程序设置的能力可以不同,各位读者可以自己修改其能力,套用公式进行计算。

4、以root用户身份执行程序

1、以root用户身份执行程序,则该进程所有能力的的P和I都置为1

2、以root用户身份执行程序,则该进程的E使能

/*由于执行child的终端进程没有I能力,所有child进程的inheritable也为0, 其他能力为全1*/xlzh@cmos:~/code/capability$ sudo ./child

child Cap data permitted:0xffffffff, effective: 0xffffffff, inheritable 0x0

5、进程用户ID的变化对能力的影响

1、当一个进程的有效用户ID从0变化到非0, 那么所有的E能力清零

2、当一个进程的有效用户ID从非0变化到0,那么现有的P集合拷贝到E集合

3、如果一个进行原来的真实用户ID,有效用户ID,保存设置用户ID是0,由于某些操作这些ID都变成了非0,那么所有的的P和E能力全部清理

4、如果一个文件系统的用户ID从0变成非0,那么以下的能力在E集合中清除:CAP_CHOWN, CAP_DAC_OVERRIDE,  CAP_DAC_READ_SEARCH,  CAP_FOWNER,  CAP_FSETID,  CAP_LINUX_IMMUTABLE  (since  Linux  2.2.30),  CAP_MAC_OVERRIDE,  CAP_MKNOD,如果一个文件系统的用户ID从0变成非0,那么在P集合中使能的能力将设置到E集合中。

参考:

man capabilities

linux能力集机制,Linux能力(capability)机制的继承相关推荐

  1. Linux命令集(Linux文件管理命令--rm指令篇)

    Linux命令集(Linux文件管理命令--rm指令篇) Linux文件管理命令集(rm指令篇) 3. rm(remove) 1. 删除文件 2. 强制删除文件 3. 提示确认,删除前需逐一询问是否确 ...

  2. Linux命令集(Linux文件管理命令--rmdir指令篇)

    Linux命令集(Linux文件管理命令--rmdir指令篇) Linux文件管理命令集(rmdir指令篇) 5. rmdir(remove directory) 1. 删除空的目录 folder1 ...

  3. Linux命令集(Linux常用命令集--CD指令篇)

    Linux命令集(Linux常用命令--CD指令篇) Linux常用命令集(CD指令篇) 1.CD(change directory) Linux常用命令集(CD指令篇) 如下为笔者总结出在linux ...

  4. linux 常见问题集 q,Linux新手几个常见问题集

    Q:Linux怎么有那么多的版本?什么是发行版? A:Linux是一种操作系统,也指内核,但通常真正展现在用户面前的是发行版. Linux的开发模式不同于其他操作系统,它的开发者分散在世界各地,通过邮 ...

  5. redis在linux搭建集群,Linux/Centos 7 redis4 集群搭建

    背景说明: 项目初期使用AWS的ElastiCache Redis作为系统的数据缓存,近期由于数据量和QPS加大,导致Redis存在压力,进行了两次的单点垂直升级,缓解了目前的压力.项目组进行了数据和 ...

  6. linux 信号集 同步,linux信号集

    信号集给我们提供了一个能表示多个信号的是数据类型(sigset_t), 它将在sigprocmask, sigpending, sigsuspend之类的函数中用到, 这些函数我会在以后的文章中介绍. ...

  7. linux ajp集群,Linux下apache tomcat ajp_proxy 负载均衡+集群+session 复制

    11.查看 netstat –ant tcp        0      0 ::ffff:192.168.15.124:4000  :::*                        LISTE ...

  8. linux zk集群,linux ZooKeeper集群安装

    dataDir=/hadoop/zookeeper clientPort=2181 server.1=hadoop-master:28888:38888 server.2=hadoop-slave01 ...

  9. linux能力集机制,linux能力机制

    为什么有能力机制 在linux内核2.2之前,root用户可以在linux系统上为所欲为.因为,root用户id为0即特权用户,进程id也为0即特权进程,特权进程可以通过内核所有的权限检查,进行任何操 ...

  10. ONVIF 事件--能力集

    ONVIF 事件(events)–能力集 ONIVF事件能力集 events事件能力集如下,可以选择设备支持的选项. 如果服务端支持事件推送功能(移动侦测告警.绊线检测告警.区域检测告警,这里只例举告 ...

最新文章

  1. 【点云论文速读】点云高质量3D表面重建
  2. Shell脚本实现生成SSL自签署证书
  3. android studio资产目录,在Android Studio中设置单元测试的自定义资产目录
  4. tensorflow 之 最近用到的几个小操作tf.reshape,tf.convert_to_tensor,tf.where
  5. java获取远程网络图片文件流、压缩保存到本地
  6. 11个实用jQuery日历插件
  7. 容器编排技术 -- Kubernetes kubectl create serviceaccount 命令详解
  8. magento smtp设置
  9. C#项目”XXXXX”针对的是”.NETFramework,Version=v4.7.1”但此计算机没有安装它
  10. SQLserver的安装
  11. 阿里云安全恶意程序检测冠军经验分享(万字长文)
  12. 利用java的for循环画一棵圣诞树
  13. 九宫格一共有多少种解法
  14. Hazel游戏引擎(005)入口点
  15. 【opencv3】滑动条调节RGB颜色阈值并输出滑动条的值
  16. 面试中更多会考核相关技能的项目经验——再论程序员该如何准备面试
  17. ssm基于微信小程序的校园跑腿系统——计算机毕业设计
  18. 中文转换成NCR编码(utf-8 16进制)
  19. 视频下载(无意间不知道在哪里收藏的,我自己没有下载过,也没有测试过,如果你确实有需要下载下面的视频,就试试吧。如果下载不了也别扔石头。)
  20. Mifare经典工具如何使用(上)-- 摸索的过程

热门文章

  1. docker流媒体服务器性能,利用docker镜像搭建流媒体服务进行rtmp推流及点流(rtmp,hls,http-flv)测试...
  2. 标准的软件测试文档,软件测试上线的标准是什么?
  3. “FCoE全解系列”之网络融合交换机类型
  4. MD5的使用(计算指定目录下文件的md5值)
  5. Ps简单的墨笔画制作
  6. 背英语句子,来巧记单词
  7. OpenGL(十七)——Qt OpenGL在三维空间移动位图(会动的星星)
  8. python下载第三方库超时报错pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host=‘files.pyt
  9. Caemra名词缩写解释
  10. 跳出都市 赏不一样的月光