安全使用旧版 visudo sudoers 的正确方法是什么?

安全使用旧版 visudo sudoers 的正确方法是什么?

我想以另一个非登录用户的身份运行一个脚本,如下所示:

/srv/system/check_alerts.sh <NAME>

有 1 个仅包含大写字母的参数并且可变长度。因为 Visudo 已经过时并且不允许 extglob - 所以我不能允许可变长度参数。

我尝试将其添加到 sudoers 中:

alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [a-z][a-z][a-z][a-z][a-z]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [a-z][a-z][a-z][a-z]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [a-z][a-z][a-z]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [a-z][a-z]

alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [upper][upper][upper][upper][upper]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [upper][upper][upper][upper]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [upper][upper][upper]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [upper][upper]

然后运行测试:

sudo -u alerter bash

和:

bash-4.2$ sudo -u gmail /srv/system/check_alerts.sh TEST

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.

[sudo] password for alerter:

这仍然令人烦恼地提示输入密码。为什么 ?

我不想对任意参数使用常见的“*”通配符。这不是一个选项,因为它允许使用“&”之类的东西进行子 shell。

那么如何正确执行此操作以允许可变长度参数并避免不安全的“*”?是否有至少一种工作方式,不会受到密码提示的困扰?

编辑:暂时添加了这个:

alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh *

到 visudo ,它仍然要求输入密码并且不尊重 NOPASSWD 选项。

调试:我运行:visudo -f /etc/sudoers.d/alerter

并添加了这一行:

alerter ALL=(gmail) NOPASSWD: ALL

之后,在“alerter”bash shell 中我运行:

bash-4.2$ sudo -u gmail /srv/system/check_alerts.sh TEST
gmail is not in the sudoers file.  This incident will be reported.

“sudo -l”的输出:

User alerter may run the following commands on test-host:
(ALL) NOPASSWD: /usr/bin/mailq
(gmail) NOPASSWD: ALL

更新:

不确定这是否重要,但用户“alerter”和“gmail”都属于一个组“mycompany”。

更新2:

我按照建议从“check_alerts.sh”脚本中删除了“sudo”。当我有以下命令时,命令工作正常:

alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh *

- 无需密码提示即可正常工作。

现在已经在 /etc/sudoers.d/alerter 中配置:

alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [[\:upper\:]][[\:upper\:]][[\:upper\:]][[\:upper\:]][[\:upper\:]]

这很好用。感谢所有参与调查的人!

相关内容