我已经知道真正的用户ID。它是系统中用户的唯一编号。在我的系统中,My uid是
$ echo $UID
1014
$
另外两个ID代表什么?什么是有效用户ID和保存的用户ID的使用以及我们在系统中使用它的位置。
答案 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)
我将尝试通过一些示例逐步解释。
背景短
每个进程都有自己的“进程凭证”,其中包括PID
,PPID
,PGID
,session ID
之类的属性,以及真实有效的用户和组ID :
RUID
,EUID
,RGID
,EGID
。
我们将专注于这些。
第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 GID和ways to get this in one-liner in。
现在,请接受以下事实: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
?
请注意,文件许可权的所有者部分中的的字母而不是“ x”。
这是特定二进制可执行文件(例如ping
和sudo
)的特殊权限位,称为 setuid 。
这是EUID
和EGID
发挥作用的地方。
当执行诸如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 是欧盟身份证。