公司动态

Linux进程权限

📅 2026/7/23 1:20:45
Linux进程权限
本文是Linux系统下讨论。注意Linux和Unix有很多不同的地方并且各个不同的Unix系统也有很多不同。本文讨论对象ruid: real user id即实际用户也即当前登录的用户euid: effective user id 即有效用户也即以哪个用户身份来执行脚本suid: set user id 设置执行用户fuid: file system user id, 即文件系统用户s权限位: 即 set user ID bit即除了rwx之外的那个s标志位查看这几个uid有2种方式使用ps命令ps-ax-oruid-oeuid-osuid-ofuid-opid-ofname查看进程的status文件cat/proc/{pid}/status|grepUid另查看用户的uid、gid等可以使用命令 id1. 普通场景下的uid情况实验1首先a.out程序属于用户test1和组test.然后su test1作为test1用户。然后执行a.out程序。此时使用方法1观察可见4个uidruid, euid, suid, fuid全部为test1.然后su test2作为test2用户。再执行a.out程序。再用方法1观察可见4个uid全部都变成了test2.结论1在普通场景下这4个uid等同于ruid, 即执行用户的uid而和文件的owner无关。2. 关于权限出让的情况实验2-1出让权限给其他用户注意只有root用户才能出让权限给其他用户首先a.out程序属于用户test1和组test;但是在a.out程序中使用系统调用setuid()将uid设置为test2的uid.然后让root用户来执行此程序使用方法1观察会发现4个uid都是 test2 的 uid实验2-2和实验2-1基本一致不同点在于在a.out程序中使用seteuid()系统调用将euid设置为test2的euid.此时用方法1观察会发现ruidrooteuidtest2suidrootfuidtest2结论2setuid和seteuid是有区别的:setuid是永久放弃了root用户权限转让给非root用户后无法再收回seteuid只是临时放弃root用户权限将来可通过seteuid(0)再回到root权限seteuid会同时改变euid和fuid都为所设置的euid的值只有root用户才能出让权限即只有root用户才能调用setuid.权限出让的常见场景比如apache和mysql启动的时候使用root用户启动设置一些root用户才能操作的系统配置而在创建子进程时通过setuid降级为nobody用户。3. s权限位对进程权限的影响实验3首先a.out属于test1用户和test用户组然后以test1用户的身份来运行chmod us a.out最后使用root用户来运行a.out使用方法1 ps命令来查看进程情况会发现ruidrooteuidsuidfuidtest1s权限位最经典的案例是passwd命令-rwsr-xr-x1root root45396may252012/usr/bin/passwd由上可见user2有权限执行passwd, 即rws里的s执行时ruid仍是user2而euid是root. 注意ruid总是实际执行者的uid而目前这个case下euid是文件所有者的uid.user2之所以能够改变他自己的密码是因为passwd内部会检查ruid是否是root若不是则其行为会局限于修改ruid的密码让euid变成root是必须的因为密码的改变必然要求写/etc/shadow文件而该文件权限位是 640即只有root能写所以euid必须是root.结论3euid和ruid什么时候不一样呢只有一种情况可执行文件设置了suid位然后由非owner用户来执行此时ruid为执行者而euid为owner.4. 对用户文件权限的影响实验4在程序中setfsuid({test2_uid}), 然后调用fopen(some file, a);该程序执行结束后使用 ls -l 会发现文件已经变成了属于test2的文件。结论4影响用户文件权限的是fuid不是euid.fuid是Linux特有的属性Unix系统是靠euid来判定用户权限。5. 进程权限的继承结论5当使用fork子进程的时候子进程全部继承父进程4个uid当使用exec系列函数时候会把suid置为euid参考文献http://blog.chinaunix.net/uid-27105712-id-3349522.htmlhttp://blog.csdn.net/nirendao/article/details/55549515(END)