我已经知道真实的用户ID了。它是系统中用户的唯一编号。
在我的系统中,我uid
是
$ echo $UID
1014
$
其他两个ID代表什么?
什么是使用的有效用户ID和保存的用户ID和在这里我们使用它的系统呢?
我已经知道真实的用户ID了。它是系统中用户的唯一编号。
在我的系统中,我uid
是
$ echo $UID
1014
$
其他两个ID代表什么?
什么是使用的有效用户ID和保存的用户ID和在这里我们使用它的系统呢?
Answers:
区分真实用户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的用途。
access
。占总数的99.9%。另外setfsuid
(但很少需要)和一些非常底层的功能,并且您需要(但不检查)用于获取/设置优先级或调度程序的真实用户ID,以及传递给信号处理程序或由wait
et al 返回的ID 。是真实的ID。execve
不会检查,但是如果您更改了真实用户ID ,则可能失败。也fork
不会检查,但是如果您达到实际UID上的最大进程配额,则可能会失败。Google with site:man7.org
是您的朋友在这里。
ping
需要一个原始套接字。任何用户都可以(通常)打开套接字,和用于监听,1024以上
我将尝试通过一些示例逐步解释。
背景短
每个进程具有其自己的“处理凭证”,它包括像属性PID
的PPID
,PGID
,session ID
和也是真实有效的用户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,以及其他详细信息,例如我登录的外壳。
第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
)。
(*)选中其他选项以查看UID和GID以及在中以单行代码获取此ID的方法。
现在,请接受EUID
and 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。
这是EUID
和EGID
用武之地。
将会发生什么情况,当执行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
并切换回特权帐户。