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



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

-r-------- 1 root root 0 Oct 26 15:53 /proc/user_beancounters
所以我从Nagios Exchange下载了这个脚本: OpenVZ

https://exchange.nagios.org/directory/Plugins/Operating-Systems/*虚拟环境//check-beancounters/细节

在说明中建议:

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 $UBCn";
    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

有什么建议我可以尝试吗?

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@/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的建议,我将我的视觉条目改为:

nagios ALL=NOPASSWD: /usr/lib64/nagios/plugins/check_UBC.pl

希望是相对无害的!

尝试将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从命令行运行没有问题,我不确定它会有什么不同。

将/proc/user_beancounters的权限更改为444(所有人都读)会有什么风险?它只包含一个数字,对吗?不确定该特定文件是否在重新启动后"保留",或者更糟的是,在服务运行时不断被替换,因此这仍然可能是一个问题。

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

最后,您要求打开文件,但语法上它要求以只读模式打开吗?您可能想在shell脚本中尝试一个系统调用来简单地"cat"文件内容,并查看是否得到响应。

相关内容

最新更新