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

Nagios有一个插件, check_dhcp ,完全符合你的想法。 普遍build议安装它setuid根,因为它使用SO_BINDTODEVICE ,通常只有root可以做。 当然类似的事情也可以用sudo来完成,但是check_dhcp在不需要它们的时候会以整个root权限执行。

不幸的是, check_dhcp似乎被这个用法写得相当愚蠢,并且在做它需要做的事情之后,并没有试图删除root权限。 这导致至less一个已知的安全问题 ,但通常是不好的做法 ,我不想这样做。

所以我想知道,是否有某种方式可以启用check_dhcp做必要的networking接口frobbing,而不会完全授予它所有的root权限? 也许有一些function,SELinux,AppArmor或类似的东西? 寻找一个Linux解决scheme – 特别是Ubuntu 14.04。

SO_BINDTODEVICE需要CAP_NET_RAWcheck_dhcp也希望绑定到端口68,这需要CAP_NET_BIND_SERVICE 。 有关可用function的详细说明,请参阅function(7) 。

这两个function可以用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插件的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]}" 

在大多数标准(用C语言编写的)插件中,Nagios Exchange上有替代(而不是C)实现。

例如, 有一个perl check_dhcp实际上只是一个包装器。 当然,dhcping二进制文件也需要通过root / sudo / setuid-root运行,但是也许这个二进制文件对于你来说比库存check_dhcp插件更不安全。