Linux 深入理解进程权限
Linux进程权限分析
在linux下,关于文件权限,大部分人接触比较多,也比较熟悉了解.但是对进程权限一般知之甚少。本文总结一下linux系统下进程权限问题和现象。
需要强调的是,本文是linux系统下讨论,因为linux和unix有很多不同的地方,并且各个不同的unix系统也有很多不同。
先开门见山的列出本文讨论对象:ruid(实际用户id:realuserid)、euid(有效用户用户:effectiveuserid),suid(保存用户id:saveduserid)、fuid(文件系统用户id)。
除了上面4个,还涉及到一个位设置用户id位(setuseridbit),,即我们通常所说的处rwx之外那个s标志位。
另外,本文主要讨论userid,groupid规则基本一样,例如rgid,egid,sgid,fgid等,本文就不做组id方面的重复讨论了。
首先,查看这几个uid的方法有两种方式:一是ps命令(ps-ax-oruid-oeuid-osuid-ofuid-opid-ofname)列出这几个uid;二是查看status文件,(cat/proc/2495/status|grepUid)。
本文创建5个test用户test1~test5用来做本文中sample讨论使用,代表常见普通权限用户。
一:文件所有者用户和程序执行者用户是同一用户的情况
intmain(intargc,char*argv[]) { while(1)sleep(1); } $>g++main.cpp-oa.out $>ll -rwxr-xr-x.1test1test6780Sep1615:32a.out 文件所有者是test1,我们用test1用户执行a.out程序 $>sutest1 $>./a.out& $>ps-ax-oruid-oeuid-osuid-ofuid-opid-ofname|grepa.out 5025025025023192a.out (看到结果是4个uid全是test1;) 现在我们用test2用户执行test1的程序看看结果 $sutest2 5035035035033234a.out 再用root用户执行 00003257a.out
看到这个结果,我们基本可以总结:
在常见情况下。这四个id只受执行用户影响,不受文件owner用户影响。并且四个uid全部等于执行用户的id;
二、出让权限给其它用户。非root用户是无法出让权限给其它用户,只有root用户才能出让。
intmain(intargc,char*argv[]) { if(setuid(503)<0)perror("setuiderror"); while(1)sleep(1); } $>ll -rwxr-xr-x.1test1test6780Sep1615:32a.out 使用root用户执行 $>./a.out 查看状态,所有uid都变成test2用户。 5035035035033592a.out 把代码中setuid改成seteuid函数,会把euid和fuid改成test2用户 050305033614a.out 把代码中setuid改成setfsuid函数,会把fuid改成test2用户 0005033636a.out 当把代码改成下面样子 if(seteuid(503)<0)perror("seteuiderror"); if(setfsuid(504)<0)perror("setfsuiderror"); while(1)sleep(1); 或者 if(setfsuid(504)<0)perror("setfsuiderror"); if(setfeuid(503)<0)perror("seteuiderror"); while(1)sleep(1); 用root用户执行,得到都是一样的结果 050305033614a.out 到了这里我来总结一下:1、setuid和seteuid是有区别的,setuid是永久的放弃root用户权限,转让给非root用户后, 无法再restore到root用户,seteuid是临时放弃root用户权限,可以通过seteuid(0),restore到root权限。 这点应该是总所周知的特点,本文就不举例子演示。 2、seteuid会同时改变euid和fuid都为设置的euid值。
3、root用户可以通过调用setxxuid来改变权限用户。非root用户是无法改变和转让权限用户。
继续看一下s权限位对进程权限的影响
三、s标志位影响的是euid,suid,和fuid
intmain(intargc,char*argv[]) { while(1)sleep(1); } $>g++main.cpp $>ll -rwxr-xr-x.1test1test6780Sep1618:18a.out $>chmodu+sa.out $>ll -rwsr-xr-x.1test1test6780Sep1618:18a.out 使用root用户执行,查看用户ID为 05025025024133a.out
s权限位使用最经典的案例是passwd命令
下面我们看看他们对文件权限的影响,构建一个ruid,euid,和fuid都不同,看看创建出来的文件所有者是哪个uid
四、影响用户文件权限的是fuid,不是euid,该uid是linux特有的属性,unix系统是靠euid来判定用户权限。
intmain(intargc,char*argv[]) { if(setfsuid(503)<0)perror("setfsuiderror"); FILE*fp=fopen("test.log","a+"); if(fp==NULL) { perror("fopenerror"); } else { fclose(fp); } while(1)sleep(1); } 使用s权限位,文件所有者为root,执行者为test1,改变fuid为test2,这样就构造出3个uid各部相同,方便观察效果 $>ll -rws---r-x.1rootroot7397Sep1618:53a.out 运行查看状态,ruid为test1,euid为root,fuid为test2 502005034240a.out $>ll -rws---r-x.1rootroot7397Sep1618:53a.out -rw-rw-r--.1test2test0Sep1618:54test.log
五、权限的继承,当使用fork子进程的时候,子进程全部继承父进程四个uid,和父进程uid相同
当使用exec系列函数时候,会把suid置为euid。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!