真实用户ID,有效用户ID和保存的用户ID之间的区别

时间:2015-09-08 10:43:54

标签: linux unix posix

我已经知道真正的用户ID。它是系统中用户的唯一编号。在我的系统中,My uid是

$ echo $UID
1014
$                 

另外两个ID代表什么?什么是有效用户ID和保存的用户ID的使用以及我们在系统中使用它的位置。

3 个答案:

答案 0 :(得分:118)

真实用户ID和有效用户ID之间的区别是因为您可能需要暂时使用其他用户的身份(大多数情况下,这将是root,但它可能是任何用户)。如果您只有一个用户ID,则之后无法更改回原始用户ID(除了将您的观点视为理所当然,如果您是root,请使用root& #39;更改为任何用户的权限。)

因此,真正的用户ID是您真正的用户(拥有该进程的用户),并且有效的用户ID是操作系统查看的内容,以决定是否允许您执行某些操作(大多数情况下)当时,有一些例外)。

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

现在,您还执行了一个setuid程序,除了作为另一个用户(例如root)运行之外,setuid程序应该代表您做某事。这是如何工作的?
执行setuid程序后,它将具有您的真实ID(因为您是流程所有者)和文件所有者的有效用户ID(例如root),因为它是setuid。

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

现在setuid程序无法切换回来,因为所有内核都知道你的id和... 你的id 。砰,你已经死了。

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

答案 1 :(得分:12)

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

背景短

每个进程都有自己的“进程凭证”,其中包括PIDPPIDPGIDsession ID之类的属性,以及真实有效的用户和组ID : RUIDEUIDRGIDEGID

我们将专注于这些。


第1部分-了解UID和GID

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

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

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


第2部分-了解RUID和RGID

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

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

$ sleep 10 & ps aux | grep 'sleep'

并检查进程UID和GID:

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

这些是真实 用户ID RUID)和真实组ID RGID过程

(*)选中other options to view the UID and GIDways to get this in one-liner in

现在,请接受以下事实:EUIDEGID属性是“冗余”的,并且在幕后等于RUIDRGID


第3部分-了解EUID和EGID

到目前为止,这一直很简单。现在我们需要付出更多的努力才能理解。

让我们以ping命令为例。

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

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

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

但是,如果我没有ping特权,该如何使用root
请注意,文件许可权的所有者部分中的字母而不是“ x”。
这是特定二进制可执行文件(例如pingsudo)的特殊权限位,称为 setuid

这是EUIDEGID发挥作用的地方。
当执行诸如ping之类的 setuid 二进制文件时,会发生什么情况,该过程将其有效用户ID(EUID)从默认的RUID更改为此特殊二进制可执行文件的所有者,在这种情况下为-root
这完全是通过简单的事实完成的,该文件具有setuid位。

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

通知:在最新的Linux发行版上,ping命令的输出看起来会有所不同,因为它们采用了Linux Capabilities方法而不是此 setuid 方法-对于不熟悉的人-阅读here

第4部分-SUID和SGID怎么办?

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

在这种情况下,之前的有效UID(EUID)将保存在SUID内,然后更改为非特权值。当非特权任务完成时 EUID将从SUID的值中提取并切换回特权帐户。


我希望已经足够清楚了。

答案 2 :(得分:1)

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