限制使用 `sudo -s`

限制使用 `sudo -s`

我正在我的一些 Linux 服务器上设置 Nagios,遇到了一点问题。该check_ide_smart插件需要系统的 root 访问权限才能运行。要运行它,我使用该check_by_ssh插件通过 ssh 进入远程主机上的 nagios 帐户,然后check_ide_smart使用 sudo 运行。

我最初添加了以下几行以/etc/sudoers使程序能够正常运行:

nagios  ALL=NOPASSWD: /usr/lib/nagios/plugins/check_ide_smart

虽然这在本地运行时工作得很好,但当它从 Nagios 运行时我遇到了一个问题:没有生成 TTY,这阻止了插件工作。

我翻看了 sudo 的手册页,找到了 -s 选项,它会生成一个 shell 并在其中执行程序。当我尝试使用 时sudo -s,我遇到了权限问题,因为 -s 显然将命令更改为/bin/bash -c /usr/lib/nagios/plugins/check_ide_smart,而这是 sudoers 文件不允许的。我尝试更改 sudoers 文件以改用该命令,但没有成功,使用引号是语法错误。

我最终通过使用以下行使它工作/etc/sudoers

nagios ALL=/bin/bash

我觉得这确实不对,因为我允许 nagios 用户生成一个 root shell,他们可以用它来做任何事情。

此时,我想也许通过将命令放在 nagios 用户具有只读权限的 shell 脚本中会起作用,所以我创建了一个 shell 脚本:

#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin $@

不幸的是,我无法让传递的参数($@)与插件正确配合使用,所以我不知道这是否会起作用。 编辑:我需要引用$@才能使其工作。感谢@derobert 和@pjz。我仍然不知道它是否会工作,因为我使用@Mike Arthur 的解决方案使其工作。

有没有一种方法可以让我继续sudo -s工作但又不允许生成 root shell?

回答:

将以下行添加到/etc/sudoers

nagios ALL=NOPASSWD: /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart *

请注意末尾的星号;没有它,这将不起作用。感谢@Mike McQuaid 的回答。

答案1

nagios ALL=NOPASSWD: /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart *

这应该可行并且允许争论。

答案2

仅供参考,您需要在 shell 脚本中引用 $@ 才能使其正常工作:

#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin "$@"

$@很神奇。从 bash 手册页来看,

@扩展为位置参数,从 1 开始。当扩展发生在双引号内时,每个参数都会扩展为一个单独的单词。也就是说,“$@”相当于“$1”“$2”……如果双引号扩展发生在单词内,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的末尾部分连接。当没有位置参数时,“$@”和 $@ 扩展为空(即它们被删除)。

此外,启动 bash 不会生成 pty;不过我很困惑为什么你的 nagios 插件需要终端才能运行。它不应该。也许真正的问题是 sudo 的环境清理?

答案3

无需使用sudo -s并启动 root shell,只需允许您的 nagios 用户使用 sudo 而无需使用 tty 即可!requiretty。您/etc/sudoers应该具有以下内容:

# Allow Nagios extra privs
Defaults:nagios !requiretty
nagios ALL=NOPASSWD: /usr/lib/nagios/plugins/check_ide_plugin

... 这将允许直接 sudo 访问,无需密码,也无需 tty。如果您希望 sudo 访问所有插件,则可以关闭“check_ide_plugin”。

我们还使用 NRPE,它似乎比 check_by_ssh 更安全,但需要更多设置。 /etc/sudoers 中的想法相同,只需将 nagios 替换为 nrpe。:)

~汤米

答案4

我认为不可能使用 -s 而不生成 root shell(假设您需要 root 权限)。-s 选项专门用于生成 shell。这就是 -s 的意思。来自 sudo(8):

-s [command]
    The -s (shell) option runs the shell specified by the SHELL
    environment variable if it is set or the shell as specified
    in passwd(5).  If a command is specified, it is passed to
    the shell for execution.  Otherwise, an interactive shell
    is executed.

相关内容