代码之家  ›  专栏  ›  技术社区  ›  raldi

一个流程可以拥有的所有不同的uid有什么区别?

  •  36
  • raldi  · 技术社区  · 16 年前

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

    5 回复  |  直到 9 年前
        1
  •  51
  •   Jonathan Leffler    14 年前

    每个UNIX进程都有3个与其关联的uid。超级用户权限是uid=0。

    真正的UID

    这是创建此进程的用户/进程的uid。仅当正在运行的进程的euid=0时才能更改。

    有效的UID

    此uid用于评估进程执行特定操作的权限。euid可以更改为ruid,也可以更改为suid,如果euid!=0。如果euid=0,则可以将其更改为任何内容。

    保存的UID

    如果使用set uid位集运行可执行文件,则生成的运行进程将以运行该文件的实际用户的实际uid以及可执行文件所有者的有效和保存的uid开始。如果进程随后调用setuid()或seteuid()以更改其有效的uid,则由于保存的uid,它们仍然可以重新获得原始特权。如果未设置set uid位,suid将是ruid。

        2
  •  6
  •   tzot    16 年前

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

    有效uid通常与实际uid相同。只有在以下情况下才不同:

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

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

    保存的uid是进程启动时的有效uid,它被保存以允许作为各种set*uid系统调用的参数。

    请注意,具有超级用户权限的进程调用setuid(2)来更改其有效uid,也会将实际uid和保存的uid更改为相同的值,因此应改用非posix seteuid(2)。

    以上所有内容也适用于(实际有效保存的)组ID。

        3
  •  4
  •   mpez0    16 年前

    除了真实、有效和保存的uid之外,启用审计的UNIX系统还具有审计uid。进程的AUID标识启动该进程的用户;它不会被setuid(2)或seteuid(2)更改。其目的是在整个过程中保持不变,并且仅用于标记审计记录。因此,如果用户执行特权shell(甚至是通过su或sudo获得授权的用户),那么该进程的审计记录将从该用户标记。

        4
  •  1
  •   djikay    11 年前

    每个Linux进程都有3个与其关联的uid。

    • 真正的UID :创建此进程的进程的uid。
    • 有效的UID :用于评估进程执行特定操作的权限。
    • 保存的UID :对于二进制图像文件, setuid 咬一口。
        5
  •  0
  •   Bojack    9 年前

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

    函数的作用是:设置真实有效的用户ID和 已保存集用户ID 当前进程达到指定值。如果 有效用户ID是超级用户的ID,或者如果指定的用户ID与 有效的用户ID。如果不是,但指定的用户ID与实际用户相同 id,setuid()将有效用户id设置为实际用户id。