这更多的是一种好奇,试图了解更多关于linux权限的知识。所以我不明白为什么我能够执行某些命令而不会提示输入密码,但其他命令却不能。我知道 /usr/bin/sudo 有一个 SUID 位,这显然是有意义的。我正在尝试将权限升级到 root,并且想知道是否能够以任何方式使用 /usr/bin/sudo。 (这是在授权机器上,不用担心)
在这里我表明我实际上是大卫
david@traverxec:~/bin$ id
uid=1000(david) gid=1000(david) groups=1000(david),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),109(netdev)
显示 /usr/bin/sudo 的 SUID 位设置以及相关两个二进制文件的权限
david@traverxec:~/bin$ ls -la /usr/bin/sudo
-rwsr-xr-x 1 root root 157192 Oct 12 09:49 /usr/bin/sudo
david@traverxec:~/bin$ ls -la /usr/bin/ls
-rwxr-xr-x 1 root root 138856 Feb 28 2019 /usr/bin/ls
david@traverxec:~/bin$ ls -la /usr/bin/journalctl
-rwxr-xr-x 1 root root 67672 Aug 20 2019 /usr/bin/journalctl
下面显示了使用 sudo 检查网络服务器日志的特定命令完美运行并且不会提示我输入密码!
david@traverxec:~/bin$ /usr/bin/sudo /usr/bin/journalctl -n5 -unostromo.service | /usr/bin/cat
-- Logs begin at Mon 2020-03-02 12:00:21 EST, end at Mon 2020-03-02 12:11:05 EST. --
Mar 02 12:00:44 traverxec su[22169]: pam_unix(su:auth): authentication failure; logname= uid=33 euid=0 tty=pts/0 ruser=www-data rhost= user=david
Mar 02 12:00:46 traverxec su[22169]: FAILED SU (to david) www-data on pts/0
Mar 02 12:07:26 traverxec nhttpd[23957]: /../../../../bin/sh sent a bad cgi header
Mar 02 12:07:38 traverxec nhttpd[24009]: /../../../../bin/sh sent a bad cgi header
当我尝试使用 sudo 运行任何其他命令时系统提示我输入密码
david@traverxec:~/bin$ /usr/bin/sudo /usr/bin/ls /etc/shadow
[sudo] password for david:
为什么是这样?
答案1
正如 Kusalananda 已经提到的,您可以通过配置文件配置 sudo,您可以在其中存档您所描述的行为。
用户无需提供密码即可调用特定命令。这并不意味着您拥有完全sudo
访问权限。您只有运行单个命令的权限。
示例配置:
david ALL=(ALL) NOPASSWD: /usr/bin/journalctl
(更多在https://askubuntu.com/questions/147241/execute-sudo-without-password)
- 即使您有用户“david”的密码,这并不自动意味着您可以使用
sudo
. - 没有用于列出您通过 sudo 获得的权限的命令(无需访问
/etc/sudoers
)。它是通过 sudo 的工作原理来推理的。 Sudo 只是检查您调用命令时的配置 - 并且此过程需要超级用户权限。因此不可能有列出设置的非特权工具。
个人建议:尝试其他方法进行权限升级。如果配置正确,Sudo 是相当安全的。
答案2
sudo
会记住您输入的密码,并且一段时间内不会再次提示(这取决于配置)。
该/etc/sudoers
文件具有sudo
.您可以设置配置:
- 哪些用户
- 哪些命令
- 是否需要密码。
可能是这样设置的,您可以在没有密码的情况下运行某些命令。
这一切都与set-uid 位无关。您似乎知道这一点赋予程序 root 权限(另请参阅功能:root 已死,功能万岁)。人们sudo
可以做任何事情,它根据代码和配置文件决定做什么。