`sudo` 要求哪个用户的密码?

Tim*_*Tim 11 setuid sudo executable

$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 136808 Jul  4  2017 /usr/bin/sudo
Run Code Online (Sandbox Code Playgroud)

sosudo可由任何用户运行,并且任何运行的用户都sudo将 root 作为进程的有效用户 ID,因为设置了 set-user-id 位/usr/bin/sudo

来自https://unix.stackexchange.com/a/11287/674

sudo 和 su 之间最明显的区别是sudo 需要用户的密码,而 su 需要 root 的密码。

  1. sudo要求提供哪个用户的密码?是进程的真实用户ID所代表的用户吗?

    如果是,没有任何用户可以通过运行sudo然后提供自己的密码来获得超级用户权限吗?Linux 可以限制某些用户吗?

  2. 它是纠正sudo输入密码请求 execve()开始执行main()/usr/bin/sudo

    既然进程的euid已经改成root了(因为设置了/usr/bin/sudo的set-user-id位),那么后面sudo要求密码有什么意义呢?

谢谢。

我已阅读https://unix.stackexchange.com/a/80350/674,但它没有回答上述问题。

Ste*_*itt 22

  1. 在其最常见的配置中,sudo要求输入运行 用户的密码sudo(如您所说,与进程的真实用户 ID 对应的用户)。重点sudo是向特定用户授予额外的权限(由 中的配置确定sudoers),而这些用户不必提供除他们自己之外的任何其他身份验证。但是,sudo 确实会检查正在运行的用户是否sudo真的是他们声称的人,并且通过询问他们的密码(或为其设置的任何身份验证机制sudo,通常使用 PAM - 所以这可能涉及指纹或两个因素身份验证等)。

    sudo不一定授予成为 root 的权利,它可以授予各种特权。任何被允许成为 root 的sudoers用户都可以只使用他们自己的身份验证;但是不允许的用户不能(至少,不能使用sudo)。这不是由 Linux 本身强制执行的,而是由sudo(及其身份验证设置)强制执行的。

  2. sudo开始运行后确实会要求输入密码;它不能做其他事情(开始运行之前不能做任何事情)。点sudo要求输入密码,即使它的根,是验证运行用户的身份(其典型配置)。


ilk*_*chu 12

sudo通常会询问运行它的用户的密码,尽管可以配置

与 不同su(1),当 sudoers需要身份验证时,它验证调用用户的凭据,而不是目标用户(或 root 用户)的凭据。这可以通过rootpw,targetpwrunaspw标志进行更改,稍后描述。

设置rootpwsudo始终是root的密码要求,targetpw要求用户的密码sudo将最终运行程序,并runaspw要求在用户设定的密码runas_default

sudo像这样设置的二进制文件确实可以由任何用户以 root 权限启动。假设sudo其身份验证代码没有任何错误,这本身并不重要。

有点类似,任何进程也可以在内核模式下执行代码,通过调用任何系统调用,比如open(). (这与作为 root 的用户空间代码不同。)不过,只要内核没有错误,它们就无法运行任意代码。


ImH*_*ere 8

从 的第一行开始man sudo

说明
sudo 允许允许的用户以超级用户或其他用户的身份执行命令,这由安全策略指定。调用用户的真实(无效)用户 ID 用于确定用于查询安全策略的用户名。

所以:

  1. 调用用户的真实(无效)用户 ID 用于...
  2. 是的,任何(允许的)用户都可以通过运行 sudo 然后提供所需的(配置的)身份验证来获得超级用户(或其他)额外权限。允许和配置都在 sudoers 文件中设置。

  3. Linux 可以限制某些用户吗?
    是的,它可以,但它没有。Linux 设置为允许 sudo 二进制文件根据 sudo 程序和文件内部的规则集(安全策略)做出决定/etc/sudoers。通常,可以使用其他文件(也/代替)。

来自man setresuid

说明
setresuid() 设置调用进程的真实用户 ID、有效用户 ID 和保存的 set-user-ID。

  1. 获得内核授予的超级用户权限的唯一方法是运行程序 suid。否则不能。这是 Linux 选择授予超级用户权限的方式。

  2. 内核加载了一个不能被任何其他用户修改的可执行文件(文件和目录由 root 拥有并且只能由 root 写入)之后,可执行文件本身(sudo)通过询问其密码(或其他配置)来验证用户并决定是否授予以及授予哪些权限。