我一直认为“sudo”只是启动另一个登录过程,特别是使用“root”作为用户名并要求输入密码登录。运行某个程序后,它会结束并注销(或:保持打开的会话一段时间然后退出)。不知道我从哪里听说的,但这对我来说似乎是合理的。
但是现在我发现了这个 sudoers 选项:
ALL ALL = (root) NOPASSWD: /my/command
Run Code Online (Sandbox Code Playgroud)
这允许我以 root 身份从任何用户运行任何程序,而无需输入任何密码。这让我想知道:
这是如何运作的?程序如何获得用户权限?sudo 是否需要一个服务器(作为守护进程以 root 身份运行)并连接到该服务器,向它发送应该执行的内容并且该服务器以 root 权限执行它?
其他用户呢?
有什么好的和简单的解释这是如何工作的吗?
And*_*ese 30
sudo
是所谓的“SetUID 二进制文件”,正如您在以下输出中看到的ls -l
:
$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 159016 Mar 21 20:40 /usr/bin/sudo
Run Code Online (Sandbox Code Playgroud)
在s
第四列(其中您通常会找到一个x
对可执行文件)告诉您该setuid位设置。该位有一个重要含义:当执行设置了 SetUID 位的二进制文件时,它不会使用调用用户的用户 ID 运行,而是使用二进制文件所有者的用户 ID(在本例中为root
)。
这就是线索。 sudo
始终以超级用户权限运行(作为root
)。因此sudo
有能力执行一些特权任务,例如调用仅允许root
. 这些系统调用之一(必不可少的)是setuid(2)
和朋友。通过调用setuid()
进程可以将其 UID更改为它想要的任何 UID(从而冒充另一个用户)。
什么sudo
是:
/etc/sudoers
,查找调用用户及其权限,NOPASSWD
)setuid()
更改为目标用户小智 2
简单的答案是二进制文件suid
上的标志sudo
:
ls -l /usr/bin/sudo
---s--x--x. 1 root root 130712 02-26 13:31 /usr/bin/sudo
Run Code Online (Sandbox Code Playgroud)
可执行文件上的标志suid
允许二进制文件运行setuid()
系统调用,无论执行者是谁 - root 用户或非 root 用户。
其余的取决于各个二进制文件的指令和配置。在 的情况下sudo
,它会解析配置文件(通常为/etc/sudoers
)来确定是否继续升级。
在某些文件上,时间戳信息仅限于 root 用户。以下来自示例服务器的示例演示了升级如何sudo
提供时间戳信息:
[artur@asus-ux21e ~]$ sudo ls -l /var/db/sudo/artur
total 12
-rw-------. 1 root artur 48 04-24 14:07 0
-rw-------. 1 root artur 48 04-24 11:27 1
-rw-------. 1 root artur 48 04-24 11:26 2
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12431 次 |
最近记录: |