【发布时间】:2015-10-26 13:10:56
【问题描述】:
我有一个安装了 Nagios 的 VPS,我想使用 Nagios 来监控 /proc/user_beancounters 文件中的 VPS 资源。该文件具有以下权限:
-r-------- 1 root root 0 Oct 26 15:53 /proc/user_beancounters
所以我从 Nagios Exchange 下载了脚本:
在说明中建议:
don’t forget to set the s-bit (chmod +s check_UBC.pl)
所以,我复制了脚本,设置了 s 位,然后以 root 身份从终端运行它。它按预期工作。然后我删除它创建的临时文件,su 进入 nagios 用户,然后运行脚本。它按预期工作。我删除它创建的临时文件,然后启动 Nagios。它无法读取 /proc/user_beancounters 文件!我得到的确切错误是“无法读取 /proc/user_beancounters”。我相信这是 Perl 脚本中的一行抛出的:
if (! open IN, "<", $UBC )
{
print "could not read $UBC\n";
exit $ERRORS{'CRITICAL'};
}
我的操作系统是CentOS release 6.2 (Final)。
我的第一个想法是它是某种 SELinux 巫术,但没有迹象表明 SELinux 正在此服务器上运行。以防万一,我尝试了以下方法:
echo 0 > /selinux/enforce
但这并没有什么不同。
作为参考,这是我正在运行的 nagios 服务:
nagios 12939 0.0 0.0 203652 3404 ? Ssl 15:39 0:00 /usr/sbin/nagios -d /etc/nagios/nagios.cfg
这是我放置 Perl 脚本的地方:
-rwsr-sr-x 1 nagios nagios 2934 Oct 26 15:37 check_UBC.pl
还有什么我可以尝试的建议吗?
如果这应该进入不同的 SE 站点,PS 道歉 - 永远不确定涉及脚本、权限等的问题...
更新 1
我创建了一个 shell 脚本来查看是否可以“模拟”nagios 服务。非常简单:
#!/bin/bash
/usr/lib64/nagios/plugins/check_UBC.pl
现在我拥有以下权限:
-rwsr-sr-x 1 root root 2934 Oct 26 15:37 check_UBC.pl
-rwxrwxrwx 1 root root 51 Oct 26 19:29 check_UBC.sh
作为根:
[root@/usr/lib64/nagios/plugins]$ ./check_UBC.pl
everything is fine..
[root@/usr/lib64/nagios/plugins]$ ./check_UBC.sh
everything is fine..
作为nagios:
-bash-4.1$ ./check_UBC.pl
everything is fine..
-bash-4.1$ ./check_UBC.sh
everything is fine..
所以还是没有头绪……
更新 2
我的nagios命令定义:
define command{
command_name check_beancounters
command_line $USER1$/check_UBC.pl
}
以及服务定义:
define service{
use local-service
host_name localhost
service_description VPS Beancounters
check_command check_beancounters
}
更新 3
我设法让它工作,但我并没有为 nagios 用户提供完全 sudo 访问权限而无需密码。在 /etc/sudoers 我把它放在最后一行:
nagios ALL=(ALL:ALL) NOPASSWD: ALL
然后将我的命令定义更改为:
define command{
command_name check_beancounters
command_line sudo $USER1$/check_UBC.pl
}
显然,最新版本的 linux 在运行解释脚本时不会尊重 +s 权限,只有二进制文件。所以我想我必须为脚本编译一个二进制包装器?
更新 4
根据 Joe Young 的建议,我将 visudo 条目更改为:
nagios ALL=NOPASSWD: /usr/lib64/nagios/plugins/check_UBC.pl
希望相对无害!
【问题讨论】:
-
我发现在基于 RedHat 的 Linux 发行版的更高版本中,我一直致力于设置 UID -- 's' -- 位不再让脚本或程序像根。我会联系 Nagios 公告板,除非这是一个商业产品,并且您正在为支持付费。例如,我想要一个 shell 脚本在 /var/lib 中创建一个文件,因为我们的支付网站会在那里查看是否存在支付“锁定”文件。当我们也不想要付款时,它会阻止付款。 unix.stackexchange.com/questions/364/…
-
奇怪的是,当我“su - nagios”然后自己运行脚本时,它运行良好。当 nagios 服务运行脚本时,它会失败。我在某处读到了有关禁用“requiretty”的信息-可能与此有关吗?
-
那么看来 SUID nagios 可能会起作用。
-
如果你不想让nagios访问
ALL,你可以把最后的ALL替换成你的脚本路径。