Gee*_*eek 14 command-line process setuid architecture privileges
有人可以解释 Unix 中的 set-user-ID 机制吗?这个设计决定背后的理由是什么?它与有效的用户 ID 机制有何不同?
mtk*_*mtk 11
您可能知道 unix 中文件的正常读、写和执行权限。
然而,在许多应用程序中,这种类型的权限结构——例如,给予给定用户读取给定文件的完全权限,或者根本没有读取文件的权限——太粗糙了。出于这个原因,Unix 包括另一个权限位,set-user-ID
位。如果为可执行文件设置了此位,那么每当所有者以外的用户执行该文件时,该用户将获得所有者的所有文件读/写/执行权限,以访问所有者的任何其他文件!
要为文件设置 set-user-ID 位,请键入
chmod u+s filename
Run Code Online (Sandbox Code Playgroud)
确保您也设置了 group-other 执行权限;拥有组其他读取权限也很好。所有这些都可以通过单个语句完成
chmod 4755 filename
Run Code Online (Sandbox Code Playgroud)
它也称为已保存的 UID。启动的文件具有设置 UID 位,保存的 UID 将是文件所有者的 UID。否则,保存的 UID 将是真正的 UID。
此 UID 用于评估进程执行特定操作的权限。EUID 可以更改为 Real UID,如果 EUID!=0,则可以更改为超级用户 UID。如果 EUID=0,则可以更改为任何内容。
这种程序的一个例子是passwd
. 如果您完整列出它,您将看到它具有 Set-UID 位并且所有者是“root”。当普通用户说“mtk”运行时passwd
,它以:
Real-UID = mtk
Effective-UID = mtk
Saved-UID = root
Run Code Online (Sandbox Code Playgroud)
man credentials
在这种情况下是一个很好的信息来源。另请参阅SO上的此问题。有关历史解释,请参阅此存档帖子。
与其将“设置 UID”和“有效 UID”称为一种机制,不如称其为 UID 的整个概念。存在各种 UID 的基本原理是特权分离的各种麻烦。即使是普通(非特权)用户有时也需要做只有特权用户才能做的事情(访问资源)。为了轻松实现这一点,程序可以更改其 UID。这些有3种类型:
真实 UID - 拥有进程的 UID
有效 UID - 进程当前运行的 UID - 这决定了进程在任何特定时刻的实际能力。这也是ps
在 USER 字段中显示的内容。
已保存的 UID - 占位符,用于在真实 UID 和有效 UID 之间来回切换
对最后一个的需求源于这样一个事实,即普通用户只能在这三个之间切换而没有别的,并且 setuid 程序通常需要以某种方式知道加载它的用户是谁(加上真正的 UID 不应更改,因为那会造成更大的混乱)。