真实用户ID、有效用户ID、保存用户ID的区别

2024-10-29 08:35:00
admin
原创
481
摘要:问题描述:我已经知道了真实的用户 ID。它是系统中用户的唯一编号。在我的系统上,我的uid是$ echo $UID 1014 $ 另外两个 ID 代表什么?那么有效用户ID和已保存的用户ID有什么用处以及我们在系统中的什么地方使用它们?解决方案 1:之所以区分真实用户 ID 和有效用户 ID,是因为您可能需要...

问题描述:

我已经知道了真实的用户 ID。它是系统中用户的唯一编号。

在我的系统上,我的uid

$ echo $UID
1014
$

另外两个 ID 代表什么?

那么有效用户ID已保存的用户ID有什么用处以及我们在系统中的什么地方使用它们?


解决方案 1:

之所以区分真实用户 ID 和有效用户 ID,是因为您可能需要暂时使用其他用户的身份(大多数情况下是 ,root但也可以是任何用户)。如果您只有一个用户 ID,那么之后就无法更改回您的原始用户 ID(除非您相信您的承诺,如果您是root,则可以使用root的权限更改为任何用户)。

所以,真实用户 ID 就是您的真实身份(拥有该进程的人),而有效用户 ID 是操作系统用来决定是否允许您执行某项操作的(大多数情况下,也有一些例外)。

当您登录时,登录 shell 会将真实用户 ID 和有效用户 ID 设置为与密码文件提供的相同的值(您的真实用户 ID)。

现在,您还会执行 setuid 程序,除了以另一个用户身份运行(例如root),setuid 程序应该代表您执行某些操作。这是如何工作的?

执行 setuid 程序后,它将具有您的真实 ID(因为您是进程所有者)和文件所有者的有效用户 ID(例如root),因为它是 setuid。

该程序利用超级用户权限执行所需的任何魔法,然后想要代表您执行某些操作。这意味着,尝试执行您不应该执行的操作应该会失败。它是如何做到这一点的?嗯,显然是通过将其有效用户 ID 更改为真实用户 ID!

现在 setuid 程序没有办法切换回来,因为内核只知道你的 id 和...你的 id。砰,你死定了。

这就是保存的设置用户 ID 的用途。

解决方案 2:

我将尝试通过一些例子逐步解释。

简短背景

每个进程都有自己的“进程凭证”,其中包括、、等属性,以及PID真实PPID有效PGIDsession ID用户和组 ID:
RUID、、、。EUID`RGID`EGID

我们将重点关注这些。

第 1 部分:了解 UID 和 GID

现在我将使用我的凭据登录到 shell 并运行:

$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash

您可以看到我的登录名 (rotem)、UIDGID(均为 1000)以及其他详细信息(例如我登录的 shell)。

第 2 部分:了解 RUID 和 RGID

每个进程都有一个所有者并属于一个组。在我们的 shell 中,我们现在运行的每个进程都将继承我的用户帐户的权限,并以相同的 UID 和 GID 运行。

让我们运行一个简单的命令来检查它:

$ sleep 10 & ps aux | grep 'sleep'

并检查进程 UID 和 GID:

$ stat -c "%u %g" /proc/$pid/
1000 1000

这些是进程的真实 用户IDRUID)和真实组IDRGID)。

(*)检查其他选项以查看 UID 和 GID以及如何在一行中获取这些信息。

现在,接受这个事实:EUID和属性是“多余的”,并且只是在后台EGID等于RUID和。RGID

第 3 部分:了解 EUID 和 EGID

我们以该ping命令为例。

使用命令搜索二进制位置which然后运行ls -la

-rwsr-xr-x  1 root root   64424 Mar 10  2017  ping

您可以看到文件的所有者和组是root。这是因为该ping命令需要打开一个特殊的套接字,而 Linux 内核需要root特权才能做到这一点。

ping但如果我没有权限该如何使用root

请注意文件权限的所有者部分中的“s”字母而不是“x”。

ping这是针对特定二进制可执行文件(如和)的特殊权限位,sudo称为setuid

这就是EUIDEGID发挥作用的地方。

当执行类似的setuid二进制文件时ping该进程会将其有效用户 ID ( EUID) 从默认值更改RUID为这个特殊二进制可执行文件的所有者,在本例中为 -root

这一切都是通过这个文件有位这一简单事实来实现的setuid

EUID内核通过查看进程的来决定此进程是否具有权限。由于现在EUID指向root,因此内核不会拒绝该操作。

注意:在最新的 Linux 版本中,命令的输出ping看起来会有所不同,因为它们采用了Linux 功能方法而不是这种setuid方法 - 对于不熟悉的人,请阅读此处。

第 4 部分:SUID 和 SGID 怎么样?

SUID当特权进程正在运行(例如root)并且需要执行一些非特权任务时,将使用已保存的用户 ID( )。

