允许 nagios 插件 check_dhcp 在没有 setuid root 的情况下工作

允许 nagios 插件 check_dhcp 在没有 setuid root 的情况下工作

Nagios 有一个插件,check_dhcp,正如您所想的那样。普遍认为安装它 setuid root,因为它用途SO_BINDTODEVICE,通常只有 root 才能执行此操作。当然,sudo也可以使用 完成类似操作,但这样做check_dhcp会以整个 root 权限执行,而实际上并不需要这些权限。

不幸的是,check_dhcp对于这种用法来说,它似乎写得相当愚蠢,在完成需要做的事情后,它并没有尝试放弃 root 权限。这导致至少一个已知的安全问题, 只是一般都是不好的做法我不想这么做。

所以我想知道,有没有办法可以让它check_dhcp执行必要的网络接口扫描,而无需直接授予它所有 root 权限?也许是一些具有功能的东西,SELinux、AppArmor 或类似的东西?正在寻找 Linux 解决方案——特别是 Ubuntu 14.04。

答案1

SO_BINDTODEVICE需要CAP_NET_RAWcheck_dhcp还想绑定到端口 68,这需要CAP_NET_BIND_SERVICE。请参阅功能(7)了解可用功能的详细描述。

可以将这两个功能授予可执行文件,方法是setcap, 像这样:

setcap 'cap_net_raw,cap_net_bind_service=+ep' /usr/lib/nagios/plugins/check_dhcp

这应该允许任何用户成功运行check_dhcp,而可能无需(如果他们可以利用check_dhcp)授予他们完全的 root 权限。

该插件仍然会(相当愚蠢地)发出警告:

$ ./check_dhcp 
Warning: This plugin must be either run as root or setuid root.
To run as root, you can use a tool like sudo.
To set the setuid permissions, use the command:
    chmod u+s yourpluginfile
OK: Received 2 DHCPOFFER(s), max lease time = 259200 sec.

为了解决这个问题,你可以:

  • 忽略它。Nagios 仍将查看退出状态以获取插件状态。
  • 去除拨电至np_warn_if_not_root并重新编译。
  • 使用监控插件网站Nagios 插件的分支,具有解决了这个问题debmon.org有可用的 Debian 软件包。
  • 修改 Nagios 命令定义以通过 grep 运行插件,从而删除警告。当然,您现在必须注意不要更改插件的退出代码,因此您可能需要将其包装在脚本中:
#!/bin/bash
/usr/lib/nagios3/plugins/check_dhcp | egrep -v 'run as root|^To |chmod u\+s'
exit "${PIPESTATUS[0]}"

答案2

对于大多数标准(用 C 编写)插件,Nagios Exchange 上都有替代(非 C)实现。

例如,有一个 perl check_dhcp这实际上只是一个包装器dhcping。当然,dhcping 二进制文件也需要通过 root/sudo/setuid-root 运行,但对于您来说,该二进制文件的安全隐患可能比常规 check_dhcp 插件要小。

相关内容