首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我们需要SUID许可?

为什么我们需要SUID许可?
EN

Unix & Linux用户
提问于 2018-09-25 10:44:54
回答 2查看 2.7K关注 0票数 2

请阅读这个长介绍,以了解我的关切,为什么我们需要SUID许可的可执行二进制文件。

  • Linux中的进程使用其EUID来了解自身的有效用户ID。
  • 此用户的权限用于决定此进程如何与其他文件(例如。此进程是否可以写入文件)

考虑通过/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将被设置为该二进制文件的所有者。

  • SUID所有者设置/usr/bin/passwd权限使任何用户启动的任何passwd <>EUID都使用rootEUID
  • 由于root可以写入/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许可,每个人都可以更改自己的密码(并且只能更改自己的密码)。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-09-25 11:39:56

这两个例子都解释了setuid是如何工作的。但是,在您的“理想Linux”中,每个可执行文件都将以可执行文件所有者的EUID开头,这将使系统上的每个可执行文件都成为setuid可执行文件。

这显然会导致许多问题,举几个例子:每个根拥有的可执行文件都需要进行UID检查,并调用setuid()来将进程的EUID设置为非根程序,如果程序不应该有任何额外的特权;用户不能将可执行文件提供给其他用户,因为进程将以错误的EUID运行;配置错误和不良做法将产生严重的后果(例如,chmod 777现在也允许访问用户拥有的任何文件)。这些是更多的。

没有setuid二进制文件的普通权限需要一些其他机制来允许非特权用户执行特权操作。Setuid二进制文件允许这样的特权提升,访问控制是在程序逻辑中实现的。

票数 3
EN

Unix & Linux用户

发布于 2018-09-25 13:46:35

标记的答案完美地回答了我的问题。我在这里提出的是一个额外的逻辑,它有助于解释关于更改密码场景的SUID权限的存在。

  1. 在Linux中,可执行的bin文件应该由不同的用户运行。例如,/usr/bin/nano是文本编辑器的bin,这个相同的可执行bin文件可以由不同的用户执行(为什么要将相同的bin文件复制到每个用户的主文件系统?)
  2. 尽管许多用户应该能够使用同一个bin文件,但由该bin文件启动的进程应该对一个文件具有不同的权限。例如,userA和userB都应该能够通过执行相同的/usr/bin/nano bin文件来创建两个nano processes。但是,userA的nano 过程应该允许修改自己的文件,而且只能修改自己的文件,反之亦然。

这就需要一种机制,通过这种机制,<#>进程应该将启动该进程的用户对该文件的same权限应用于该文件(拥有可执行bin文件的用户的权限为创建进程而执行的权限的instead)。

在Linux中,每个进程都有<#>RUIDRUID是启动该进程的用户的id。根据这种逻辑,进程的RUID应该是该进程使用其对文件的权限的用户(例如,一个进程根据它的<>RUID用户可以对该文件做什么来决定它可以对该文件做什么)。

但是,在更改密码的情况下,仅使用RUID是不够的,因为:

  1. 除了根文件,任何人都不能修改/etc/shadow文件。
  2. 任何想要更改密码的用户都需要通过执行/usr/bin/passwd可执行bin文件来做到这一点。这个程序的逻辑确保一个弱势用户可以更改他的密码,而且只有他的密码。
  3. 除了root之外,没有任何用户可以更改此逻辑,因为只有root才能写入此bin文件。
  4. 如果userA执行/usr/bin/passwd,他将启动一个passwd 进程,其RUID为userA。
  5. 但是,由于不允许userA写入/etc/shadow,所以开始的passwd 进程也不能写入该文件。

这就需要一种机制,通过这种机制,<#>进程根据另一个用户对该文件的权限(启动进程的用户的权限的instead)来决定其对该文件的权限。

在Linux中,进程对文件的权限来自<>EUID对该文件的权限。

对于EUID,根用户现在可以使用SUID权限来允许userA启动一个passwd 进程,该进程的<>EUID设置为root。这有效地允许passwd 进程由userA启动,以修改/etc/shadow文件。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/471291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档