【问题标题】:Perl script can't open file owned by root when called from process (Nagios)从进程(Nagios)调用时,Perl 脚本无法打开 root 拥有的文件
【发布时间】: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 下载了脚本:

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 位,然后以 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替换成你的脚本路径。

标签: linux perl nagios


【解决方案1】:

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

chown root:root check_UBC.pl

编辑:

您能否发布调用check_UBC.pl 的命令定义?

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

【讨论】:

  • 感谢您的建议 - 但没有帮助。还有什么我可以尝试的吗?也许我可以取消 +s 权限,将 nagios 添加到 sudoers 列表中,然后用“sudo ./myscript”调用脚本?这行得通吗?
  • 更新了命令和服务定义。当我第一次尝试运行它时,它失败了,因为我没有 perl-suid,所以我已经安装了它。我安装后没有配置任何东西,所以如果默认设置不起作用,那么这可能是问题
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多