内容简介:在linux下,关于文件权限,大部分人接触比较多,也比较熟悉了解.但是对进程权限一般知之甚少。本文总结一下linux系统下进程权限问题和现象。
在 linux 下,关于文件权限,大部分人接触比较多,也比较熟悉了解.但是对进程权限一般知之甚少。本文总结一下linux系统下进程权限问题和现象。
需要强调的是,本文是linux系统下讨论,因为linux和unix有很多不同的地方,并且各个不同的unix系统也有很多不同。
先开门见山的列出本文讨论对象:ruid(实际用户id: real userid)、euid(有效用户用户:effective userid), suid(保存用户id:saved userid)、fuid(文件系统用户id)。
除了上面4个,还涉及到一个位 设置用户id位(set user id bit),,即我们通常所说的处rwx之外那个s标志位。
另外,本文主要讨论userid,groupid规则基本一样,例如rgid, egid, sgid, fgid等,本文就不做组id方面的重复讨论了。
首先,查看这几个uid的方法有两种方式:一是ps 命令 (ps -ax -o ruid -o euid -o suid -o fuid -o pid -o fname)列出这几个uid;二是查看status文件,(cat /proc/2495/status | grep Uid)。
本文创建5个test用户 test1~test5用来做本文中sample讨论使用,代表常见普通权限用户。
一:文件所有者用户和程序执行者用户是同一用户的情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
int main(int argc, char *argv[]) { while(1)sleep(1); } $>g++ main.cpp -o a.out $>ll -rwxr-xr-x. 1 test1 test 6780 Sep 16 15:32 a.out 文件所有者是test1,我们用test1用户执行a.out程序 $>su test1 $>./a.out & $>ps -ax -o ruid -o euid -o suid -o fuid -o pid -o fname | grep a.out 502 502 502 502 3192 a.out (看到结果是4个uid全是test1;) 现在我们用test2用户执行test1的程序看看结果 $su test2 503 503 503 503 3234 a.out 再用root用户执行 0 0 0 0 3257 a.out 看到这个结果,我们基本可以总结: 在常见情况下。这四个id只受执行用户影响,不受文件owner用户影响。并且四个uid全部等于执行用户的id; |
上面是我们碰到最常见最多的情况,所以导致大部分技术人员很少关心这个四个uid的区别和含义。让我们继续看看更多场景
二、出让权限给其它用户。非root用户是无法出让权限给其它用户,只有root用户才能出让。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
int main(int argc, char *argv[]) { if( setuid(503) < 0) perror ("setuid error"); while(1)sleep(1); } $>ll -rwxr-xr-x. 1 test1 test 6780 Sep 16 15:32 a.out 使用root用户执行 $>./a.out 查看状态,所有uid都变成test2用户。 503 503 503 503 3592 a.out 把代码中setuid改成seteuid函数,会把euid和fuid改成test2用户 0 503 0 503 3614 a.out 把代码中setuid改成setfsuid函数,会把fuid改成test2用户 0 0 0 503 3636 a.out 当把代码改成下面样子 if( seteuid(503) < 0) perror ("seteuid error"); if( setfsuid(504) < 0) perror ("setfsuid error"); while(1)sleep(1); 或者 if( setfsuid(504) < 0) perror ("setfsuid error"); if( setfeuid(503) < 0) perror ("seteuid error"); while(1)sleep(1); 用root用户执行,得到都是一样的结果 0 503 0 503 3614 a.out 到了这里我来总结一下:1、setuid和seteuid是有区别的,setuid是永久的放弃root用户权限,转让给非root用户后, 无法再restore到root用户,seteuid是临时放弃root用户权限,可以通过seteuid(0),restore到root权限。 这点应该是总所周知的特点,本文就不举例子演示。 2、seteuid 会同时改变euid和fuid都为设置的euid值。 3、root用户可以通过调用setxxuid 来改变权限用户。非root用户是无法改变和转让权限用户。 |
权限出让使用最多的场景是类似apache或 mysql 程序,启动的时候使用root用户启动,设置一些root用户才能操作的系统配置。创建子进程时候通过setuid降级为nobody用户。
继续看一下s权限位对进程权限的影响
三、s 标志位影响的是 euid,suid,和 fuid
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int main(int argc, char *argv[]) { while(1)sleep(1); } $>g++ main.cpp $>ll -rwxr-xr-x. 1 test1 test 6780 Sep 16 18:18 a.out $>chmod u+s a.out $>ll -rwsr-xr-x. 1 test1 test 6780 Sep 16 18:18 a.out 使用root用户执行,查看用户ID为 0 502 502 502 4133 a.out |
s权限位使用最经典的案例是passwd命令
下面我们看看他们对文件权限的影响,构建一个ruid,euid,和fuid都不同,看看创建出来的文件所有者是哪个uid
四、影响用户文件权限的是 fuid,不是 euid,该 uid 是 linux 特有的属性,unix 系统是靠 euid 来判定用户权限。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
int main(int argc, char *argv[]) { if( setfsuid(503) < 0) perror ("setfsuid error"); FILE * fp = fopen("test.log", "a+"); if(fp == NULL) { perror ("fopen error"); } else { fclose(fp); } while(1)sleep(1); } 使用s权限位,文件所有者为root,执行者为test1,改变fuid为test2,这样就构造出3个uid各部相同,方便观察效果 $>ll -rws---r-x. 1 root root 7397 Sep 16 18:53 a.out 运行查看状态,ruid为test1,euid为root,fuid为test2 502 0 0 503 4240 a.out $>ll -rws---r-x. 1 root root 7397 Sep 16 18:53 a.out -rw-rw-r--. 1 test2 test 0 Sep 16 18:54 test.log |
五、权限的继承,当使用 fork 子进程的时候,子进程全部继承父进程四个 uid,和父进程 uid 相同
当使用exec系列函数时候,会把suid置为euid。
以上所述就是小编给大家介绍的《Linux 下进程权限分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 进程:进程生命周期
- Python 知识巩固:通过主进程带起多个子进程实现多进程执行逻辑
- Python 中子进程与父进程
- 什么是僵尸进程,如何找到并杀掉僵尸进程?
- Python第十二章-多进程和多线程01-多进程
- 深入Node.js的进程与子进程:从文档到实践
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Pragmatic Programmer
Andrew Hunt、David Thomas / Addison-Wesley Professional / 1999-10-30 / USD 49.99
本书直击编程陈地,穿过了软件开发中日益增长的规范和技术藩篱,对核心过程进行了审视――即根据需求,创建用户乐于接受的、可工作和易维护的代码。本书包含的内容从个人责任到职业发展,直至保持代码灵活和易于改编重用的架构技术。从本书中将学到防止软件变质、消除复制知识的陷阱、编写灵活、动态和易适应的代码、避免出现相同的设计、用契约、断言和异常对代码进行防护等内容。一起来看看 《The Pragmatic Programmer》 这本书的介绍吧!