请阅读这篇长篇介绍,了解我对为什么我们需要可执行二进制文件的 SUID 权限的担忧。
- Linux 中的进程使用其 EUID 来了解有效用户ID其本身。
- 该用户的权限用于决定该进程如何与其他文件交互(例如该进程是否可以写入文件)
考虑通过以下方式更改密码的场景/usr/bin/passwd
现实生活中的Linux
- 密码存储在
/etc/shadow
.该文件属于root
具有权限 (rw-------
) - 如果
$passwd
有权限rwx--x--x
,这意味着只有root可以更改逻辑密码程序。 - 当
userA
运行程序时,一个passwd
进程开始于鲁伊德=欧盟用户识别码= 用户A
结果是:程序将运行。 Apasswd
过程已启动,但无法更改密码,因为它欧盟用户识别码是用户A和用户A无法写入/etc/shadow
.
这是当需要SUID权限到达。苏伊德允许设置欧盟用户识别码执行二进制文件以创建该进程时的进程。这欧盟用户识别码将被设置为该二进制文件的所有者。
- 环境SUID权限
/usr/bin/passwd
对于品牌所有者欧盟用户识别码任何的passwd
过程由任何用户启动欧盟用户识别码的root
- 由于
root
可以写入/etc/shadow
,任何用户都可以使用该passwd
程序启动passwd
过程这可以改变/etc/shadow
有SUID权限因为在Linux中,欧盟用户识别码进程的所有者不会被硬设置为可执行二进制文件的所有者(运行时将创建该进程)
我理想中的Linux
不需要SUID权限。如果是可执行文件宾A由以下人员创建(并拥有)用户A, 任何可以执行的用户宾A将创建一个过程和欧盟用户识别码=用户A。
在修改密码的场景下,这个思路的逻辑如下:
- 根
/usr/bin/passwd
是且唯一的所有者根可以改变它的逻辑。 - 内部逻辑
/usr/bin/passwd
允许用户仅更改其密码,而不能更改其他人的密码。 - 其他用户无法修改
/usr/bin/passwd
,只能根能。 /etc/shadow
只能写入root
结果是:非特权用户userA
可以执行$passwd
.他将创建一个passwd
过程。这个过程有欧盟用户识别码=根所以它可以写入shadow
文件。
有了这个理论,我们就可以实现:每个人都可以更改自己的密码(并且只能更改自己的密码),而无需SUID权限。
答案1
您的两个示例都解释了 setuid 的工作原理。然而,在“理想的 Linux”中,每个可执行文件都以可执行文件所有者的 EUID 开头,这将使系统上的每个可执行文件成为 setuid 可执行文件。
这显然会导致很多问题,仅举几例:每个 root 拥有的可执行文件都需要执行 UID 检查,并调用setuid()
将进程的 EUID 设置回非 root(如果程序不应该具有任何其他权限);用户无法向其他用户提供可执行文件,因为该进程将使用错误的 EUID 运行;配置错误和不良做法将产生严重后果(例如chmod 777
现在还允许访问用户拥有的任何文件)。而且这些还更多。
没有 setuid 二进制文件的普通权限需要一些其他机制来允许非特权用户执行特权操作。 Setuid 二进制文件允许此类特权提升,并且访问控制是在程序逻辑中实现的。
答案2
标记的答案完美地回答了我的问题。我放在这里的是额外的逻辑,有助于我解释SUID权限关于更改密码的场景。
在Linux中,可执行的bin文件应该由不同的用户运行。
例如,
/usr/bin/nano
它是文本编辑器的 bin,因此相同的可执行 bin 文件可以由不同的用户执行是有意义的(为什么要将相同的 bin 文件复制到每个用户的主文件系统?)尽管许多用户应该能够使用相同的 bin 文件,但由该 bin 文件启动的进程应该对文件具有不同的权限。
例如,用户A和用户B应该都能够创建两个纳米过程es 通过执行相同的
/usr/bin/nano
bin 文件。然而,用户A的纳米过程应该允许用户A修改他自己的文件并且仅修改他自己的文件,反之亦然。
这就需要一种机制,通过该机制过程应应用与启动该进程的用户具有相同的权限有一个文件到该文件(而不是拥有可执行bin文件的用户的权限这是为了创建进程而执行的)。
在Linux中,每个进程都有鲁伊德。这鲁伊德是启动该进程的用户的 ID。按照这个逻辑,鲁伊德进程的用户应该是该进程使用其对文件的权限的用户(例如,进程根据其文件的内容来决定它可以对文件执行什么操作)鲁伊德用户可以对该文件执行操作)。
但是,在更改密码的情况下,鲁伊德单独是不够的,因为:
/etc/shadow
文件不能被任何人修改,除了根。- 任何用户想要更改密码都需要通过执行
/usr/bin/passwd
可执行的 bin 文件来完成。该程序的逻辑确保低权限用户可以更改他且只能更改他的密码。 - 除 root 之外的任何用户都无法更改此逻辑,因为只有 root 可以写入此 bin 文件。
- 如果用户A执行时
/usr/bin/passwd
,他将启动一个passwd
过程谁的鲁伊德是用户A。 - 然而,自从用户A不允许写入
/etc/shadow
,passwd
过程他开始也无法写入该文件。
这就需要一种机制,通过该机制过程根据另一个用户对该文件的权限来决定其对该文件的权限(而不是启动进程的用户的权限)。
在Linux中,进程对文件的权限取自文件的权限欧盟用户识别码那个文件上有。
和欧盟用户识别码,根现在可以使用SUID权限允许用户A开始一个passwd
过程具有欧盟用户识别码设置根。这有效地允许passwd
过程开始于用户A修改/etc/shadow
文件。