真正的UID,有效的UID,有些系统甚至还有“已保存的UID”。所有这些的目的是什么,特别是最后一个?
答案 0 :(得分:51)
每个UNIX进程都有3个与之关联的UID。超级用户权限是UID = 0.
真实UID
这是创建此过程的用户/进程的UID。仅当正在运行的进程具有EUID = 0时才能更改它。
有效UID
此UID用于评估进程执行特定操作的权限。如果EUID!= 0,则可以将EUID更改为RUID或SUID。如果EUID = 0,则可以将其更改为任何内容。
已保存的UID
如果运行set-UID位设置的可执行文件,则生成的运行进程将以运行它的真实用户的真实UID以及可执行文件所有者的有效且保存的UID开始。如果进程调用setuid()或seteuid()来更改其有效UID,则由于保存的UID,它们仍然可以再次恢复其原始权限。如果未设置set-UID位,则SUID将为RUID。
答案 1 :(得分:6)
真正的uid是启动流程的用户的ID。
有效uid通常与真实uid相同。只有在以下情况下才有所不同:
可执行文件设置了set-uid位,可执行文件所有者与调用它的用户不同
或者set-uid进程调用setuid(2)。如果进程具有超级用户权限,则允许setuid(2)的任何参数(但是所有* -uids都设置为相同的值);否则,可以使用real-uid或effective-uid或saved-uid调用setuid(2)。
saved-uid是进程启动时的有效uid,它被保存,以便作为各种set * uid系统调用的参数被允许。
请注意,使用超级用户权限调用setuid(2)来更改其有效uid的进程也会将实际uid和已保存的uid更改为相同的值,因此应使用非POSIX seteuid(2)。 / p>
以上所有内容也适用于(真实有效的)组ID。
答案 2 :(得分:4)
除了真实,有效和保存的UID之外,启用了审计的Unix系统也具有审计UID。进程的AUID标识启动进程的用户;它不会被setuid(2)或seteuid(2)改变。目的是通过该过程保持不变,仅用于标记审计记录。因此,如果用户执行特权shell(甚至是通过su或sudo的授权用户),则会从该用户标记该进程的审计记录。
答案 3 :(得分:1)
每个Linux进程都有3个与之关联的UID。
setuid
位的二进制图像文件。答案 4 :(得分:0)
对于除root之外的任何人都无法更改真正的UD,接受的答案是不正确的。 从setuid的手册页: (我无法发表评论)
setuid()函数设置真实有效的用户ID和 保存的set-user-ID为 当前进程到指定值。如果是,则允许setuid()函数 有效用户ID是超级用户的ID,或者指定的用户ID是否相同 有效的用户ID。如果没有,但指定的用户ID与真实用户相同 ID,setuid()将有效用户ID设置为真实用户ID。