这样的话,之前的有效UID(EUID)会保存在里面SUID,然后切换到非特权任务,当非特权任务完成后,会EUID从 的值中取出SUID,然后切换回特权账户。

解决方案 3:

我的理解是这样的。用户执行的文件(相当于启动一个进程)将具有与该用户 ID 相等的 RUID。这里要注意的重要一点是,创建文件的 uid 与执行文件的 uid 不同。它们可以相同或不同。因此,RUID 可能因执行文件的 UID 而异。当文件上有 setuid 位时,每当 uid 执行该文件时,该 uid 将暂时替换为文件所有者的 uid。因此,如果我们有一个由 uid 456 拥有的文件,并且该文件上有 setuid 位,每当 uid 123 执行该文件时,该文件将以 uid 456 执行。在这种情况下,uid 123 是 RUID,uid 456 是 EUID。

解决方案 4:

真实用户 ID 是生成该进程的用户。

有效用户 ID 是由正在执行的二进制文件上的 setuid 位确定的用户。

这里有一些关于 uids 和 euids 的事实,以及每个事实的手册来源:

当你以 root 身份生成并且需要暂时放弃权限之后仍然能够重新获得 root 权限时,你可以使用 euid,如 man setuid(2) 所示:

Thus, a set-user-ID-root program wishing to temporarily drop root privileges, as‐
sume the identity of an unprivileged user, and then regain root privileges after‐
ward cannot use setuid().  You can accomplish this with seteuid(2).

您还可以使用它从 setuid 程序提升您的权限。如果您的有效用户 ID 是 root,则所有操作都会像您是 root 一样做出反应,但我认为唯一的例外是文件访问检查将检查您的真实用户 ID 而不是有效用户 ID,这很容易造成混淆,如 man access(2) 中所示:

The check is done using the calling process's real UID and GID,  rather
than the effective IDs as is done when actually attempting an operation
(e.g., open(2)) on the file.  Similarly, for the root user,  the  check
uses the set of permitted capabilities rather than the set of effective
capabilities; and for non-root users, the check uses an  empty  set  of
capabilities.

当调用 bash 时,它不会传播 euid,除非你-p像在 man bash(1) 中那样传递:

If the shell is started with the effective user (group) id not equal to the  real
user  (group)  id,  and the -p option is not supplied, no startup files are read,
shell functions are not inherited from the environment, the SHELLOPTS,  BASHOPTS,
CDPATH, and GLOBIGNORE variables, if they appear in the environment, are ignored,
and the effective user id is set to the real user id.  If the -p option  is  sup‐
plied  at invocation, the startup behavior is the same, but the effective user id
is not reset.

使用 sudo 时,有效用户 ID 和真实用户 ID 均按 man sudo(8) 进行设置:

When sudo executes a command, the security policy specifies the execution environ‐
ment for the command.  Typically, the real and effective user and group and IDs are
set to match those of the target user, as specified in the password database, and
the group vector is initialized based on the group database (unless the -P option
was specified).

解决方案 5:

@Rotem jackoby 的回答很好。作为后续,您可以查看我对这篇文章的回答。它包含一个您可以运行的示例 C 程序,以便亲眼看看 Linux 中进程的真实用户 ID (RUID)、有效用户 ID (EUID) 和已保存用户 ID (SUID) 之间的区别。

这里我只想指出,所有类 Unix 系统(当然也包括 Linux)的官方文档The Open Group Base Specifications Issue 7, 2018 版(请参阅此处的“3. 定义” )指出,RUID、EUID 和 SUID 的概念适用于“当用户身份与进程相关联时” (请参阅​​此处的3.436 用户 ID )。换句话说,如果用户没有启动或生成任何进程,那么谈论 RUID、EUID 或 SUID 是没有意义的,只能谈论用户 ID(UID),仅此而已。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2079  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1459  
  建筑行业正处于数字化转型的关键时期,建筑产品生命周期管理(PLM)系统的实施对于提升项目效率、质量和协同性至关重要。特别是在 2025 年,基于建筑信息模型(BIM)的项目进度优化工具成为众多建筑企业关注的焦点。这些工具不仅能够整合项目全生命周期的数据,还能通过精准的分析和模拟,为项目进度管理提供强大支持。BIM 与建...
plm是什么软件   0  
  PLM系统开发的重要性与现状PLM(产品生命周期管理)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它贯穿产品从概念设计到退役的整个生命周期,整合了产品数据、流程以及人员等多方面的资源,极大地提高了企业的协同效率和创新能力。通过PLM系统,企业能够实现产品信息的集中管理与共享,不同部门之间可以实时获取...
国产plm软件   0  
  PLM(产品生命周期管理)系统在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和技术的飞速发展,企业对PLM系统的迭代周期优化需求日益迫切。2025年敏捷认证对项目管理提出了新的要求,其中燃尽图作为一种强大的可视化工具,在PLM系统迭代周期优化中有着广泛且重要的应用。深入探讨这些应用,对于提升企业的项...
plm系统主要干什么的   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用