apue 第八章
进程相关的六个id:
real uid/real gid 实际用户id
effective uid/effective uid 有效用户id
saved set uid/saved set gid 保存的设置用户id
real uid就是当前实际的用户id,effective udi决定了该进程对于系统资源的access的权限
咦?为什么有效用户id不是实际用户id呢?
想象一下当我们开放某个脚本的执行权限给其他用户的时候,却因为该用户没有access脚本需要的文件的权限,是不是很不合理?
例子:/etc/passwd 是一般用户没有权利去修改的,但是可以通过chpass来修改自己的用户密码。当我们运行chpass的时候,该进程的real uid是我们自己的uid,但是effective uid确是root的。
那么,这个effective uid又是怎么设置,与什么有关系?
我们继续以chpass为例子来说明吧:
-bash-2.05b$ ls -l /usr/bin/chpass
-r-sr-xr-x 6 root wheel 33268 May 27 2005 /usr/bin/chpass
发现有什么特别了吧,在用户的执行位上的s, 它是代表什么的呢?s The set-user-ID-on-execution and set-group-ID-on-execution bits.
这里被设置了set-user-ID权限位后,普通用户运行chpass却可以有root的访问权限,也就是说该进程的effective uid为root的uid,所以尽管我们对/etc/passwd没有写的权限,但是chpass却赋予我们修改它的权利。
同理,当我们没有设置该权限位,那么我们即使可以执行chpass,却也会修改/etc/passwd的时候出错。
saved set uid又有什么用呢? 就是为了让用户的effective id在real uid 和saved set uid之间来回转换,这样的操作可以通过调用setuid(uid)来实现。
进程启动时saved set uid == effective uid:
(1)若进程具有超级用户特权,则setuid函数将effective uid、real uid,以及saved set uid设置为uid。
(2)若进程没有超级用户特权,但是uid==effective uid或saved set uid,则setuid只将effective uid 设置为uid。不改变real uid和saved set uid。
(3)否则调用setuid(uid)失败