Unix / Linux:真实用户ID,有效用户ID和已保存用户ID之间的差异


102

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

在我的系统中,我uid

$ echo $UID
1014
$                 

其他两个ID代表什么?
什么是使用的有效用户ID保存的用户ID和在这里我们使用它的系统呢?


仅供参考-维基百科页面上也概述了文件系统用户ID:en.wikipedia.org/wiki/User_identifier
Willem van Ketwich,2016年

我认为他没有提及它,是因为(从您的Wiki链接):“自内核2.0起,不再需要fsuid的存在,因为Linux遵循用于发送信号的SUSv3规则,但出于兼容性原因而保留了fsuid。”
RtmY

Answers:


147

区分真实用户ID和有效用户ID是因为您可能需要临时获取另一个用户的身份(大多数情况下,它是root,但可以是任何用户)。如果您只有一个用户ID,则此后将无法再更改回原始用户ID(除非理所当然,否则root,您可以使用root的特权更改为任何用户)。

因此,真实的用户ID是您的真实身份(拥有该进程的人),有效的用户ID是操作系统用来决定是否允许您做某事的决定(大多数情况下) ,有一些例外)。

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

现在,您还执行了setuid程序,并且除了以另一个用户(例如root)的身份运行之外,setuid程序应该代表您执行某些操作。这是如何运作的?
执行setuid程序后,由于它是setuid,它将具有您的真实ID(因为您是进程所有者)和文件所有者的有效用户ID(例如root)。

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

现在该setuid程序无法切换回去,因为所有内核都知道您的id和... 您的id。邦,你死了。

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


6
有关最后一点有关保存设置的用户ID的更多信息,请参阅Wikipedia。
GDP2

您能指出一些我可以找到哪个系统调用检查Real uid的读数吗?谢谢
mik1904

1
@ mik1904:您可能会使用的最重要的一个真正检查真实UID的是access。占总数的99.9%。另外setfsuid(但很少需要)和一些非常底层的功能,并且您需要(但不检查)用于获取/设置优先级或调度程序的真实用户ID,以及传递给信号处理程序或由waitet al 返回的ID 。真实的ID。execve不会检查,但是如果您更改了真实用户ID ,则可能失败。也fork不会检查,但是如果您达到实际UID上的最大进程配额,则可能会失败。Google with site:man7.org是您的朋友在这里。
达蒙

“ ping命令需要打开一个套接字,Linux内核为此需要root特权。” 这不是很准确。 ping需要一个原始套接字。任何用户都可以(通常)打开套接字,和用于监听,1024以上
丹尼尔法雷尔

35

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

背景短

每个进程具有其自己的“处理凭证”,它包括像属性PIDPPIDPGIDsession ID和也是真实有效的用户ID和组ID: , RUIDEUID,。RGIDEGID

我们将专注于这些。


第1部分:了解UID和GID

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

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

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


第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以及在中以单行代码获取此ID的方法

现在,请接受EUIDand 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”。
这是特定二进制可执行文件(如pingsudo)的特殊权限位,称为setuid

这是EUIDEGID用武之地。
将会发生什么情况,当执行setuid二进制文件之类的过程时ping该进程会将其有效用户ID(EUID)从默认值RUID更改为该特殊二进制可执行文件的所有者,本例中为-root
这完全是由该文件具有setuid位这一简单事实完成的。

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

注意:在最新的Linux发行版上,该ping命令的输出看起来会有所不同,因为它们采用Linux Capabilities方法而不是setuid方法(对于那些不熟悉的人),请在此处阅读。

第4部分:SUID和SGID呢?

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

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



1
除SUID的最后一段外,明确的答案。被特权任务和特权任务弄糊涂了。如果提供示例,则很有用。谢谢。
Upendra

2
非常精确的答案。谢谢!!
user37416
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.