请阅读这个长介绍,以了解我的关切,为什么我们需要SUID许可的可执行二进制文件。
考虑通过/usr/bin/passwd
更改密码的场景
Real Linux
/etc/shadow
中。此文件属于具有权限的root
(rw-------
)$passwd
具有rwx--x--x
权限,这意味着只有根可以更改passwd程序的逻辑。userA
运行程序时,passwd
进程以RUID = EUID = userA开始结果是:程序将运行。passwd
进程已经启动,但它无法更改密码,因为它的<>EUID是userA,userA不能写入/etc/shadow
。
这是the需要SUID权限的时候。SUID允许在执行二进制文件时设置<>EUID来创建该进程。<>EUID将被设置为该二进制文件的所有者。
/usr/bin/passwd
权限使任何用户启动的任何passwd
<>EUID都使用root
的EUIDroot
可以写入/etc/shadow
,任何用户都可以使用passwd
程序启动passwd
进程,该进程可以对/etc/shadow
进行更改存在SUID权限,因为在Linux中,进程的EUID并不难设置为可执行二进制文件的所有者(运行时将创建该进程)。
My理想Linux
不需要SUID权限。如果可执行文件binA是由userA创建(并拥有)的,任何能够执行binA的用户都将创建一个<>进程和<>EUID= userA。
在更改密码的场景中,这种想法的逻辑如下:
/usr/bin/passwd
的所有者,只有root才能更改其逻辑。/usr/bin/passwd
内部的逻辑只允许用户更改密码,而不允许其他用户更改密码。/usr/bin/passwd
,只有root用户才能修改。/etc/shadow
只能由root
写结果是:非特权用户userA
可以执行$passwd
。他将创建一个passwd
进程。该进程具有EUID = root,因此它可以写入shadow
文件。
有了这个理论,我们就可以实现:没有SUID许可,每个人都可以更改自己的密码(并且只能更改自己的密码)。
发布于 2018-09-25 11:39:56
这两个例子都解释了setuid是如何工作的。但是,在您的“理想Linux”中,每个可执行文件都将以可执行文件所有者的EUID开头,这将使系统上的每个可执行文件都成为setuid可执行文件。
这显然会导致许多问题,举几个例子:每个根拥有的可执行文件都需要进行UID检查,并调用setuid()
来将进程的EUID设置为非根程序,如果程序不应该有任何额外的特权;用户不能将可执行文件提供给其他用户,因为进程将以错误的EUID运行;配置错误和不良做法将产生严重的后果(例如,chmod 777
现在也允许访问用户拥有的任何文件)。这些是更多的。
没有setuid二进制文件的普通权限需要一些其他机制来允许非特权用户执行特权操作。Setuid二进制文件允许这样的特权提升,访问控制是在程序逻辑中实现的。
发布于 2018-09-25 13:46:35
标记的答案完美地回答了我的问题。我在这里提出的是一个额外的逻辑,它有助于解释关于更改密码场景的SUID权限的存在。
/usr/bin/nano
是文本编辑器的bin,这个相同的可执行bin文件可以由不同的用户执行(为什么要将相同的bin文件复制到每个用户的主文件系统?)/usr/bin/nano
bin文件来创建两个nano processes。但是,userA的nano 过程应该允许修改自己的文件,而且只能修改自己的文件,反之亦然。这就需要一种机制,通过这种机制,<#>进程应该将启动该进程的用户对该文件的same权限应用于该文件(拥有可执行bin文件的用户的权限为创建进程而执行的权限的instead)。
在Linux中,每个进程都有<#>RUID。RUID是启动该进程的用户的id。根据这种逻辑,进程的RUID应该是该进程使用其对文件的权限的用户(例如,一个进程根据它的<>RUID用户可以对该文件做什么来决定它可以对该文件做什么)。
但是,在更改密码的情况下,仅使用RUID是不够的,因为:
/etc/shadow
文件。/usr/bin/passwd
可执行bin文件来做到这一点。这个程序的逻辑确保一个弱势用户可以更改他的密码,而且只有他的密码。/usr/bin/passwd
,他将启动一个passwd
进程,其RUID为userA。/etc/shadow
,所以开始的passwd
进程也不能写入该文件。这就需要一种机制,通过这种机制,<#>进程根据另一个用户对该文件的权限(启动进程的用户的权限的instead)来决定其对该文件的权限。
在Linux中,进程对文件的权限来自<>EUID对该文件的权限。
对于EUID,根用户现在可以使用SUID权限来允许userA启动一个passwd
进程,该进程的<>EUID设置为root。这有效地允许passwd
进程由userA启动,以修改/etc/shadow
文件。
https://unix.stackexchange.com/questions/471291
复制相似问题