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

Phi*_*ost 4 linux permissions nagios suid

Nagios 有一个插件,check_dhcp它完全符合您的想法。它的广泛建议进行安装setuid root的,因为它使用了SO_BINDTODEVICE,通常只有root可以做到。当然也可以完成类似的事情sudo,但它仍然check_dhcp会在不需要 root 权限时以整个 root 权限执行。

不幸的是,check_dhcp似乎为这种用法编写的相当愚蠢,并且在完成需要执行的操作后并没有尝试删除 root 权限。这至少会导致一个已知的安全问题,但通常是不好的做法,我不想这样做。

所以我想知道,有没有什么方法可以使我能够check_dhcp执行其必要的网络接口 frobbing,而无需完全授予它所有 root 权限?也许是一些具有功能的东西,SELinux、AppArmor 或类似的东西?正在寻找 Linux 解决方案——尤其是 Ubuntu 14.04。

Phi*_*ost 10

SO_BINDTODEVICE需要CAP_NET_RAW. check_dhcp还想绑定到端口 68,这需要CAP_NET_BIND_SERVICE. 有关可用功能的详细说明,请参阅功能 (7)

这两个功能可以通过 授予可执行文件setcap,如下所示:

setcap 'cap_net_raw,cap_net_bind_service=+ep' /usr/lib/nagios/plugins/check_dhcp
Run Code Online (Sandbox Code Playgroud)

这应该允许任何用户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.
Run Code Online (Sandbox Code Playgroud)

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

  • 忽略它。Nagios 仍会查看退出状态以获取插件状态。
  • 删除调用np_warn_if_not_root并重新编译。
  • 使用Nagios 插件的monitoring-plugins.org分支,它已修复此问题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]}"
Run Code Online (Sandbox Code Playgroud)