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