每个进程都拥有真实的用户、组(uid、gid),有效的用户、组(euid、egid),保存的设置用户、组(suid、sgid),还有linux中专门用于文件存储存取的用户、组id(fsuid、fsgid对于unix系统没有这两个fields)。现说明进程中每种类型用户的功能:
(1)真实的用户、组(uid、gid):进程的真正所有者。每当用户在shell终端登录时,都会将登录用户作为登录进程的真正所有者。通过getuid来获得进程的真正用户所有者,修改进程的真正用户所有者可以通过setuid、seteuid、setresuid、setreuid。
(2)有效的用户、组(euid、egid):进程的有效用户、组。进程所执行各种操作所允许的权限(process credentials)是依据进程的有效用户来判断的,(在linux系统中(内核2.4以上)又引入了一个新的进程权限管理模型process capabilities,通过process capabilities来确定进程所允许的各种操作[可参看《深入理解linux内核》table 20-3])。通过geteuid来获得进程的有效用户,修改进程的有效用户可以通过setuid、seteuid、setresuid、setreuid、seteuid。
(3)文件系统的用户、组(fsuid、fsgid):用于进行文件访问的用户、组,这是linux系统中新引入的一类用户、组,对于unix系统文件的访问是通过euid来判断,没有函数获得进程的fsuid,用于修改有效用户的函数都会同时修改fsuid,如果要单独修改fsuid,而不修改euid,可以调用setfsuid。
(4)保存的设置用户、组(suid、sgid):保存的设置用户、组。进程中该类型的用户、组主要的用处是用于还原有效用户,观察到对于非超级用户用于修改有效用户的各个函数setuid、seteuid、setresuid、setreuid、seteuid普遍有一个前提条件就是如果修改后的有效用户是原先的suid则允许修改,利用这一点,进程可以修改有效用户到一个新用户,然后还原到原来的值(原来的值保存在保存设置的用户)。通过getresuid来获得进程的真实用户、有效用户、保存的设置用户。
|
setuid(e) |
setresuid(r,e,s) |
setreuid(r,e) |
setfsuid(f) |
seteuid(e) |
|||||
Field |
euid=0 |
euid!=0 |
euid=0 |
euid!=0 |
euid=0 |
euid!=0 |
euid=0 |
euid!=0 |
euid=0 |
euid!=0 |
uid |
e |
不变 |
r |
r( r必须为原先的uid或euid或suid) |
r |
r( r必须为原先的uid或euid) |
不变 |
不变 |
不变 |
不变 |
euid |
e |
e(e必须为原先的uid或euid或suid) |
e |
e( e必须为原先的uid或euid或suid) |
e |
e(e必须为原先的uid或euid或suid) |
不变 |
不变 |
e |
e(e必须为原先的uid或euid或suid) |
fsuid |
e |
e(e必须为原先的uid或euid或suid) |
e |
e( e必须为原先的uid或euid或suid) |
e |
e(e必须为原先的uid或euid或suid) |
f |
f(f必须为原先的uid或euid或suid或fsuid) |
e |
e(e必须为原先的uid或euid或suid) |
suid |
e |
不变 |
s |
s( s必须为原先的uid或euid或suid) |
e |
e(e必须为原先的uid或euid或suid) |
不变 |
不变 |
不变 |
不变 |