$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 136808 Jul 4 2017 /usr/bin/sudo
sosudo
可由任何用户运行,并且任何运行的用户都sudo
将 root 作为进程的有效用户 ID,因为设置了 set-user-id 位/usr/bin/sudo
。
来自https://unix.stackexchange.com/a/11287/674
sudo 和 su 之间最明显的区别是sudo 需要用户的密码,而 su 需要 root 的密码。
需要哪个用户的密码
sudo
?是进程的真实用户ID所代表的用户吗?如果是,是否任何用户都可以通过运行
sudo
然后提供自己的密码来获得超级用户权限?Linux可以限制某些用户吗?开始执行后询问
sudo
密码是否正确?execve()
main()
/usr/bin/sudo
既然进程的euid已经改成root了(因为设置了/usr/bin/sudo的set-user-id位),以后sudo要密码又有什么意义呢?
谢谢。
我已阅读https://unix.stackexchange.com/a/80350/674,但它没有回答上述问题。
在其最常见的配置中,
sudo
要求输入运行sudo
用户的密码(如您所说,该用户对应于进程的真实用户 ID)。的重点sudo
是授予特定用户额外的权限(由 中的配置确定sudoers
),而这些用户无需提供除他们自己之外的任何其他身份验证。但是,sudo
确实会检查运行的用户是否sudo
真的是他们声称的身份,并且它通过询问他们的密码(或为 设置的任何身份验证机制sudo
,通常使用 PAM 来做到这一点 - 所以这可能涉及指纹或两个因素认证等)。sudo
不一定授予成为root的权利,它可以授予各种特权。任何被允许成为 root 的用户sudoers
都可以只使用他们自己的身份验证来做到这一点;但是用户不允许,不能(至少,不能使用sudo
)。这不是由 Linux 本身强制执行的,而是由sudo
(及其身份验证设置)强制执行的。sudo
确实在它开始运行后要求输入密码;它不能做其他事情(即在它开始运行之前它不能做任何事情)。询问密码的sudo
目的,即使它是 root,也是为了验证运行用户的身份(在其典型配置中)。sudo
通常会询问运行它的用户的密码,尽管可以配置:设置
rootpw
一直sudo
要求输入root的密码,targetpw
要求输入用户的密码,sudo
最终将程序运行为as,并runaspw
要求输入用户的密码runas_default
。这样的
sudo
二进制设置确实可以由任何用户以 root 权限启动。假设sudo
其身份验证代码没有任何错误,这本身并不重要。有点类似,任何进程也可以在内核模式下执行代码,方法是调用任何系统调用,比如
open()
. (这与 root 的用户空间代码不同。)只要内核没有错误,它们就无法运行任意代码。从 的第一行开始
man sudo
:所以:
是的,任何(允许的)用户都可以通过运行 sudo 然后提供所需的(配置的)身份验证来获得超级用户(或其他)额外权限。允许和配置都在 sudoers 文件中设置。
Linux可以限制某些用户吗?
是的,它可以,但它不能。Linux 设置为允许 sudo 二进制文件根据 sudo 程序和文件内部的一组规则(安全策略)做出决定
/etc/sudoers
。通常,可以使用其他文件(也/代替)。来自
man setresuid
:获得内核授予的超级用户权限的唯一方法是运行程序 suid。否则不能。这是 Linux 选择授予超级用户权限的方式。
在内核加载了一个不能被任何其他用户修改的可执行文件(文件和目录由 root 拥有并且只能由 root 写入)之后,可执行文件本身(sudo)通过询问用户的密码(或配置的其他内容)来验证用户并决定是否授予以及授予哪些权限。
除了其他关于
sudo
:su
让您有效地成为不同的用户。在我自己的计算机上,我不会以管理员身份运行日常使用——这意味着,除其他外,我不能(直接)使用sudo
. 如果我确实想使用sudo
,我可以使用su
“成为”管理员用户,然后在该角色中使用sudo
. 在那种情况下,我最终输入了两次管理员帐户的密码——一次是在我运行时su
,一次是在我运行时sudo
。