linux的uid和euid相关问题

linux下文件的权限可不止rwx,总共有12位,分别为s g t rwx rwx rwx其中t为表示粘着位,一旦这个位被置位,用户不能删除这个文件,这里重点要说的是s 和g这两个权限位。s位涉及到用户id和有效用户id,g位涉及到组id 和有效用户组id在linux系统中,有些可执行文件需要root权限才能执行,比如/usr/bin/passwd这个可执行程序,
ls -l /usr/bin/passwd 的结果如下:
-rwsr-xr-x. 1 root root 25980 Feb 22 2012 /usr/bin/passwd

从结果可以看出,这个可执行文件属于root用户,其中还对于属主权限时,x位被s位代替,这里的原因如下:
    首先,passwd这个可执行程序本身属于root,并且这个可执行程序本身操作的是/etc/passwd这个文件,对于/etc/passwd 非root用户只有读的权限,这个文件只有root用户具有写的权限当我们以root身份执行passwd 程序的时候,passwd对/etc/passwd这个文件执行写,这当然没问题。但是,奇怪的是,其他的用户也可以使用这个命令,并且也能够通过passwd命令修改/etc/passwd 这个文件,而/etc/passwd对于其他用户来说只能够读,这就
涉及到用户id (uid)和有效用户id 这两个概念(euid)内核在检查进程是否有权限操作某个资源,依据的是有效用户ID而非用户ID,当某个可执行文件在用户权限中设置了s位,那么执行这个程序的有效用户ID就被设置为可执行文件的属主用户ID.
下面就针对passwd这个程序来说明    比如有两个用户,一个是root  一个是foo 
uid(root) = 0 gid(root) = 0
uid(foo) = 502 gid(foo) = 501


那么当root用户执行passwd时,则对应的id如下
uid(root) = 0 gid(root) = 0
euid(root) = 0 egid(root) = 0 

而当foo用户执行passwd时,则对应的id如下:
uid(foo) = 502 gid(foo) = 502
euid(foo) = 0 egid(foo) = 0 
为什么其他用户通过passwd程序也能够写/etc/passwd这个程序,通过euid很显然可以看出来内核在检查时,发现euid是0所以,当然有权限能够写/etc/passwd这个文件了,这就是那个s标志位的影响。当foo用户执行passwd时,因为有s标志位,所以foo的有效用户被设置为passwd程序的属主用户root的id了。值得注意的是:s位只对可执行文件有意义,对其他的文件则没有意义。如果一个文件不是可执行文件,则通过chmod u+x filename  添加上,在执行的时候,还是不行的,同时具有x权限,
s才是有意义的。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页