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_RAW 。 check_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.
为了解决这个问题,你可以:
np_warn_if_not_root的调用并重新编译。 #!/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插件更不安全。