一个进程可以拥有的所有不同UID的处理是什么?

真正的UID,有效的UID,有些系统甚至有一个“保存的UID”。 所有这些的目的是什么,尤其是最后一个呢?

Solutions Collecting From Web of "一个进程可以拥有的所有不同UID的处理是什么?"

每个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。

真正的用户名是启动进程的用户的ID。

有效的uid通常和真正的uid是一样的。 只有在以下情况下,

  • 可执行文件已设置了set-uid位,并且可执行程序的所有者与用户调用它不同

  • 或者如果set-uid进程调用setuid(2)。 如果进程具有超级用户权限,则setuid(2)的任何参数都是允许的(但是所有的* -uid都被设置为相同的值)。 否则,setuid(2)可以用实际的uid或者有效的uid或者被保存的uid来调用。

saved-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。

  • Real UID :创建此进程的进程的UID。
  • 有效的UID :这用于评估进程执行特定操作的权限。
  • 已保存的UID :对于其上具有setuid位的二进制图像文件。

被接受的答案是不正确的,因为除了root以外,任何人都不能改变真正的UD。 从setuid的手册页:(我无法发表评论)

setuid()函数将当前进程的实际有效用户ID和保存的set-user-ID设置为指定值。 如果有效的用户ID是超级用户的ID,或者指定的用户ID与有效的用户ID相同,则setuid()函数是允许的。 如果不是,但是指定的用户ID与真实的用户ID相同,setuid()会将有效的用户ID设置为真实的用户ID。