我一直认为"sudo“只是启动另一个登录过程,特别是使用"root”作为用户名,并请求登录密码。在运行某个程序之后,它将结束并注销(或:将打开的会话保持一段时间,然后退出)。不知道我是从哪里听说的,但这对我来说是合理的。
但现在我发现了这个行尸走肉的人:
ALL ALL = (root) NOPASSWD: /my/command
这允许我在不询问任何密码的情况下,从任何用户处运行任何程序。这让我纳闷:
这是如何工作的呢?程序如何获得用户权限?sudo是否需要一个服务器(以守护进程的身份运行)并连接到该服务器,发送应该执行的内容,而该服务器以根权限执行它?
其他用户呢?
有没有任何好的和简单的解释这是如何运作的?
发布于 2014-04-28 06:28:45
sudo
是一个所谓的"SetUID二进制“,可以在ls -l
的输出中看到:
$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 159016 Mar 21 20:40 /usr/bin/sudo
第四列中的s
(通常在可执行文件上找到x
)告诉您设置了SetUID位。此位有一个重要的含义:当执行具有SetUID位集的二进制时,它不使用调用用户的用户ID,而是使用二进制的所有者的用户ID (在本例中为root
)。
这就是线索。sudo
总是以超级用户权限(如root
)运行。因此,sudo
能够执行一些特权任务,比如调用只允许root
的系统函数。其中一个系统调用(基本的)是setuid(2)
和朋友。通过调用setuid()
,进程可以将其UID更改为它想要的任何UID (从而模拟另一个用户)。
sudo
所做的是:
/etc/sudoers
,查找调用用户及其权限,NOPASSWD
那样跳过)setuid()
以更改为目标用户发布于 2014-04-28 06:27:51
简单的答案是suid
二进制文件上的sudo
标志:
ls -l /usr/bin/sudo
---s--x--x. 1 root root 130712 02-26 13:31 /usr/bin/sudo
可执行文件上的suid
标志允许二进制程序运行setuid()
系统调用,无论执行者是谁- root用户还是非根用户。
其余的则取决于各个二进制程序的指令和配置。对于sudo
,它解析一个配置文件(通常是/etc/sudoers
),以确定是否继续升级。
在某些文件中,时间戳信息仅限于根用户。示例服务器中的以下示例演示如何从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
https://unix.stackexchange.com/questions/126914
复制相似问题