Linux的capability深入分析.doc

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux的capability深入分析

一)概述: 1)从2.1版开始,Linux内核有了能力(capability)的概念,即它打破了UNIX/LINUX操作系统中超级用户/普通用户的概念,由普通用户也可以做只有超级用户可以完成的工作. 2)capability可以作用在进程上(受限),也可以作用在程序文件上,它与sudo不同,sudo只针对用户/程序/文件的概述,即sudo可以配置某个用户可以执行某个命令,可以更改某个文件,而capability是让某个程序拥有某种能力,例如: capability让/tmp/testkill程序可以kill掉其它进程,但它不能mount设备节点到目录,也不能重启系统,因为我们只指定了它kill的能力,即使程序有问题也不会超出能力范围. 3)每个进程有三个和能力有关的位图:inheritable(I),permitted(P)和effective(E),对应进程描述符task_struct(include/linux/sched.h)里面的cap_effective, cap_inheritable, cap_permitted,所以我们可以查看/proc/PID/status来查看进程的能力. 4)cap_effective:当一个进程要进行某个特权操作时,操作系统会检查cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0. 例如,如果一个进程要设置系统的时钟,Linux的内核就会检查cap_effective的CAP_SYS_TIME位(第25位)是否有效. 5)cap_permitted:表示进程能够使用的能力,在cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集. 6)cap_inheritable:表示能够被当前进程执行的程序继承的能力. 二)capability的设定与清除 我们在下面的程序中给当前的进程设定能力,最后我们清除掉所设定的能力,源程序如下: 1 #include stdio.h 2 #include stdlib.h 3 #include string.h 4 #include sys/types.h 5 #include unistd.h 6 7 #undef _POSIX_SOURCE 8 #include sys/capability.h 9 10 extern int errno; 11 12 void whoami(void) 13 { 14 printf(uid=%i euid=%i gid=%i\n, getuid(), geteuid(), getgid()); 15 } 16 17 void listCaps() 18 { 19 cap_t caps = cap_get_proc(); 20 ssize_t y = 0; 21 printf(The process %d was give capabilities %s\n, 22 (int) getpid(), cap_to_text(caps, y)); 23 fflush(0); 24 cap_free(caps); 25 } 26 27 int main(int argc, char **argv) 28 { 29 int stat; 30 whoami(); 31 stat = setuid(geteuid()); 32 pid_t parentPid = getpid(); 33 34 if(!parentPid) 35 return 1; 36 cap_t caps = cap_init(); 37 38 39 cap_value_t capList[5] = 40 { CAP_NET_RAW, CAP_NET_BIND_SERVICE , CAP_SETUID, CAP_SETGID,CAP_SETPCAP } ; 41 unsigned num_caps = 5; 42 cap_set_flag(caps, CAP_EFFECTIVE, num_caps, capList, CAP_SET); 43 cap_set_flag(caps, CAP_INHERITABLE, num_caps, capList, CAP_SET); 44 cap_set_flag(caps, CAP_PERMITTED, num_caps, capList, CAP_SET); 45 46 if (cap_set_proc(

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档