防止sudo在运行非许可命令时提示输入密码


15

我已授予组权限,以通过sudo运行没有密码的某些命令。当其中一个用户输入错误或运行错误命令时,系统会提示他们输入密码,然后他们将收到错误消息。这会使用户感到困惑,因此我只想显示一个错误,而不是提示他们输入密码。这可能吗?

这是我的sudoers文件的示例:

%mygroup ALL=(ALL) NOPASSWD:/usr/local/bin/myscript.sh *

他们运行错误脚本时的示例:

# sudo /usr/local/bin/otherscript.sh
[sudo] password for user:
Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>.

所需的输出:

Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>. Please check the command and try again.

注意缺少密码提示。

我的谷歌福失败了我,只有在当用户不要求输入密码返回的结果允许运行的命令。


8
如果可能的话,它可能会打开一个(小)安全孔。如果您已退出登录并且我“借用”了键盘,sudo那么在不输入密码的情况下看不到允许您执行的命令。有了您想要的功能,我可以获得有关特定命令的信息。
基思·汤普森

4
这是一个很大的安全性问题。您不应将sudo与脚本一起用作命令。人们可以只编辑脚本并运行他们想要从审计中完全屏蔽它的内容。而是在脚本内添加对sudo的调用。
coteyr

1
sudo如果用户具有对这些文件的写访问权,则@coteyr与运行二进制文件同样是一个大问题。
德米特里·格里戈里耶夫

1
@CarlWitthoft,这就是为什么您使用绝对路径在sudoers中指定允许的程序的原因。
德米特里·格里戈里耶夫

1
@DmitryGrigoryev,是的,但是如果您仅使用一个文件使用sed或类似文件,那么sudo没有任何好处。允许用户修改文件是文件具有权限的原因。您不必重新发明轮子。如果您希望用户能够修改文件,请允许他们。没有必要,也不需要使用sudo跳过箍,以允许用户无需密码即可修改文件。您总是可以允许他们这样做。适合正确工作的正确工具。
coteyr

Answers:


25

快速阅读 sudo(8)

   -n          The -n (non-interactive) option prevents sudo from
               prompting the user for a password.  If a password is
               required for the command to run, sudo will display an error
               message and exit.

对于怀疑者:

# grep jdoe /etc/sudoers
jdoe    ALL=(ALL) NOPASSWD: /bin/echo
#

如此测试:

% sudo echo allowed
allowed
% sudo -n ed             
sudo: a password is required
% sudo ed               

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

Password:

因此aliassudo对于这些人来说,这样做可能会成功,以防止出现密码提示。现在为什么需要自定义编译sudo,我不知道,我只是阅读了手册。


确实。我将alias sudo="$(which sudo) -n"在/ etc / bashrc中放入类似内容,然后根据需要使用sudo(调整后的行为)或command sudo(默认行为)。
CVn

7

对我有用的一件事(Sudo版本1.8.17p1)但仅满足您的部分问题,是将密码尝试次数设置为0。

Defaults:%mygroup passwd_tries = 0

当尝试任何要求输入密码的命令时,这会使sudo以代码1退出。但是,它不会产生任何类型的错误消息。


这也是一个有效的答案,但是缺少错误消息可能会造成混淆。上面答案的正确但意外的错误也令人困惑。我猜是折腾了。感谢您提供替代答案,始终感谢您的选择!
user184982 '16

2

你不能。

在通过身份验证之前,无法告诉您您是谁,并且默认情况下,没有密码就无法进行身份验证。

您可以更改身份验证以使用USB密钥,指纹扫描仪,语音身份验证,面部识别或其他许多功能,但是要点是相同的。

你不能鉴别,有鉴别出来你之前认证须藤没有业务,告诉你,你可以或不能运行什么。


2
当您运行sudo时输入密码不是标识(“告诉您是谁”)。须藤知道你是谁。输入密码即表示状态确认。
吉尔斯(Gilles)'所以

我认为在场确认为“身份验证”。如身份验证,然后授权。
coteyr

2
答案是“认证”而不是“身份”。尽管sudo确实知道自己是谁,但根据在该终端上登录的用户,它不会知道您直到您验证了该身份。
Dave Sherohman '16

2

@StrongBad发表的评论值得回答:

我认为最好的解决方案是编写一个始终sudo使用正确参数调用的包装器脚本。(包括-n

包装脚本可以进行参数解析等操作,以使被调用的sudo脚本尽可能小,从而减少错误的发生。


1

这是不可能的。唯一的方法是更改​​源代码并编译自己的sudo


您是对的,但我认为我不会获得在所有生产服务器上加载自定义版本sudo的许可。哈
user184982
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.