从进程调用时,Perl脚本无法打开root拥有的文件(Nagios)

时间:2015-10-26 13:10:56

标签: linux perl nagios

我安装了Nagios VPS,我想使用Nagios来监控 / proc / user_beancounters 文件中的VPS资源。该文件具有以下权限:

-r-------- 1 root root 0 Oct 26 15:53 /proc/user_beancounters

所以我从Nagios Exchange下载了脚本:

https://exchange.nagios.org/directory/Plugins/Operating-Systems/*-Virtual-Environments/OpenVZ/check-beancounters/details

在其建议的说明中:

don’t forget to set the s-bit (chmod +s check_UBC.pl)

所以,我复制了脚本,并设置了s-bit,然后以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 6.2版(最终版)

我的第一个想法是它是某种SELinux voodoo,但没有迹象表明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

有关我还能尝试什么的任何建议吗?

PS道歉,如果这应该在不同的SE站点 - 从不确定涉及脚本,权限等的问题......

更新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身份:

[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

希望相对无害!

2 个答案:

答案 0 :(得分:1)

尝试将check_UBC.pl的所有者更改为root,以便当nagios执行check_UBC.pl时,该脚本将作为其所有者root的setuid运行而不是nagios用户。

chown root:root check_UBC.pl

编辑:

您可以发布调用check_UBC.pl的命令定义吗?

我能想到的最后一件事就是安装perl-suid模块:https://chrisjean.com/fix-setuid-cannot-exec-sperl/ 虽然,如果check_UBC.pl从命令行运行没有问题,我不确定它会有什么不同。

答案 1 :(得分:0)

将/ proc / user_beancounters的权限更改为444(全部读取?)的风险是什么?它只包含一个数字,对吗?不确定该特定文件是否在重启后“粘附”,或者更糟糕的是,在服务运行时不断更换,所以这可能仍然是一个问题。

另外,在尝试从中读取之前,请考虑尝试测试文件的实际“存在”。由于我们在/ proc目录中,事情确实会不时发生变化......

最后,您要求打开文件,但从语法上讲是要求以只读模式打开?您可能希望尝试系统调用,在shell脚本中简单地“捕获”文件内容,并查看是否收到响应。