关于UNIX和Linux系统下SUID、SGID的解析
,foo用户的uid和gid为200,201,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系. 如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限. SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源.passwd就是一个很鲜明的例子. SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid.下面讨论一个例子:UNIX系统有一个/dev/kmem的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令.这个文件不能给一般的用户读写,权限设为:cr——r—— 1 root system 2, 1 May 25 1998 kmem但ps等程序要读这个文件,而ps的权限设置如下:-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps这是一个设置了SGID的程序,而ps的用户是bin,不是root,不能设置SUID来访问kmem,但大家注意了,bin和root都属于system组,ps设置了SGID,一般用户执行ps,就会获得system组用户的权限,而文件kmem的同组用户的权限是可读,一般用户执行ps就没问题了.但有些人说,为什么不把ps程序设置为root用户的程序,然后设置SUID位,不也行吗?这的确可以解决问题,但实际中为什么不这样做呢?SGID的风险比SUID小得多,出于系统安全的考虑,应该尽量用SGID代替SUID的程序,如果可能的话.下面来说明一下SGID对目录的影响.SUID对目录没有影响.如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户.
三、关于SUID和SGID的编程和SUID和SGID编程比较密切相关的有以下的头文件和函数:#include #include uid_t getuid(void);uid_t geteuid(void);gid_t getgid (void);gid_t getegid (void);int setuid (uid_t UID);int setruid (uid_t RUID);int seteuid (uid_t EUID);int setreuid (uid_t RUID,uid_t EUID);int setgid (gid_t GID);int setrgid (gid_t RGID);int setegid (git_t EGID);int setregid (gid_t RGID, gid_t EGID);具体这些函数的说明在这里就不详细列出来了,要用到的可以用man查. SUID/SGID :假如你有文件a.txt #ls -l a.txt -rwxrwxrwx #chmod 4777 a.txt -rwsrwxrwx ======>注意s位置#chmod 2777 a.txt -rwxrwsrwx ======>注意s位置#chmod 7777 a.txt -rwsrwxswt ======>出现了t,t的作用在内存中尽量保存a.txt,节省系统再加载的时间. 现在再看前面设置 SUID/SGID作用:#cd /sbin #./lsusb…… #su aaa(普通用户) $./lsusb…… |
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |