AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 471291
Accepted
Tran Triet
Tran Triet
Asked: 2018-09-26 02:44:54 +0800 CST2018-09-26 02:44:54 +0800 CST 2018-09-26 02:44:54 +0800 CST

为什么我们需要 SUID 权限?[关闭]

  • 772
关闭。这个问题是题外话。它目前不接受答案。

这个问题似乎与帮助中心定义的范围内的 Unix 或 Linux 无关。

4年前关闭。

改进这个问题

请阅读这篇长篇介绍以了解我对为什么我们需要可执行二进制文件的 SUID 权限的担忧。

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

考虑通过更改密码的场景/usr/bin/passwd

现实生活中的 Linux

  • 密码存储在/etc/shadow. 此文件root拥有权限 ( rw-------)
  • 如果 $passwd有权限rwx--x--x,这意味着只有root才能改变passwd程序的逻辑。
  • userA运行程序时,一个进程passwd以RUID = EUID = userA开始

结果是:程序将运行。passwd 进程已启动,但无法更改密码,因为其EUID为userA且userA无法写入/etc/shadow.

这是需要 SUID 权限的时候。SUID允许在执行二进制文件以创建该进程时设置进程的EUID 。EUID将设置为该二进制文件的所有者。

  • 为所有者设置SUID 权限/usr/bin/passwd使任何用户启动的任何进程的EUID都采用EUIDpasswd root
  • 由于root可以写入/etc/shadow,任何用户都可以使用该passwd程序启动一个可以更改的passwd 进程/etc/shadow

有SUID 权限,因为在 Linux 中,进程的EUID不会硬设置为可执行二进制文件的所有者(运行时将创建该进程)

我理想中的 Linux

无需SUID 权限。如果可执行文件binA由userA创建(并拥有) ,则任何可以执行binA的用户都将创建一个EUID = userA的进程。

在修改密码的场景下,这个思路的逻辑如下:

  • root是所有者,/usr/bin/passwd只有root可以更改其逻辑。
  • 里面的逻辑/usr/bin/passwd只允许用户更改其密码,而不能更改其他人的密码。
  • 其他用户不能修改/usr/bin/passwd,只有root可以。
  • /etc/shadow只能由root

结果是:非特权用户userA可以执行$passwd. 他会创建一个passwd 流程。此进程具有EUID = root,因此它可以写入shadow文件。

有了这个理论,我们可以实现:每个人都可以在没有SUID 权限的情况下更改自己的密码(并且只能更改自己的密码)。

permissions setuid
  • 2 2 个回答
  • 2391 Views

2 个回答

  • Voted
  1. Best Answer
    sebasth
    2018-09-26T03:39:56+08:002018-09-26T03:39:56+08:00

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

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

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

    • 3
  2. Tran Triet
    2018-09-26T05:46:35+08:002018-09-26T05:46:35+08:00

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

    1. 在 Linux 中,可执行的 bin 文件应该由不同的用户运行。

      例如,/usr/bin/nano是一个文本编辑器的 bin,这个相同的可执行 bin 文件可以由不同的用户执行是有道理的(为什么要将相同的 bin 文件复制到每个用户的主文件系统?)

    2. 尽管许多用户应该能够使用同一个 bin 文件,但由该 bin 文件启动的进程应该对文件具有不同的权限。

      比如userA和userB应该都可以通过执行同一个bin 文件来创建两个 nano进程。/usr/bin/nano但是,userA的 nano进程应该允许userA修改他自己的文件,并且只能修改他自己的文件,反之亦然。

    这需要一种机制,通过该机制,进程应将启动该进程的用户对该文件的相同权限应用于该文件(而不是拥有可执行 bin 文件的用户的权限,该可执行文件为创建进程而执行) .

    在 Linux 中,每个进程都有RUID。RUID是启动该进程的用户的 ID 。按照这个逻辑,进程的RUID应该是该进程使用文件权限的用户(例如,进程根据其RUID用户可以对该文件执行的操作来决定它可以对该文件执行什么操作)。

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

    1. /etc/shadow文件不能被除root之外的任何人修改。
    2. 任何用户想要更改密码都需要通过执行/usr/bin/passwd可执行的 bin 文件来完成。该程序的逻辑确保低权限用户只能更改他的密码。
    3. 由于只有 root 可以写入此 bin 文件,因此除 root 之外的任何用户都无法更改此逻辑。
    4. 如果userA执行/usr/bin/passwd,他将启动一个RUID为userA的passwd 进程。
    5. 但是,由于userA不允许写入/etc/shadow,所以他启动的passwd 进程也无法写入该文件。

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

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

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

    • 3

相关问题

  • 组权限如何工作?

  • Redis日志文件权限错误,但是权限已经是777

  • 以 root 权限启动 zypper 命令

  • 以非特权用户身份运行时,meld 无法访问 /dev/fd/* 的可能原因是什么?

  • 另一个用户的非空子目录是否可以安全地从我的目录中删除?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve