现在的位置: 首页 > 综合 > 正文

文件存取权限与设置set_uid位

2013年10月12日 ⁄ 综合 ⁄ 共 1569字 ⁄ 字号 评论关闭

首先,声明几个概念:

实际用户表示符(UID):该标识号负责标识运行进程的用户

有效用户表述符(EUID):该标识号负责标识以什么用户身份来给新创建的进程赋所有权、检查文件的存取权限和检查通过系统调用kill向进程                                       发送软中断信号的许可权限

实际用户组表示符(GID):负责标识运行进程的用户所属的组ID

有效用户组表述符(EGID):用来标识目前进程所属的用户组

 

很容易知道getuid()函数用于获取实际用户ID,geteuid()函数用于获取有效用户ID。下面通过一个例子来说明操作系统是通过哪种标志判断当前用户对文件的存取权限的。

 

 

 

root@heqiang-desktop:/home/heqiang/document/myc/linuxC# ls -l test.c

-rw-r--r-- 1 root root 0 2010-08-19 12:09 test.c

由列出的test.c文件信息可知,该文件只对root用户具有读写权限。
以root身份编译并执行该程序

root@heqiang-desktop:/home/heqiang/document/myc/linuxC# ./studyuid 
uid study:
Process's uid =0,euid=0
open successfully!

若切换到普通用户执行该程序
heqiang@heqiang-desktop:~/document/myc/linuxC$ ./studyuid 
uid study:
Process's uid =1000,euid=1000
Open failure,errno is 13: Permission denied
提示权限不够错误。
让我们对可执行程序./studyuid设置set_uid位看看(需切换到root用户)
root@heqiang-desktop:/home/heqiang/document/myc/linuxC# chmod 4755 studyuid
开始时,某个程序需要 root 权限完成一些工作,但后续的工作不需要 root 权限。可以将该可执行程序文件设置 set_uid 位,并使得该文件的属主为 root。这样,普通用户执行这个程序时,进程就具有了 root 权限。
之后,在切换到普通用户执行该程序
heqiang@heqiang-desktop:~/document/myc/linuxC$ ./studyuid 
uid study:
Process's uid =1000,euid=0
open successfully!
对比失败的那一次和成功的一次,我们发现,实际用户id没有变,而有效用户id变了,也就是说通过设置set_uid位,使得原本只有root用户可以执行的文件,普通用户执行时也同样具有了root权限。
因此,可以得出,内核对进程存取文件的许可权的检查,是通过考查进程的有效用户ID来实现的。
/*借鉴网络诸多内容*/

 

 

 

 

 

 

抱歉!评论已关闭.